Intereting Posts
Android AlertDialog box WindowManager $ Проблема с BadTokenException Глянцевый градиент с помощью android drawable xml Размытые изображения на Android-браузере Android AppStateManager :: Внутренняя утечка данных в обнаруженном объекте DataBuffer Запрос в ParseObject PhoneGap – клавиатура делает экран черным и мерцающим в течение некоторого времени на Samsung Galaxy Tab 10.1 Есть ли способ проверить, поддерживает ли Android-устройство openGL ES 2.0? Android. Получение контекста из широковещательного приемника onReceive () для отправки Как установить фоновое изображение кнопки с помощью кода Безопасная публикация HTTP на Android Android: Любой ярлык для Serializable из Parcelable без использования marshall ()? Прочитать размер шрифта из настроек Установить значение для объекта области Вращающийся телефон быстро на 180 градусов, предварительный просмотр камеры перевернут вверх дном Android adb «Невозможно открыть синхронизацию!»

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)); } } 

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

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

Solutions Collecting From Web of "SavedInstanceState всегда имеет значение null, но onSaveInstanceState () всегда называется"

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

По-видимому, onCreate() может иметь savedInstanceState параметр 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); } } 

Поэтому, если вызывается 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); } 

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