findViewById () не работает в классе не MainActivity

20

У меня есть текстовое представление в моем Lyout, и я хотел бы установить некоторый текст в это текстовое представление. Это должно быть сделано в классе, который не является классом MainActivity.

Проблема заключается в том, что я получил исключение с нулевым указателем.

Вот мой код:

public class UserInformations extends Activity{

TextView emailTextView;
LocalDatabase localdatabase= new LocalDatabase(this);


    public void getUserInformation()
    {
    emailTextView = (TextView) findViewById(R.id.EmailTextView);
    String email = localdatabase.getUserEmail();
    emailTextView.setText(email);
    }
}

Когда я делаю это в классе основной активности, он работает, но он не работает не в другом классе.

    
задан Miloš 10.02.2012 в 14:51
источник
  • emailTextView = (TextView) findViewById (R.id.EmailTextView); –  Miloš 10.02.2012 в 14:53
  • Нет, моя база данных находится в другом классе. значение электронной почты хорошее, поэтому я думаю, что проблема связана с foom textView –  Miloš 10.02.2012 в 14:55

4 ответа

33

Вызов findViewById() объекта Activity будет работать только в том случае, если текущий макет действия установлен на setContentView . Если вы добавите макет другими способами, вам понадобится объект View макета и вызовите findViewById() на нем.

View v = inflater.inflate(id_number_of_layout); # such as R.layout.activity_main
View innerView = v.findViewById(id_number_of_view_inside_v);

Если макет должен быть основным макетом активности, сделайте следующее:

public class MyActivity extends Activity{
  TextView emailTextView; 

  @Override
  public void onCreate(Bundle savedInstanceState){
     super.onCreate(savedInstanceState);
     setContentView(id_number_of_layout);
     emailTextView = (TextView) findViewById(R.id.EmailTextView);
     // ... whatever other set up you need to do ...
  }

  public void getUserInformation() {
     // .... regular code ... 
  }
}
    
ответ дан DeeV 10.02.2012 в 14:55
источник
  • Спасибо, DeeV, у меня есть некоторые проблемы, чтобы понять этот код, извините. Итак, в моем основном действии я уже вызывал setcontentview (...), но теперь в своем втором классе, как я могу найти номер Id моего id_number_of_layout и id_number_of_view_inside_v –  Miloš 10.02.2012 в 15:06
  • Вы знаете, что они уже есть. В вашем случае вам нужно получить экземпляр макета, который содержит представление с идентификатором R.id.EmailTextView. Как правило, если вы используете другой класс вне класса Activity, вам необходимо передать представление через метод конструктора или сеттера. Поскольку основной вид уже завышен в вашем основном классе активности, тогда вы, вероятно, захотите вызвать findViewById (R.id.EmailTextView) в этом классе, а затем передать ссылку на объект в текстовом представлении другому классу. –  DeeV 10.02.2012 в 15:13
  • Хорошо, спасибо, много, я сделаю так. –  Miloš 10.02.2012 в 15:24
6

Вы еще не определили содержимое Просмотр?

для этого используйте что-то вроде этого:

public class MainActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


    }


}
    
ответ дан FabianCook 10.02.2012 в 14:53
источник
  • Нет, как это сделать, я работаю в первый раз с представлением контента. –  Miloš 10.02.2012 в 14:54
  • Я отметил выше ^^ –  FabianCook 10.02.2012 в 14:58
  • Я уже это в своем классе MainActivity. –  Miloš 10.02.2012 в 15:01
  • Вы должны включить это в каждое действие. –  Jean-Philippe Roy 10.02.2012 в 15:06
  • Это не решает проблему –  Miloš 10.02.2012 в 15:09
5
findViewById(R.id.EmailTextView);

Вы либо

  1. Не задан макет представления
  2. Нет Просмотр с идентификатором EmailTextView , и таким образом findViewById возвращает null . Вам не нужно указывать тип, но идентификатор, который вы ему дали в XML.

EDIT: определенно 1 на основе ваших новых комментариев.

    
ответ дан m0skit0 10.02.2012 в 14:54
источник
  • Спасибо, но как увидеть макет представления? –  Miloš 10.02.2012 в 15:07
4

Когда вы вызываете findViewById . Макет, должно быть, уже произошел. Вы уже должны установить представление контента и т. Д.

Есть способы обойти это, как показано в других ответах, но они работают принципиально иначе, чем findViewById , и их следует использовать только в качестве замены, если вы точно понимаете, как они работают. Чаще всего гораздо эффективнее подождать, пока уже не начался первоначальный макет.

    
ответ дан Zenexer 10.02.2012 в 14:54
источник