Java TabHost在片段活动和屏幕旋转中

Java TabHost在片段活动和屏幕旋转中,java,android,Java,Android,当我在FragmentActivity中使用TabHost时,我不明白如何在屏幕旋转中使用retain实例。我发现了很多关于这方面的东西,但无论是谈论使用OnRetainonConfiguration实例(),都不推荐使用。或者使用setRetainInstance(布尔值),但FragmentActivity没有此方法。只有一部分人拥有它 在此链接上,您可以找到我的主要活动代码: 提前感谢, Cédric您可以使用onSavedInstanceState保存当前选定的选项卡: @Overri

当我在FragmentActivity中使用TabHost时,我不明白如何在屏幕旋转中使用retain实例。我发现了很多关于这方面的东西,但无论是谈论使用OnRetainonConfiguration实例(),都不推荐使用。或者使用setRetainInstance(布尔值),但FragmentActivity没有此方法。只有一部分人拥有它

在此链接上,您可以找到我的主要活动代码:

提前感谢,


Cédric

您可以使用onSavedInstanceState保存当前选定的选项卡:

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putInt("TAB_POSITION", host.getCurrentTab());
    super.onSaveInstanceState(outState);
}
之后,您可以在onCreate中重新训练所选位置:

if (savedInstanceState != null) {
    host.setCurrentTab(savedInstanceState.getInt("TAB_POSITION"));
}

我的应用程序大约有5000行代码,这就是为什么我把google代码放在git repositery上。但我找到了解决办法! 首先,在创建活动时,我会检查我是否在有问题的选项卡区域。如果是,我将删除所有事务信息

if(savedInstanceState != null){
                        int tabPosition = savedInstanceState.getInt("TAB_POSITION");
                        if(tabPosition == 1){
                                FragmentManager manager = this.getSupportFragmentManager();
                                for(int i = 0; i < manager.getBackStackEntryCount(); ++i) {    
                                        manager.popBackStack();
                                }
                        }
                }

好的,这是可行的,但每次它都会破坏并重新创建每个片段。我只是有个问题。是否有一种自动方式来处理以下事实:在我的片段中,我做了很多(通过ListFragment导航)片段事务:FragmentTransaction=getFragmentManager().beginTransaction();transaction.replace(this.getId(),newFragment);transaction.addToBackStack(空);commit();或者我必须跟踪当前事务并手动处理它吗?我认为最简单的方法就是跟踪活动片段。您导航到的这些片段是所有不同的片段还是具有其他内容的相同片段?现在我跟踪当前片段级别(我可以导航到4个ListFragment。我在主要活动的onCreate方法中有该代码:int-levelChoice=WorkoutManagerSingleton.getInstance().getLevelChoice();if(levelChoice==0){this.fragment2worklog=new fragment2worklog();}else if(levelChoice==1){this.fragment2worklog=new fragment2worklog_1subProg();}else if(levelChoice==2){this.fragment2worklog=new fragment2worklog_2week();}else if(levelChoice==3){…但是有了那段代码,撤销就不起作用了。用这种方法创建的片段在旋转后进行撤销时不会被破坏,因此我同时看到了两个片段列表。你能发布一些代码吗?那么我就可以找到问题:)
TabHost.OnTabChangeListener listener = new TabHost.OnTabChangeListener() {
        public void onTabChanged(String tabId) {
                Log.d("MainActivity","public void onTabChanged(String tabId) { called");
                if(tabId.equals(TAB_A)){
                        pushFragments(getString(R.string.rss), fragment1rss);
                }else if(tabId.equals(TAB_B)){
                        pushFragments(getString(R.string.worklog), fragment2worklog);
                        int levelChoice = WorkoutManagerSingleton.getInstance().getLevelChoice();
                        ListFragment nextFragment = null;
                        if(levelChoice > 0){
                                nextFragment = new Fragment2worklog_1subProg();
                                pushFragmentsRegisterInStack(nextFragment);
                        }
                        if(levelChoice > 1){
                                nextFragment = new Fragment2worklog_2week();
                                pushFragmentsRegisterInStack(nextFragment);
                        }
                        if(levelChoice > 2){
                                nextFragment = new Fragment2worklog_3day();
                                pushFragmentsRegisterInStack(nextFragment);
                        }
                        if(levelChoice > 3){
                                nextFragment = new Fragment2worklog_4exercices();
                                pushFragmentsRegisterInStack(nextFragment);
                        }
                }else if(tabId.equals(TAB_C)){
                        pushFragments(getString(R.string.testimonials), fragment3testimonials);
                }else if(tabId.equals(TAB_D)){
                        pushFragments(getString(R.string.recipes), fragment4recipe);
                }else if(tabId.equals(TAB_E)){
                        pushFragments(getString(R.string.archives), fragment5archives);
                }else if(tabId.equals(TAB_F)){
                        pushFragments(getString(R.string.book), fragment6book);
                }
                Log.d("MainActivity","public void onTabChanged(String tabId) { end");
        }
};

/*
 * adds the fragment to the FrameLayout
 */
public void pushFragments(String tag, Fragment fragment){
        FragmentManager manager = this.getSupportFragmentManager();
        FragmentTransaction ft = manager.beginTransaction();
        ft.replace(android.R.id.tabcontent, fragment);
        ft.commit();
}

public void pushFragmentsRegisterInStack(Fragment fragment){
        FragmentManager manager = this.getSupportFragmentManager();
        FragmentTransaction ft = manager.beginTransaction();
        ft.replace(android.R.id.tabcontent, fragment);
        ft.addToBackStack(null);
        ft.commit();
}