澄清静态与动态片段

时间:2012-07-06 15:22:49

标签: android

美好的一天,试图澄清一下:如果我有这种布局的肖像布局

main.xml中:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <fragment
        android:id="@+id/configFragment_id"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="com.example.settingsFragment">
</fragment>

这适用于横向(主要用于平板电脑),main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <fragment
        android:id="@+id/configFragment_id"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="com.example.SettingsFragment" ></fragment>

        <fragment
        android:id="@+id/detailFragment_id"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="com.Example.DetailFragment" >
        <!-- Preview: layout=@layout/details -->
    </fragment>

</LinearLayout>

现在在我的SettingFragment中,我实现了一个按钮来转到DetailFragment:

DetailFragment fragment = (DetailFragment)getActivity().getSupportFragmentManager().findFragmentById(R.id.detailFragment_id);
            FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction();
            if (fragment != null && fragment.isInLayout()) {
                DetailFragment detailfragment = new WallpaperFragment();
                fragmentTransaction.add(R.id.detailFragment_id, detailfragment);
                fragmentTransaction.addToBackStack(null);
                fragmentTransaction.commit();
            }else{
                Intent intent = new Intent(getActivity().getApplicationContext(),DetailActivity.class);
                startActivity(intent);
            }

我现在正在实现动态片段还是我仍在使用静态片段?或者当我使用像FrameLayout这样的视图组代替片段标记元素时,我是否只使用动态片段?

想法是为手机提供单一窗格,为平板电脑设置多窗格。我知道混合静态和动态片段是一个坏主意,但它有点令人困惑。谢谢。

2 个答案:

答案 0 :(得分:0)

你知道,我可能在这里错了(所以请随意纠正我),但看起来你正在使用静态和动态片段。在您的XML布局中,您添加了片段,然后通过活动中的片段事务重新实例化它们。或者,如果您已经声明了一个容器(例如FrameLayout)而不是XML中的片段,则必须使用FragmentTransaction在运行时添加片段。

在你的例子中,你只是踩着你已经准备好的片段。基本上,操作系统在膨胀时会看到XML中的片段(我认为它是在调用片段代码时?)并通过片段中的标记执行与之关联的代码。然后,您的应用会将相同的片段添加到其顶部。一个简单的方法是在Fragment类的onCreateView方法中添加一个LogCat调用。如果您不止一次地看到它,那么您使用相同的片段踩到前一个片段(我99%确定您是这样)。希望这有助于回答您的问题!

答案 1 :(得分:0)

静态片段在布局中定义,通常不会在运行时添加或删除。它们在代码中由id引用。它们通常被放置为如下布局的子元素。一旦在这里定义了它们,android就会知道制作一个片段,这就是你所要做的一切。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:weightSum="1">
    <fragment
        android:id="@+id/fooFragment"
        android:name="com.example.myapplication.TestFragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

动态片段在您的代码中定义,可以在运行时进行操作,添加,删除等。它们看起来像这样:

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.add(R.id.your_placeholder, new TestFragment());
    ft.commit();