Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 获取当前片段并保存在屏幕方向的onSaveInstanceState()方法上_Android_Android Fragments_Android Actionbar_Actionbarsherlock_Screen Orientation - Fatal编程技术网

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

Android 获取当前片段并保存在屏幕方向的onSaveInstanceState()方法上,android,android-fragments,android-actionbar,actionbarsherlock,screen-orientation,Android,Android Fragments,Android Actionbar,Actionbarsherlock,Screen Orientation,我有一个包含多个片段的活动。我也在为我的标签使用actionbarSherlock,它也连接到片段 我的问题是,当我要旋转屏幕时(即从纵向到横向/反之亦然),我的活动将再次被调用,因此它将重新启动我的活动 我不想重新启动我的活动,只想恢复在旋转之前显示的当前片段。请不要回答android:configChanges=“orientation | keyboardHidden”,因为它并没有解决问题,而只是简单的破解。我的解决方案是OnsaveInstanceState和onRestoreInst

我有一个包含多个片段的活动。我也在为我的标签使用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\u MODE\u选项卡);
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.consors);
ActionBar.Tab tabC=ActionBar.newTab().setIcon(R.drawable.map);
ActionBar.Tab tabD=ActionBar.newTab().setIcon(R.drawable.destination);
片段aboutTab=新的PhotoActivity();
片段sponsorTab=新歌曲活动();
Fragment mapTab=新的HCCMapActivity();
片段questTab=new FaqActivity();
片段DestinationTab=新TourActivity();
tabA.setTabListener(新的MyTabsListener(aboutTab));
表B.setTabListener(新的MyTabsListener(赞助商表));
tabC.setTabListener(新的MyTabsListener(mapTab));
tabD.setTableListener(新的MyTabsListener(DestinationTab));
tabE.setTabListener(新的MyTabsListener(questTab));
actionBar.addTab(tabD,0,true);
actionBar.addTab(tabC,1,false);
actionBar.addTab(tabA,2,false);
actionBar.addTab(tabB,3,false);
actionBar.addTab(表4,false);
}
@凌驾
SaveInstanceState上的公共无效(Bundle savedInstanceState){
super.onSaveInstanceState(savedInstanceState);
//将UI状态更改保存到savedInstanceState。
//如果进程被激活,则此捆绑包将传递给onCreate
//杀死并重新启动。
putString(“MyString”,“欢迎回到Android”);
//savedInstanceState.putString(“id”,)
//等等。
//getSupportFragmentManager();
}
@凌驾
RestoreInstanceState上的公共无效(Bundle savedInstanceState){
碎片管理器碎片管理器;
碎片交易;
super.onRestoreInstanceState(savedInstanceState);
//从savedInstanceState还原UI状态。
//此捆绑包也已传递给onCreate。
String myString=savedInstanceState.getString(“myString”);
Log.i(“你好”,myString);
fragmentManager=getSupportFragmentManager();
ft=fragmentManager.beginTransaction();
ft.setCustomAnimations(R.anim.slide\u out\u left,R.anim.slide\u out\u right);
ft.replace(R.id.fragment_place,getSupportFragmentManager().getFragment(savedInstanceState,“fragment”),null);
}
@凌驾
公共无效OnConfiguration已更改(配置newConfig){
Log.i(“你好”,“配置”);
super.onConfigurationChanged(newConfig);
}
@凌驾
公共布尔值OnPrepareOptions菜单(菜单){
//MenuItem menuitem1=menu.findItem(R.id.menuitem1);
//menuitem1.setVisible(false);
menu.getItem(1).setVisible(false);
menu.getItem(0).setVisible(false);
返回true;
}
受保护的类MyTabsListener实现了TablListener{
片段;
公共MyTabsListener(片段){
this.fragment=片段;
}
已选择的公共事务(选项卡,碎片事务处理ft){
如果(myTabPosition<0){
//ft.setCustomAnimations(android.R.animator.fade_in,android.R.animator.fade_out);
}否则{
如果(myTabPosition>tab.getPosition()){
ft.setCustomAnimations(R.anim.slide\u in\u left,R.anim.slide\u out\u right);
}否则{
ft.setCustomAnimations(R.anim.slide\u out\u left,R.anim.slide\u out\u right);
}
}   
myTabPosition=tab.getPosition();
ft.replace(R.id.fragment\u位置,fragment,null);
//ft.commit();
}
已选择公共空页(选项卡,碎片事务ft){
//TODO自动生成的方法存根
ft.去除(碎片);
getSupportFragmentManager();
}
已重新选择公共无效页签(页签,碎片事务){
//TODO自动生成的方法存根
}
}

默认情况下,如果您不再添加碎片,则在设备旋转后碎片将恢复。如果希望片段看起来相同,则应在
片段
本身中执行
onSaveInstanceState
。在
活动中
您可以执行以下操作:

@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
参数仍将为非空。它只是一个空的

另一个选项是存储所选选项卡索引,并在恢复活动时重新选择该选项卡

@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 */
    }
}

这将重新选择当前选项卡并显示正在显示的
片段。这样做的唯一缺点是没有保存片段的状态。要保存片段的状态,必须执行与第一个解决方案类似的操作。

如何保存片段的状态?而不是
actionBar.addTab(tabD,0,true)执行此操作:
if(sav
@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 */
    }
}