-1

美好的一天,试图澄清这一点:如果我有这个纵向布局的布局

主.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 之类的视图组代替片段标记元素时才使用动态片段?

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

4

2 回答 2

0

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

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

于 2012-07-06T18:40:37.040 回答
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();
于 2016-11-16T17:51:01.313 回答