为什么我的片段在方向更改时仍然存在

时间:2017-03-19 16:05:16

标签: android android-fragments

我正在学习Android,因为活动和片段之间的沟通,我陷入了“片段篇”。让我来介绍一下我的问题:

得到MainActivity,我分别绑定了2个片段AlimentFragmentDetailAlimentFragment使用,

横向方向:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
<fragment android:name="supersk.training.android.gestionstock.AlimentFragment"
    android:id="@+id/fgt_aliment"
    android:layout_weight="1"
    android:layout_width="0dp"
    android:layout_height="match_parent">
</fragment>

<fragment android:name="supersk.training.android.gestionstock.DetailAlimentFragment"
    android:id="@+id/fgt_detail"
    android:layout_weight="2"
    android:layout_width="0dp"
    android:layout_height="match_parent">
</fragment>
</LinearLayout>

纵向方向:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fgt_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

在我的MainActivity上,我定义了一个覆盖我AlimentFragment类中定义的接口方法的方法:

@Override
    public void onAlimentSelection(Aliment aliment) {
        // l'utilisateur selectionne un item dans la liste depuis AlimentFragment
        Log.d(MainActivity.class.getSimpleName(), "[onAlimentSelection] method triggered !");

        DetailAlimentFragment detailFragment = (DetailAlimentFragment)
                getSupportFragmentManager().findFragmentById(R.id.fgt_detail);


        if (detailFragment != null ){
            // si le fragment est disponible, on est en double vue
            detailFragment.updateDetailAliment(aliment);
        } else {
            // si le fragment n'est pas disponible, on est en simple vue

            // on créée le fragment et lui passe l'item selectionné
            DetailAlimentFragment newDetailFragment = new DetailAlimentFragment();
            Bundle args = new Bundle();
            args.putParcelable(ARG_ALIMENT, aliment);
            newDetailFragment.setArguments(args);
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

            transaction.replace(R.id.fgt_container, newDetailFragment);
            transaction.addToBackStack(null);

            // Valider la transaction
            transaction.commit();
        }
    }

用户流程互动:

  1. 在肖像上启动应用程序(仅显示AlimentFragment
  2. 列表
  3. 点击项目和详细项目视图替换我的列表项
  4. 改变自己         肖像到风景(这里我们可以看到左边的列表和细节区域         在右边)
  5. 点击项目并DetailAlimentFragment正确更新     在左边
  6. 从横向更改为纵向,再次查看列表     项目再次单击项目抛出NullPointerException
  7. 在第5步,我发现修复异常的方式是:

    if (detailFragment != null && findViewById(R.id.fgt_container) == null) {
    

    而不是:

    if (detailFragment != null ){
    

    问题:

    当我从风景改为肖像时,我的DetailAlimentFragment仍然存在,但为什么?每次我以纵向方向点击项目时,我应该拨打一些DetailActivity吗?

    如果您需要更多样品,请告诉我! ;)

1 个答案:

答案 0 :(得分:0)

我终于找到了一些有用的帮助。

在Android Studio&#34;新项目&#34;中,我可以选择模板&#34;主/详细流程&#34;活动生成有用的代码片段以便掌握它。