在屏幕方向更改时处理片段? [英] Handle Fragment On Screen Orientation Changes?

查看:16
本文介绍了在屏幕方向更改时处理片段?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am useing This Sort of Code To Handle Three Fragment in Main Activity ...

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

FragmentA is Fixed it One Frame .. I change FragmentB and FragmentC on Button Click on FragmentA. his Code is Running well either in Portrait or Landscape view .Here is The Code bellow.

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();

    }

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

This Code is Running well either in Portrait or Landscape view ... But When Ever I change the Orientation The Two Fragments Override One Another.

需要解决方案.

推荐答案

当你的方向改变时,你的 Activity 被重新创建.

When your orientation change, your Activity is recreated.

"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);
}  

希望这会有所帮助.

这篇关于在屏幕方向更改时处理片段?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆