абстрактная активность приводит к тому, что findViewById() не работает

#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 , это завершается неудачей, но вы не можете точно определить это.