【问题标题】:Handle Fragment On Screen Orientation Changes?在屏幕方向更改时处理片段?
【发布时间】:2013-11-25 09:58:47
【问题描述】:

我正在使用这种代码来处理主要活动中的三个片段......

FragmentA 是固定的一帧.. 我在按钮上更改 FragmentB 和 FragmentC 单击 FragmentA。 他的代码在纵向或横向视图中运行良好。这是下面的代码。

public class MainActivity extends FragmentActivity implements
        OnSwitchClickListener {

    FragmentManager manager;
    FragmentA fragA;
    FragmentB fragB;
    FragmentC fragC;

    boolean fragBSet = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        fragA = new FragmentA();
        fragB = new FragmentB();
        fragC = new FragmentC();

        manager = getSupportFragmentManager();
        FragmentTransaction ft = manager.beginTransaction();

        ft.add(R.id.a_container, fragA, "frag A");

        if (fragBSet) {
            ft.add(R.id.bc_container, fragC, "frag C");
        } else {
            ft.add(R.id.bc_container, fragB, "frag B");
        }
        fragBSet = true;
        ft.commit();

    }

    @Override
    public void onSwitchClick(View v) {
        Toast.makeText(getApplicationContext(), "Switch clkick from Activity",
                Toast.LENGTH_LONG).show();
        FragmentTransaction ft = manager.beginTransaction();
        if (fragBSet) {
            ft.remove(fragB);
            ft.add(R.id.bc_container, fragC, "frag C");
            fragBSet = false;
        } else {
            ft.remove(fragC);
            ft.add(R.id.bc_container, fragB, "frag B");
            fragBSet = true;
        }

        ft.commit();

    }

此代码在纵向或横向视图中运行良好......但是当我改变方向时,两个片段会相互覆盖。

需要解决方案。

【问题讨论】:

标签: android tabs fragment


【解决方案1】:

当您的方向改变时,您的Activity 会重新创建。

"In the scenario where a user rotates their device, Android will destroy your 
application’s activity(s).  Before destroying them it calls, onSaveInstanceState,
allowing developers to persist data.  Once the activity is recreated post 
rotation, the OS will call onRestoreInstanceState giving developers a chance to 
restore the application state pre-rotation."  

您应该尝试保存您的Fragments State

putFragment在 Bundle 中放置对片段的引用。这个Bundle可以作为保存状态持久化,以后恢复时getFragment(Bundle, String)会返回同一个fragment的当前实例。

@Override
protected void onSaveInstanceState(Bundle outState) {
   FragmentManager manager = getFragmentManager();
   manager.putFragment(outState, MyFragment.TAG, mMyFragment);
}  

getFragment检索当前 Fragment 实例以获取先前使用 putFragment(Bundle, String, Fr​​agment) 放置的引用。

private void instantiateFragments(Bundle inState) {
   FragmentManager manager = getFragmentManager();
   FragmentTransaction transaction = manager.beginTransaction();

   if (inState != null) {
      mMyFragment = (MyFragment) manager.getFragment(inState, MyFragment.TAG);
   } else {
      mMyFragment = new MyFragment();
      transaction.add(R.id.fragment, mMyFragment, MyFragment.TAG);
      transaction.commit();
   }
}  

restoreFragment

@Override
protected void onRestoreInstanceState(Bundle inState) {
   instantiateFragments(inState);
}  

希望这会有所帮助。

【讨论】:

  • 对我来说,当我旋转设备时,如果 (inState != null) 条件并显示空白屏幕,它会进入 instantiateFragments()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多