kostya_bakay
@kostya_bakay
Android Developer

Почему public переменную не видно в другом классе?

У меня есть класс MainActivity и я делал в нем внутренний класс, чтобы использовать AsyncTask. Я решил раскидать эти классы в разные пакеты. Но после этого в классе для AsyncTask перестало видеть мои переменные, хотя они глобальные и public. Ну к примеру:
В классе MainActivity у меня есть поле перед всеми методами
public boolean isNavigationDrawerItemEnabled = false;

В моем AsyncTask в другом пакете здесь эту переменную уже никак не видит
@Override
    protected void onPreExecute() {
        super.onPreExecute();

        if (!isNavigationDrawerItemEnabled) {
            progressDialog = new ProgressDialog(MainActivity.this);
            progressDialog.setTitle("Новые");
            progressDialog.setMessage("Загрузка...");
            progressDialog.setIndeterminate(false);
            progressDialog.show();
        }
    }

Вроде бы банальщина, но я почему-то затупил. Можете подсказать?
  • Вопрос задан
  • 2248 просмотров
Решения вопроса 3
saboteur_kiev
@saboteur_kiev
build engineer
Глобальных переменных нет, нужно обращаться через ссылку на экземпляр класса, или на сам класс, если статическая переменная. Пример с экземпляром класса:
package p1

public class one {
 public boolean MyVar;
}


package p2
import p1.one

public class main{

class_one = new one();
class_one.myVar=true;
}
Ответ написан
artemgapchenko
@artemgapchenko
Верните свой AsyncTask назад внутрь MainActivity, если хотите пользоваться его [MainActivity] полями. Раньше ваш код работал потому, что при компиляции во внутренние классы добавляется ссылка на instance внешнего класса. Через эту ссылку и осуществляется доступ к полям внешнего класса.
После того как AsyncTask перестал быть внутренним классом, ссылка на внешний класс, понятное дело, из него исчезла, поэтому он и не может теперь обращаться к полям объекта внешнего класса. Порождать новый instance MainActivity через оператор new, чтобы получить доступ к его полям, как советовали выше - не вариант, компоненты в Андроиде порождаются самой операционной системой.
Ответ написан
EugeneP2
@EugeneP2
Java Dev
что бы получить доступ к паблик переменной нужна ссылка на объект класса в котором она находится.

т.е.
MainActivity ma = new MainActivity();

ma.isNavigationDrawerItemEnabled; // только так

И у каждого объекта MainActivity будит своя переменная isNavigationDrawerItemEnabled.

Если хотите чтоб она была одна, тогда сделайте её статической

public static boolean isNavigationDrawerItemEnabled = false;

Тогда доступ можно будит получить через имя класса

MainActivity.isNavigationDrawerItemEnabled
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Sirikid
Выше все уже объяснили, но сделаю небольшое дополнение, не начинайте имя переменной с is, это префикс для boolean/Boolean геттеров.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
Sports.ru Москва
До 175 000 руб.
KUPIBILET.RU Санкт-Петербург
от 100 000 руб.
Frogogo Москва
от 70 000 руб.
10 дек. 2018, в 09:49
3000 руб./за проект
10 дек. 2018, в 09:38
1000 руб./за проект
10 дек. 2018, в 09:04
300 руб./в час