Подтвердить что ты не робот

SavedInstanceState всегда имеет значение null, но onSaveInstanceState() всегда называется

Прежде всего я новичок в Android - этот вопрос может показаться глупым:)

Я создал основное действие, которое содержит ViewPager. ViewPager связан с моими вкладками ActionBar. В настоящее время моя основная деятельность содержит 3 вкладки таким образом.

Моя проблема заключается в следующем: когда я на третьей вкладке и создаю новое действие, а затем вернусь к своей основной деятельности, я всегда возвращаюсь к своей первой вкладке.

Я пробовал следующий подход в своей основной деятельности:

// debugger breakpoints tell me this method is always called when other activity is shown ...
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    int pos = getActionBar().getSelectedNavigationIndex();
    outState.putInt("tab", pos);
}

// however, in onCreate() my savedInstanceState is always 'null' ...
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    this.invalidateOptionsMenu();

    setContentView(R.layout.activity_main);

    final ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    mSectionsPagerAdapter = new SectionsPagerAdapter(
            getSupportFragmentManager());

    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setAdapter(mSectionsPagerAdapter);

    mViewPager
            .setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
                @Override
                public void onPageSelected(int position) {
                    actionBar.setSelectedNavigationItem(position);
                }
            });

    for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
        actionBar.addTab(actionBar.newTab()
                .setText(mSectionsPagerAdapter.getPageTitle(i))
                .setTabListener(this));
    }

    // trying to restore state here, yet savedInstanceState is _always_ null ...
    if (savedInstanceState != null) {
        actionBar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
    }
}

Я прочитал, что имя saveInstanceState всегда будет равно null, если идентификатор не определен. В моем XML-макете определен идентификатор, поэтому это не должно быть проблемой. Я также прочитал, что метод onSaveInstanceState() всегда должен сначала вызвать метод в суперклассе, поэтому я внедрил этот метод соответствующим образом.

Кто-нибудь знает, как исправить мою проблему? Как заставить ViewPager отображать правильную вкладку/фрагмент при воссоздании основной активности?

4b9b3361

Ответ 1

Спасибо, она улыбнулась, ваши предложения помогли мне решить мою проблему, потому что это помогло мне найти источник моей проблемы.

По-видимому, onCreate() мог иметь только параметр savedInstanceState, когда активность была полностью уничтожена и воссоздана. В моем случае активность все еще существовала, поэтому у меня не будет параметра savedInstanceState. Моим "исправлением" было создание статического int, содержащего выбранный индекс вкладки. Я понимаю, что это может быть не лучшее решение, так как эта переменная будет разделяться во всех экземплярах Activity, но поскольку в моей ситуации будет только один экземпляр моей деятельности, все должно быть хорошо.

public class MainActivity extends Activity implements ActionBar.TabListener {
    private static int tabIdx;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (savedInstanceState != null) {
            tabIdx = savedInstanceState.getInt("tab", 0);
        }
        getActionBar().setSelectedNavigationItem(tabIdx);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        tabIdx = getActionBar().getSelectedNavigationIndex();
        outState.putInt("tab", tabIdx);
    }
}

Ответ 2

поэтому, если onSaveInstance был вызван

вы можете объявить глобальную переменную для

 int pos=0; 

после вызова onSaveInstance() вызывается метод ниже:

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
pos=savedInstanceState.getInt("tab", 0);    

}

поэтому в вашей функции onCreate() замените это условие следующим образом:

if (savedInstanceState != null) {
    actionBar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
}

:

if(pos>0){
actionBar.setSelectedNavigationItem(pos);
}

Ответ 3

Метод onRestoreInstanceState() вызывается только тогда, когда есть объект Bundle для восстановления, т.е. он не является NULL. В противном случае метод восстановления не будет вызываться.