Android - правильная ссылка и обновление виджетов и элементов управления - PullRequest
0 голосов
/ 02 мая 2011

Может ли кто-нибудь объяснить лучший способ достижения следующего, я думаю, что это довольно простой вопрос, но я хотел бы знать лучший способ, так как его можно достичь несколькими различными способами.

Допустим, яхотел класс, который обновил текст TextView до «Test».Конечно, это не моя настоящая проблема, но я пытаюсь сделать этот вопрос максимально простым.Допустим также, что это примет любое текстовое представление.

Класс, который он вызывает, не наследует Activity.

Я вижу следующие способы сделать это, пожалуйста, объясните, почему и почему нет этих методовследует или не следует использовать.

Передайте TextView в качестве ссылки и обновите текст.

public class Test

public void updateText(TextView tv)
{
   tv.setText("Test");
}

Другой вариант - передать действие и вызвать findViewById, нопроблема здесь в том, что если идентификатор не совпадает с ожидаемым классом Test, представление вернет ноль и не обновит TextView.

public class Test

public void updateText(Activity act)
{
   TextView tv = (TextView) act.findViewById(R.id.i_must_exist);
   tv.setText("Test");
}

Другим выбором будет использование getters / setters.

public class Test

private TextView mTvToUpdate;

public void setTextView(TextView tv)
{
    mTvToUpdate = tv;
}

public void updateText(Activity act)
{
    mTvToUpdate.setText("Test");
}

Полагаю, реальный вопрос в том, что неправильно передавать ссылку на объект в качестве параметра. Является ли Activity предпочтительным способом?Зачем?Это более вероятно, чтобы испытать утечки памяти, оба решения в порядке?Это до предпочтения?

Пожалуйста, не отвечайте: «Почему вы хотите это сделать?»как и в этом примере, я, очевидно, не хотел бы делать то, что я спрашиваю, но вопрос, стоящий за ним, по-прежнему применим.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 02 мая 2011

Я бы не стал идти последним путем без веской причины, потому что, когда вы держите ссылку на элемент пользовательского интерфейса, вы можете легче утечь память.Когда вы держите ссылку на виджет, вы также держите ссылку на действие, поэтому вы должны убедиться, что не удерживаете ссылку на виджет, если действие уничтожено (возможно, с помощью WeakReference).Это описано в статье Предотвращение утечек памяти .

Кроме того, реальной разницы нет.

1 голос
/ 02 мая 2011

Объект, который «владеет» текстовым полем, должен быть тем, кто фактически вызывает метод setText. Так что в большинстве случаев это будет деятельность. Кажется, что в этом случае ваш класс Test должен предоставлять только метод, который будет возвращать текст, который вы хотите отобразить в виде строки.

Так что-то вроде

    public class MyActivity extends Activity
    {
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(...);

            Test t = new Test(...);

            String testText = t.getTestString();

            TextView tv = (TextView)findViewById(R.id.TestTextView);
            tv.setText(testText)
        }
    }

    public class Test
    {
        public String getTestString()
        {
            return "Test"; // Probably would be more dynamic in your case.
        }
    }

Это отвлечет знание данных до класса Test. Все, что вам нужно знать, это то, что кто-то другой предоставляет строку данных, и он может установить текст самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...