使用android操作栏和导航抽屉创建多窗格布局

时间:2014-06-17 10:02:01

标签: android android-fragments android-actionbar android-navigation

我目前正在创建一个可以使用片段处理不同屏幕支持和多窗格视图的应用。现在我使用默认的导航抽屉和动作栏使用android studio并创建了两个片段来测试这个和布局for portrait:fragment_1和fragment_2,它们只是替换了MainActivity上的容器。但现在问题是我如何在1布局中实现fragment_1和fragment_2?我尝试研究这个link的多窗格开发,但我认为要正确实现它我需要使用ActivityFragment但是在这种情况下我只能使用Fragments,这就是我迷失的原因怎么做这是迄今为止的代码:

@Override
    public void onNavigationDrawerItemSelected(int position) {
        // update the main content by replacing fragments
        FragmentManager fragmentManager = getSupportFragmentManager();
        switch (position) {
            case 0:
                        fragmentManager.beginTransaction()
                        .replace(R.id.container, FragmentMain.newInstance(position + 1))
                        .commit();
                break;
            case 1:
                fragmentManager.beginTransaction()
                        .replace(R.id.container, FragmentAbout.newInstance(position + 1))
                        .commit();
                break;
            /*create the other cases here for navigation*/
        }
    }

fragment_main.xml(第1个片段)

<RelativeLayout 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"
    tools:context="com.kahel.main.MainActivity$PlaceholderFragment">
    <android.support.v4.widget.SwipeRefreshLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/swipe_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <ListView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/list_news"
            android:choiceMode="singleChoice" />
    </android.support.v4.widget.SwipeRefreshLayout>
</RelativeLayout>

fragment_about.xml(第二个片段)

<RelativeLayout 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"
    tools:context="com.kahel.main.MainActivity$PlaceholderFragment">
    <android.support.v4.widget.SwipeRefreshLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/swipe_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <ListView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/list_news"
            android:choiceMode="singleChoice" />
    </android.support.v4.widget.SwipeRefreshLayout>
</RelativeLayout>

fragment_main.xml(landscape)

<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"
    tools:context="com.kahel.main.MainActivity$PlaceholderFragment"
    android:orientation="horizontal"
    android:weightSum="1">
    <android.support.v4.widget.SwipeRefreshLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/swipe_container"
        android:layout_width="@dimen/land_scoop_feed"
        android:layout_height="match_parent">
        <ListView
            android:layout_width="150dp"
            android:layout_height="match_parent"
            android:id="@+id/list_news"
            android:choiceMode="singleChoice" />
    </android.support.v4.widget.SwipeRefreshLayout>

</LinearLayout>

当我尝试更改布局时,只需强制关闭我的应用。 :/

请告诉我该做什么或搜索什么。谢谢! :)

1 个答案:

答案 0 :(得分:0)

好吧,我遇到了完全相同的问题,经过大量的研究后,我很惊讶,在我看来,缺乏相关文档的常见情况。但是,在尝试了一些事情后,我想出了一个解决方案。

我的第一种方法是使用&#34;根片段替换导航抽屉容器&#34;同时会有两个包含我想要的片段的布局。问题是不允许在布局上声明嵌套片段。

要克服这个问题,请在我的&#34;最终布局&#34;我替换了FrameLayouts的Fragment定义,然后以编程方式将片段加载到&#34;根片段&#34;。

总结:您拥有导航抽屉,并在单击所需内容后,使用&#34;根片段&#34;替换您的片段容器。这个&#34; Root片段&#34;有两种布局:默认布局和横向布局布局。这些布局包含我们希望在初始化时排列的FrameLayout元素被我们的&#34;最终片段&#34;替换。

我怀疑这是实现具有导航抽屉的多窗格布局的目标的最佳方式,但我能够做的最适合我的需求。我欢迎任何建议!

我用一些代码说明了解决方案。

MainActivity.java(带导航抽屉的那个)     ...

void drawerOptionSelected(String option) {

    if(option.equals(XXXX)) {

        Fragment fragment = new RootFragment();
        final FragmentTransaction transaction = getFragmentManager().beginTransaction();
        transaction.replace(R.id.content_frame, fragment);
        transaction.commit();

        drawerList.setItemChecked(menuOptions.indexOf(option), true);
        drawerLayout.closeDrawer(drawerList);
    }
}

...

root_fragment_layout.xml(默认)

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/entries_list_single"
    android:layout_width="match_parent"
    android:layout_weight="1"
    android:layout_height="match_parent" />

root_fragment_layout.xml(风景)

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

    <FrameLayout android:id="@+id/entries_list"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent" />

    <FrameLayout android:id="@+id/entries_post"
        android:layout_width="0dp"
        android:layout_weight="2"
        android:layout_height="match_parent" />

</LinearLayout>

<强> RootFragment.java

public class RootFragment extends Fragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.root_fragment_layout);

        if(savedInstanceState != null) { //Fragments already loaded, avoid replacing them again
            return;
        }

        ListFragment listFragment = new ListFragment();
        final FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); //IMPORTANT! Use child fragment manager

        if (findViewById(R.id.entries_list_single) == null) { //We are loading the landscape layout
            PostFragment postFragment = new PostFragment();

            transaction.replace(R.id.entries_list, listFragment);
            transaction.replace(R.id.entries_post, postFragment);
            transaction.commit();

        } else { //We are loading the default layout

            transaction.replace(R.id.entries_list_single, listFragment);
            transaction.commit();
        }
    }
}