我有一个活动有多个片段。我也在使用ActionBarSherlock作为我的标签,它也连接到片段。
我的问题是,当我要旋转屏幕(即纵向到横向/反之亦然)时,我的活动将再次调用,因此它将重新启动我的活动。
我不想重新启动我的活动,只想还原当前片段,它是在旋转之前显示的。请不要回答android:configChanges="orientation|keyboardHidden"
,因为它没有解决问题,但就像一个简单的黑客。我的解决方案是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
}
}
最佳答案
默认情况下,如果不再次添加碎片,则在设备旋转后碎片将被还原。如果希望片段看起来相同,那么应该在onSaveInstanceState
本身中执行Fragment
。在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
时,Activity
参数仍将为非空。它只是一个空的Bundle
。另一个选项是存储所选选项卡索引,并在还原活动时重新选择该选项卡。
@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 */
}
}
这将重新选择当前选项卡并显示正在显示的
Fragment
。唯一的缺点是你的片段的状态没有被保存。要保存片段的状态,您必须执行类似于第一个解决方案的操作。