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);
}
}
Когда я делаю это в классе основной активности, он работает, но он не работает не в другом классе.
Ответы
Ответ 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
, и их следует использовать только в качестве замены, если вы точно понимаете, как они работают. Чаще всего гораздо эффективнее всего ждать, пока уже не произошел первоначальный макет.