2013-02-20 3 views
2

У меня есть это в OnCreate:Android Как установить текст в TextView из общедоступного статического метода?

final TextView text1 = (TextView) findViewById(R.id.txtNextAlarm); 

И я пытаюсь установить текст в метод, который находится в том же классе:

public static void NextTxt(){ 
     text1.setText(""); 
} 

Но он не признает «text1 ».

+0

Почему «NextTxt» должен быть статичным? – Simon

+0

@Simon Мне нужно использовать этот метод из другого класса – user1880779

+1

* Если * (и только если), экземпляр класса создается в вашей Деятельности, и вы можете * гарантировать *, что время жизни класса не больше Activity, а затем передайте ссылку на TextView для другого класса. Если вы не можете гарантировать срок службы, вы рискуете серьезной утечкой памяти, так что возвращайтесь и спрашивайте о обратных вызовах. – Simon

ответ

6

Проблема заключается в том, что статические методы не являются связанных с каким-либо конкретным объектом, но с классом в целом. Таким образом, они могут видеть только статические поля в вашем классе. Ваша переменная text1 даже не та, если вы говорите правду. Вместо этого это локальная переменная, которая существует только для длины метода onCreate(). Если вы знаете, вы будете только когда-либо один экземпляр вашей деятельности (и это, вероятно, не является необоснованным предположение), что вы могли бы сделать, это использовать

private static TextView text1; 

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

Альтернатива заключается в том, чтобы спросить себя, почему NextTxt() является статическим; если вы сделаете его обычным методом экземпляра, тогда вам все равно нужно объявить text1 в классе, но не обязательно быть статичным. Но тогда вам понадобится экземпляр, чтобы позвонить ему.

+0

Мне нужно использовать метод NextTxt() в другом классе, и поэтому мне нужно было сделать его статическим? Я вижу, что все скептически относятся к статическим методам и переменным, что является правильным способом, если мне нужно использовать метод в другом классе? – user1880779

+0

Вы сохранили мое время – Thamaraiselvam

+0

Размещение классов контекста Android (EditText, TextView e.t.c) в статических полях - плохая идея, и на него нахмурилась причина, по которой они вызывают ваше приложение на утечку памяти. –

3
TextView text1; 

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     text1 = (TextView) findViewById(R.id.txtNextAlarm); 
} 

Выполнение инициализации в методе onCreate.

0

text1 является local переменной вы должны объявить его как атрибут вашего класса

public final TextView text1; 

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     text1 = (TextView) findViewById(R.id.txtNextAlarm); 
} 

и в вашем статическом использовании метода:

public static void NextTxt(){ 
     text1.setText(""); 
} 
0

Если метод статичен, вы не можете получить доступ к каким-либо нестатическим полям класса. Вы должны сделать свой textField статическим или передать его как параметр.

static TextView text1; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    MyClass.text1 = (TextView) findViewById(R.id.txtNextAlarm); 
} 

public static void NextTxt(){ 
    MyClass.text1.setText(""); 
} 

Конечно, вы можете иметь только один TextField набор в то время, потому что это статическое поле класса. Другие варианты включают в себя создание singleton или удаление статического модификатора из вашего метода NextTxt.

1

Если это правда, что эта линия находится в вашем OnCreate метод

final TextView text1 = (TextView) findViewById(R.id.txtNextAlarm); 

то ответ на ваш вопрос в том, что text1 вне scope из вашего метода NextTxt. Вы объявили и инициализировали переменную в рамках одного метода, и вы пытаетесь получить к ней доступ от другого. Чтобы метод NextTxt «видел» text1, вам нужно переместить этот элемент в место, где оба метода могут получить к нему доступ.

Как уже упоминалось в других ответах, вы также имеете дело с тем, что onCreate - это метод экземпляра, а NextTxt - это статический метод. У вас может возникнуть соблазн начать делать все статичным, чтобы «исправить» ваши проблемы, но это опасный и неряшливый путь. У вас нет контроля над тем, когда Android убивает ваш пользовательский интерфейс, поэтому текст1 может стать недействительным без предупреждения.В следующий раз, когда вы попытаетесь вызвать метод на нем, вам не понравятся результаты.

Перепишите, что вы пытаетесь сделать, в случае необходимости нарисуйте его и не просто применяйте быстрые исправления в Eclipse, если вы не понимаете ошибку.

+0

Мне нужно использовать метод NextTxt() в другом классе, и поэтому мне нужно было сделать его статическим. Я вижу, что все скептически относятся к статическим методам и переменным. Итак, каков правильный способ сделать это, если мне нужно использовать метод в другом классе? – user1880779

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