Ошибка привязки ножа для масла после изменения ориентации устройства - PullRequest
0 голосов
/ 20 декабря 2018

Я вижу проблему, из-за которой изменение ориентации экрана приводит к сбою разрабатываемого приложения.

Я использую 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 (), но мне пока не удалось заставить его работать с моим базовым классом.

Любая идея или указатели будут оценены в этот момент.

1 Ответ

0 голосов
/ 20 декабря 2018

Вам все еще нужно связать Butterknife при изменении ориентации.Переместите ButterKnife.bind(this); из оператора if.

...