如何以编程方式创建多个片段?

时间:2013-01-18 17:24:35

标签: android android-fragments android-fragmentactivity

我试图通过编程方式在一个屏幕上显示多个片段。通过将每个片段包含在活动布局文件中,我能够做到这一点没问题。然而,当我尝试以编程方式进行操作时我很困惑。这就是我到目前为止屏幕上的两个片段。

主类:

public class MainActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FragmentOne one = new FragmentOne();
        FragmentTwo two = new FragmentTwo();
        FragmentThree three = new FragmentThree();

        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.add(R.id.imOne, one, "fragmentone");
        ft.add(R.id.imTwo, two, "fragmenttwo");
        ft.add(R.id.imThree, three, "fragmenthree");
        ft.commit();

    }
}

片段一:

public class FragmentOne extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        View view = inflater.inflate(R.layout.frag_one, container, false);
        return view;
    }

}

片段二:

public class FragmentTwo extends Fragment{

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        View view = inflater.inflate(R.layout.frag_two, container, false);
        return view;
    }

}

我的两个片段类的布局文件只包含一个简单的TextView。 然后是我的主类的activity_main.xml布局文件:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <FrameLayout
        android:id="@+id/imOne"
        android:name="com.david.twofragexample.FragmentOne"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2" />

    <FrameLayout
        android:id="@+id/imTwo"
        android:name="com.david.twofragexample.FragmentTwo"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2" />

    <FrameLayout
        android:id="@+id/imThree"
        android:name="com.david.twofragexample.FragmentThree"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2" />

</LinearLayout>

当我尝试以编程方式执行此操作时,我对在activity_main.xml文件中应该包含的内容感到困惑。因此,从Android开发人员指南(http://developer.android.com/guide/components/fragments.html)开始,它说要使用

FragmentManager fragmentManager = getFragmentManager()
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
FragmentOne fragment = new FragmentOne();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();

因此,当我将此代码添加到onCreate方法时,我必须对我的activity_main.xml文件进行哪些更改才能以编程方式执行此操作?我没有看到R.id.fragment_container的来源。如何确定我的新片段在屏幕上的位置?谢谢

编辑:我是在平板电脑而不是手机上开发它。现在已经解决了,上面的代码将以编程方式添加三个片段。

3 个答案:

答案 0 :(得分:3)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <FrameLayout
        android:id="@+id/list"
        android:name="com.david.twofragexample.FragmentOne"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2" />

    <FrameLayout
        android:id="@+id/viewer"
        android:name="com.david.twofragexample.FragmentTwo"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2" />

</LinearLayout>

在您的活动中:

FragmentOne one = new FragmentOne();
FragmentTwo two = new FragmentTwo();

fm = getSupportFragmentManager();
fm.beginTransaction().replace(R.id.list, one, "fragmentone").commit();
fm.beginTransaction().replace(R.id.viewer, two, "fragmenttwo").commit();

我建议你研究一下:

http://developer.android.com/reference/android/app/Fragment.html

并完全理解片段生命周期等。我展示的方式快速而且肮脏,但不是最好的。

答案 1 :(得分:1)

由于我没有足够多的代表发表评论,所以我将在这里保留这些信息-拉斐尔·T(Rafael T)建议的方法确实能很好地工作,尽管我一开始也对此表示怀疑。

1)像这样定义您的xml:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    >

2)将每个片段添加到同一插槽:

View box = v.findViewById(R.id.container);
FragmentTransaction ft = getFragmentManager().beginTransaction();
for (String catalog : mCatalogs) {
    Fragment fragment = HighlightedProductFragment.newInstance(catalog);
    ft.add(R.id.container, fragment, catalog);
}
ft.commit();

感谢您为这一棘手的需求提供解决方案。

答案 2 :(得分:0)

试试这样:

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

作为您的activity_main.xml

你问自己一个正确的问题:身份fragment_container在哪里,答案是:无处可去。 &gt;你还将你的布局设置为水平,这很有可能,添加的视图将是一种“屏幕外”