将片段添加到布局中

cor*_*eno 12 java android android-fragments

我想让我的应用程序更加平板电脑,所以我正在尝试学习片段.我想要典型的双窗格布局,左侧是"导航",然后单击其中一个元素,它会更改右侧的片段.

我可以复制左侧使用ListFragment的教程,如果单击其中一个,它会更新右侧的"详细信息"片段.

我已尽力复制该代码,只使用一个LinearLayout,左侧有按钮,这样如果单击一个按钮,它会在右侧加载相应的片段,但它不起作用.当我提交FragmentTransaction时,我得到java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.了孩子的父母是什么,为什么我必须在其上调用removeView?

我正在尝试将片段加载到FrameLayout中,但我也尝试替换布局中的另一个片段,但仍然得到错误.

理想情况下,我希望左侧片段占据整个屏幕,直到按下按钮需要从左侧进入片段,但我想一次有一个问题.

主要活动

public class FragmentExample2Activity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}
Run Code Online (Sandbox Code Playgroud)

SelectorFragment(左侧)

public class SelectorFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        View fragment = inflater.inflate(R.layout.selector, container);

        Button button1 = (Button) fragment.findViewById(R.id.button1);

        button1.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {

                getFragmentManager().beginTransaction().replace(R.id.detail_holder, new DetailsFragment(), "stuff").commit();

            }

        });


        return fragment;
    }
}
Run Code Online (Sandbox Code Playgroud)

DetailsFragment

public class DetailsFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        return inflater.inflate(R.layout.details, container);
    }
}
Run Code Online (Sandbox Code Playgroud)

main.xml中

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <fragment class="com.coreno.testfragment.SelectorFragment"
        android:id="@+id/select"
        android:layout_width="match_parent"
        android:layout_height="match_parent" 
        android:layout_weight="1"
        />

    <fragment class="com.coreno.testfragment.DetailsFragment"
        android:id="@+id/detail_holder"
        android:layout_width="match_parent"
        android:layout_height="match_parent" 
        android:layout_weight="2"
        />
    <!-- 
    <FrameLayout
        android:id="@+id/detail_holder" 
        android:layout_width="0px"
        android:layout_height="match_parent"
        android:layout_weight="2"
        />
 -->
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

Ale*_*ran 12

在扩展布局xml文件时,请不要指定父视图.听起来非常违反直觉,因为没有说明你放置这个膨胀的视图的位置但是它有效.

因此,例如,在SelectorFragment中更改行:

View fragment = inflater.inflate(R.layout.selector, container);
Run Code Online (Sandbox Code Playgroud)

View fragment = inflater.inflate(R.layout.selector, null);
Run Code Online (Sandbox Code Playgroud)

甚至更好

View fragment = inflater.inflate(R.layout.selector, container, false);
Run Code Online (Sandbox Code Playgroud)

不要忘记在DetailsFragment中也这样做.


小智 8

当你在Fragment的getView方法中扩展布局时,你必须使用下一个inflate方法:inflater.inflate(R.layout.details,container,false);

关键是第三个参数.将膨胀的布局附加到容器必须是假的,因为系统已经完成了它.如果为true或未指示,则创建冗余组视图.