如何在方向更改期间维护片段数据?

时间:2014-07-03 03:29:12

标签: android screen-orientation android-bluetooth

我有一个使用蓝牙的应用程序。我的UI显示将由许多单独的显示组成,每个显示都实现为片段。其中一些相对复杂,我希望能够根据方向重新排列显示。

我必须禁用活动关闭,就好像我没有断开蓝牙连接一样。

我尝试了许多建议的步骤来尝试和管理从横向到纵向的方向转换,反之亦然。使用Bundle将数据从旧的传输到新的蓝牙。

如果我使用setRetainInstance(true);在我的片段中,我可以在不删除蓝牙连接的情况下成功更改显示,但该过程涉及充气和创建新版本的布局。来自先前实例的信息未传递到修改的布局,并且新布局是不活动的(例如,按下按钮在屏幕上正确指示但不改变父活动中的任何内容)。我似乎正在创建一个未连接到Activity的新实例。

我还尝试测试方向并使用getRequestedOrientation()/ setRequestedOrientation()以编程方式更改方向。这会使Fragment的相同实例与数据保持一致,但不会改变方向 - 我是否需要在此之后发出重绘命令?

我们将非常感激地收到任何建议。

1 个答案:

答案 0 :(得分:0)

问题解决了 - 相对容易。

  1. 在Manifest中,使用android:configChanges =“orientation | screenSize”作为主Activity配置的一部分。

  2. 无需使用setRetainInstance(true);在片段onCreateView中 - 它似乎没有任何区别。

  3. 在Activity onCreate中添加片段然后隐藏:

    // Set up the window layout
    setContentView(R.layout.index_page_layout);
    // Add the fragments and hide them.
    
    FragmentManager fm = getFragmentManager();
    FragmentTransaction fragTrans = fm.beginTransaction();
    
    fragTrans.add(R.id.container, hmi1,"HMI1");
    fragTrans.hide(hmi1);
    fragTrans.add(R.id.container, hmi2,"HMI2");
    fragTrans.hide(hmi2);
    fragTrans.add(R.id.container, termfrag,"TERM");
    fragTrans.hide(termfrag);
    fragTrans.commit();
    hmi1_showing = false;
    hmi2_showing = false;
    terminal_showing = false;
    

    在Activity onConfigurationChanged中没有采取任何特殊措施。

  4. 在Fragment onConfigurationChanged中,我有:

    Fragment currentFragment = getFragmentManager().findFragmentByTag("FRAGTAG");
    FragmentTransaction fragTransaction = getFragmentManager().beginTransaction();
    fragTransaction.detach(currentFragment);
    fragTransaction.attach(currentFragment);
    fragTransaction.commit();
    

    其中FRAGTAG是Activity.onCreate方法中定义的相关标记。