Intereting Posts
Выбор WebView заставляет мягкую клавиатуру временно скрываться, а затем возвращаться Gradle connectedAndroidTest возвращает «No test found», однако инструмент adb shell am может найти тесты Как вибрировать шаблон системы по умолчанию в Android? Как переместить встроенные элементы управления увеличением в MapView? Как получить метаданные из картинки? Android expandablelistview не может отображать последнюю группу при расширении Почему вызов setBackgroundColor в представлении прерывает его длительное изменение цвета и выделение? Каков максимальный объем данных, который может содержать строка в java? Обновление GridView / ListView без повторного заполнения Android.view.InflateException: двоичная строка XML-файла # 7: ошибка раздувания фрагмента класса Использование Telephony Manager в android для поиска номера IMEI Аплодировать и телефонные звонки на Android Задать настройку экрана в интерактивном режиме Значок пользовательского маркера Android Путь рисования на карте google на основе lat lang

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. В противном случае метод восстановления не будет вызываться.