获取当前片段并保存onSaveInstanceState()方法屏幕方向

我有一个活动与多个片段。 我也使用actionbarSherlock我的标签,也连接到片段。

我的问题是当我要旋转屏幕(这是纵向景观/反之亦然),我的活动将被再次调用,所以它重新开始我的活动。

我不想重新启动我的活动,但只是恢复旋转之前显示的当前片段。 请不要回答android:configChanges="orientation|keyboardHidden"因为它没有解决问题,但就像一个简单的黑客攻击。 我的解决scheme是OnsaveInstanceState和onRestoreInstanceState方法,但我只是不知道如何使用它与我的问题。 请帮助我这个。 任何回应非常感激。

码:

  public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ActionBar actionBar = getSupportActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); ActionBar.Tab tabA = actionBar.newTab().setIcon(R.drawable.about); ActionBar.Tab tabE = actionBar.newTab().setIcon(R.drawable.faq); ActionBar.Tab tabB = actionBar.newTab().setIcon(R.drawable.sponsors); ActionBar.Tab tabC = actionBar.newTab().setIcon(R.drawable.map); ActionBar.Tab tabD = actionBar.newTab().setIcon(R.drawable.destination); Fragment aboutTab = new PhotosActivity(); Fragment sponsorTab = new SongsActivity(); Fragment mapTab = new HCCMapActivity(); Fragment questTab = new FaqActivity(); Fragment DestinationTab = new TourActivity(); tabA.setTabListener(new MyTabsListener(aboutTab)); tabB.setTabListener(new MyTabsListener(sponsorTab)); tabC.setTabListener(new MyTabsListener(mapTab)); tabD.setTabListener(new MyTabsListener(DestinationTab)); tabE.setTabListener(new MyTabsListener(questTab)); actionBar.addTab(tabD, 0, true); actionBar.addTab(tabC, 1, false); actionBar.addTab(tabA, 2, false); actionBar.addTab(tabB, 3, false); actionBar.addTab(tabE, 4, false); } @Override public void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); // Save UI state changes to the savedInstanceState. // This bundle will be passed to onCreate if the process is // killed and restarted. savedInstanceState.putString("MyString", "Welcome back to Android"); //savedInstanceState.putString("id",) // etc. //getSupportFragmentManager().putFragment(savedInstanceState, "fragment", getSupportFragmentManager().findFragmentById(R.id.fragment_place)); } @Override public void onRestoreInstanceState(Bundle savedInstanceState) { FragmentManager fragmentManager ; FragmentTransaction ft ; super.onRestoreInstanceState(savedInstanceState); // Restore UI state from the savedInstanceState. // This bundle has also been passed to onCreate. String myString = savedInstanceState.getString("MyString"); Log.i("Hello", myString); fragmentManager = getSupportFragmentManager(); ft = fragmentManager.beginTransaction(); ft.setCustomAnimations(R.anim.slide_out_left, R.anim.slide_out_right); ft.replace(R.id.fragment_place, getSupportFragmentManager().getFragment(savedInstanceState, "fragment"), null); } @Override public void onConfigurationChanged (Configuration newConfig){ Log.i("hello", "Config"); super.onConfigurationChanged(newConfig); } @Override public boolean onPrepareOptionsMenu (Menu menu) { //MenuItem menuitem1 = menu.findItem(R.id.menuitem1); //menuitem1.setVisible(false); menu.getItem(1).setVisible(false); menu.getItem(0).setVisible(false); return true; } protected class MyTabsListener implements TabListener{ Fragment fragment; public MyTabsListener(Fragment fragment){ this.fragment = fragment; } public void onTabSelected(Tab tab, FragmentTransaction ft) { if (myTabPosition < 0){ //ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out); }else{ if (myTabPosition > tab.getPosition()){ ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right); }else{ ft.setCustomAnimations(R.anim.slide_out_left, R.anim.slide_out_right); } } myTabPosition = tab.getPosition(); ft.replace(R.id.fragment_place, fragment, null); //ft.commit(); } public void onTabUnselected(Tab tab, FragmentTransaction ft) { // TODO Auto-generated method stub ft.remove(fragment); getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); } public void onTabReselected(Tab tab, FragmentTransaction ft) { // TODO Auto-generated method stub } } 

Solutions Collecting From Web of "获取当前片段并保存onSaveInstanceState()方法屏幕方向"

默认情况下,设备旋转后,碎片将被恢复,如果您不再添加它们。 如果你想片段看起来相同,那么你应该在Fragment本身执行onSaveInstanceState 。 在Activity你可以做一些事情:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if(savedInstanceState == null) { /* First launch, add fragments */ } else { /* Activity restored, don't add new fragments or in your case, don't make the first tab selected. */ } } 

即使您不在活动中重写onSaveInstanceState ,在savedInstanceState活动时, savedInstanceState参数仍将为非null。 这只是一个空的Bundle

另一个选项是存储所选标签索引的内容,并在活动恢复时重新select该标签。

 @Override public void onSaveInstanceState(Bundle outState) { outState.putInt("CurrentTab", currentTabIndex); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* Your existing code */ if(savedInstanceState != null) { int currentTab = savedInstanceState.getInt("CurrentTab", 0); /* Set currently selected tab */ } } 

这将重新select当前标签并显示正在显示的Fragment 。 唯一的缺点就是你的片段状态没有保存。 为了保存片段的状态,你必须做一些像第一个解决scheme。