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();
        }
    }

Вроде бы банальщина, но я почему-то затупил. Можете подсказать?
  • Вопрос задан
  • 2350 просмотров
Решения вопроса 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
Похожие вопросы
UNIQ systems Казань
от 90 000 руб.
Asapp Москва
от 150 000 до 200 000 руб.
BSLab Москва
от 100 000 до 150 000 руб.