我有一个活动有多个片段。我也在使用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。唯一的缺点是你的片段的状态没有被保存。要保存片段的状态,您必须执行类似于第一个解决方案的操作。

07-24 09:48
查看更多