【问题标题】:Get Current Fragment and Save on onSaveInstanceState() Method For Screen Orientation获取当前片段并在 onSaveInstanceState() 方法上保存屏幕方向
【发布时间】:2012-09-20 22:00:22
【问题描述】:

我有一个包含多个片段的活动。我也在使用 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

    }
}

【问题讨论】:

    标签: android android-fragments android-actionbar actionbarsherlock screen-orientation


    【解决方案1】:

    如果您不再次添加,默认情况下,设备旋转后会恢复片段。如果您希望片段看起来相同,那么您应该在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,在恢复ActivitysavedInstanceState 参数仍将是非空的。它只是一个空的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。唯一的缺点是你的片段的状态没有被保存。要保存片段的状态,您必须执行类似于第一个解决方案的操作。

    【讨论】:

    • 如何保存片段的状态?
    • 而不是actionBar.addTab(tabD, 0, true); 这样做:if(savedInstanceState == null) {actionBar.addTab(tabD, 0, true);} else { actionBar.addTab(tabD, 0, false); } 这应该允许恢复现有的片段。您的选项卡指示器可能已关闭,因此您必须设置显示哪个选项卡。
    猜你喜欢
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多