#java #android
#java #Android
Вопрос:
У меня есть аннотация Activity
, поскольку большинство моих действий используют одно и то же меню:
public abstract class ActivityBase extends Activity {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menubar, menu);
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
//...
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//...
}
}
Теперь, когда я использую этот класс (наследую от него), findViewById()
метод больше не работает. Не имеет значения, если я даже наследую от него в этом конкретном классе, как только он находится где-то в дереве наследования, он больше не работает. Например:
public class SomeOther extends ActivityBase {
}
public class Home extends Activity {
@Override
public void onCreate (Bundle savedInstance) {
super.onCreate(savedInstance);
setContentView(R.layout.main);
Button b = (Button)findViewById(R.id.button); // fails, NullPointerException
}
Что может быть причиной этого и, что еще более важно, как я могу это исправить?
Комментарии:
1. как происходит сбой? кнопка равна нулю или что? исключение castexception? вставьте logcat
2. кнопка в том же main.xml файл?
3. ДА. Это работало до того, как я представил
ActivityBase
класс.
Ответ №1:
В моем случае это работает идеально (попробуйте это)…
public abstract class ActivityBase extends Activity {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
//..
return true;
}
}
и
public class MyActActivity extends ActivityBase {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.e("HI", "Hello");
TextView tv=(TextView)findViewById(R.id.Settings_phoneNumbersT1);
Log.e("HI", tv.toString());
}
}
и main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:id="@ id/Settings_phoneNumbersT1"
android:textSize="14sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ffffff" android:text="Hellofffff"/>
</LinearLayout>
Итак, я не думаю, что это проблема абстрактного класса ActivityBase.
Комментарии:
1. Извините, я забыл это в своем образце. Я позвонил
setContentView(...)
, конечно.2. да, теперь это работает и у меня. Причина была где-то в другом месте и просто проявилась там.
3. Я могу принять свой собственный ответ только через два дня. Хотя я ценю вашу помощь, на самом деле это не было решением. Проголосовали, однако, за помощь.
Ответ №2:
попробуйте это…
Button b = (Button)Home.this.findViewById(R.id.button);
это делается для того, чтобы убедиться, что вызывается findViewById вашего текущего класса, а не суперкласса..
Ответ №3:
NullPointerException
Была вызвана где-то в другом месте и просто проявилась с помощью этого метода. Если вы производите из Application
и пытаетесь вызвать getSharedPreferences
, это завершается неудачей, но вы не можете точно определить это.