findViewById () не работает в не MainActivity классе - PullRequest
22 голосов
/ 10 февраля 2012

У меня есть текстовое представление в моем 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);
    }
}

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

Ответы [ 4 ]

37 голосов
/ 10 февраля 2012

Вызов 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 ... 
  }
}
6 голосов
/ 10 февраля 2012

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


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

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


    }


}
5 голосов
/ 10 февраля 2012
findViewById(R.id.EmailTextView);

Вы либо

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

РЕДАКТИРОВАТЬ: определенно 1 на основе ваших новых комментариев.

4 голосов
/ 10 февраля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...