Я вижу проблему, из-за которой изменение ориентации экрана приводит к сбою разрабатываемого приложения.
Я использую Butterknife для привязок к полю, но когда я меняю ориентацию, я вижу ошибку "Требуется представление" xxxx'с идентификатором xxxxxx для поля' xxxx 'не найден ", что предполагает исходную привязку с момента, когда действие, запущенное в первый раз, было уничтожено.
У меня есть BaseActivity.java:-
public abstract class BaseActivity extends AppCompatActivity {
private static final String TAG = "BaseActivity";
protected Global getGlobal() {
return (Global) getApplicationContext();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
getWindow().setFormat(PixelFormat.TRANSLUCENT);
setContentView(getActivityView());
ButterKnife.bind(this);
}
}
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}
abstract protected int getActivityView();
}
Затем в моем файле MainActivity.java я расширяю вышеуказанный базовый класс следующим образом: -
public class MainActivity extends BaseActivity {
@BindView(R.id.main_menu_toolbar) protected Toolbar main_menu_toolbar;
@BindView(R.id.bottom_bar) protected BottomNavigationView bottom_bar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
BottomNavigationViewHelper.disableShiftMode(bottom_bar);
bottom_bar.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.action_home:
//TODO - reset scroll or pop fragment from stack..
break;
}
return true;
}
});
}
@Override
protected int getActivityView() {
return R.layout.activity_main;
}
}
Ошибка отладки выглядит следующим образом
java.lang.RuntimeException: Unable to start activity ComponentInfo{aero.airborne.demo.qatar/aero.airborne.demo.qatar.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.support.design.widget.BottomNavigationView.getChildAt(int)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2955)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3030)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4919)
at android.app.ActivityThread.-wrap19(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1702)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6938)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.support.design.widget.BottomNavigationView.getChildAt(int)' on a null object reference
at aero.airborne.demo.qatar.helper.BottomNavigationViewHelper.disableShiftMode(BottomNavigationViewHelper.java:11)
at aero.airborne.demo.qatar.MainActivity.onCreate(MainActivity.java:64)
at android.app.Activity.performCreate(Activity.java:7183)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2908)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3030)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4919)
at android.app.ActivityThread.-wrap19(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1702)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6938)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Интересно, если я удалю зависимость базового классав моем MainActivity.java, так что onCreate()
моей MainActivity выполняет setContentView()
сразу после Butterknife.bind()
, это работает.Это наводит на мысль о проблеме синхронизации в моем коде с жизненным циклом Android относительно того, когда Butterknife отменяет привязку для старой ориентации и когда onCreate вызывается vs bind (), но мне пока не удалось заставить его работать с моим базовым классом.
Любая идея или указатели будут оценены в этот момент.