Определите MainActivity как статическую переменную для доступа к методу findViewById - PullRequest
0 голосов
/ 13 января 2019

Во время кодирования я хотел использовать метод findViewById, чтобы найти представление, к которому нет доступа в текущем представлении, но к которому можно получить доступ через MainActivity. Итак, два варианта пришли мне на ум. Одним из них является создание статического метода из этого объекта в классе MainActivity и доступ к статическому объекту. Второй метод - создать статический объект из самого класса MainActivity ( this ) и получить доступ к методу findViewById, вызвав статический объект. Пожалуйста, ответьте на метод, который я должен использовать. И кроме того, у меня возникло мнение, что разработчик Android должен столкнуться с этим типом сценария или я сделал какое-то неправильное кодирование для доступа к методу findViewById в MainActivity, когда я был в другом представлении. Вы можете взглянуть на код в репо ниже.

https://github.com/chrish2015/ExpenseTrackerLatest

Спасибо

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Не используйте ни один из ваших двух методов.

Возможно, я неправильно понял ваше первое предложение, но просто чтобы быть уверенным, вы запрашиваете способ доступа к представлению, которое существует в MainActivity, пока вы находитесь внутри фрагмента?

Если это то, что вы спрашиваете, то да, как разработчик Android, определенно будут моменты, когда мы сталкиваемся с этим сценарием. Тем не менее, решение определенно НЕ , сделав ваши Представления или Контекст статическими.

Это один из самых простых способов появления ошибок в вашем приложении, с очень высокой вероятностью также утечки памяти. Вот статья от Google, в которой говорится об утечках памяти, связанных с сохранением ссылки на контекст: https://android -developers.googleblog.com / 2009/01 / avoiding-memory-leaks.html

Вместо двух ваших вариантов, есть лучшие решения, которые обычно используют разработчики.

Прежде всего, имейте в виду, что вы НЕ ДОЛЖНЫ иметь прямой доступ к каким-либо представлениям вне вашего текущего макета ... это означает, что если вы находитесь во втором действии, вы не можете напрямую обращаться к представлениям из первого Активность, или если вы находитесь во Фрагменте, вы не имеете прямого доступа к представлениям, принадлежащим его FragmentActivity.

Вместо этого вы позволяете Activity или Fragment обрабатывать свои собственные представления.

Так, например, если вы находитесь в другом действии и хотите обновить некоторые данные в предыдущем действии, вы можете воспользоваться startActivityForResult() и onActivityResult() действия, чтобы получить данные, необходимые для немедленного обновления действия по возвращении в приложение.

Для фрагментов, на самом деле есть учебник из документации Android, который описывает очень хороший способ связи между другими фрагментами: https://developer.android.com/training/basics/fragments/communicating

Этот метод заключается в использовании интерфейсов в качестве обратных вызовов, поэтому другой Фрагмент или Действие смогут получать данные и обновлять свои представления в своем собственном макете .

Так что для вашего случая, если вы используете Фрагменты и Действия, вы можете легко сделать так, чтобы ваши фрагменты и действия общались друг с другом более безопасным и более надежным способом.

Кроме того, убедитесь, что вы читаете больше о static, и это влияет на ваш код, особенно побочные эффекты на компоненты Android. Не используйте небрежно статические без учета некоторых эффектов, которые они могут вызвать, потому что это может вызвать бесконечные проблемы в вашем коде.

0 голосов
/ 13 января 2019

Если вы находитесь внутри класса, который не является ни Context, ни Activity, и вам нужно использовать метод, который существует внутри действия или контекста, то просто передайте действие в качестве параметра этому классу и возьмите экземпляр этого действия в вашем классе.

public class MyAdapter extends ArrayAdapter { // this is not activity
    private Activity mActivity; // activity is a member of this class.

    public MyAdapter(Activity activity, List<String> data) {
        mActivity = activity;
    }

    public View getView(...) {
        // if you need to use findViewById: 
        View view = mActivity.findViewById(R.id.some_id);
    }

}
...