Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Вызов 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 ... 
  }
}

Ответ 2

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


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

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


    }


}

Ответ 3

findViewById(R.id.EmailTextView);

Вы либо

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

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

Ответ 4

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

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