2015-07-01 4 views
1

Я пытаюсь получить доступ к методу, который изменяет текстовое поле в пользовательском интерфейсе объекта Activity из другого файла Java. В Game.java (обычный файл Java в фоновом режиме) У меня есть некоторые статические переменные, которые со временем меняются. Я хочу, чтобы изменения в этих переменных отражались в реальном пользовательском интерфейсе. Следовательно, я пытаюсь получить доступ к методу «changeName» в DisplayMessageActivity.java, который будет отражать соответствующие изменения (display_message_activity.xml).FindViewById не может ссылаться на статический контекст

Это метод DisplayMessageActivity.java, что я пытаюсь позвонить из Game.java

public void changeName() { 
    TextView text = (TextView) findViewById(R.id.petname); 
    text.setText("" + Game.name); 
} 

Чтобы позвонить DisplayMessageActivity.changeName() из Game.java, я должен изменить его на статический метод.

public static void changeName() { 
    TextView text = (TextView) findViewById(R.id.petname); 
    text.setText("" + Game.name); 
} 

Но делать это дает мне ошибку «не статический метод не может быть доступен из статического контекста» для «findViewByID». Я даже попытался сделать экземпляр DisplayMessageActivity.java в Game.java для доступа к методу «changeName», не делая его статическим. Однако это порождает исключение nullPointerException в TextView text = (TextView) findViewById(R.id.petname);

Как решить эту проблему?

+0

Необходимы ли статические переменные? Не могли бы вы поместить их в POJO и инициализировать их в конструкторе? – CubeJockey

+0

Да, нужны статические переменные. Я не хочу создавать экземпляры Game.java, потому что мне нужно получить доступ к тем же переменным из разных видов деятельности. – Dhruv

+1

Вы можете использовать шаблон дизайна Singleton (http://www.javaworld.com/article/2073352/core- java/simple-singleton.html), это гарантирует, что во всех действиях есть только один экземпляр класса. – CubeJockey

ответ

0

Создайте статическую ссылку на DisplayMessageActivity и инициализируйте ее в onCreate().

public class DisplayMessageActivity { 
DisplayMessageActivity instance; 

    @Override 
    public void onCreate() { 
     ... 
     instance = this; 
     ... 
    } 

} 

Тогда из Game.java вы можете получить доступ к не-статический метод с использованием:

DisplayMessageActivity.instance.changeName(); 

EDIT: Btw, ваш NPE выбрасывают, потому что вы создали новый экземпляр DisplayMessageActivity, который а не тот, который вы на самом деле используете.

Смежные вопросы