导航抽屉多个容器和最佳实践

时间:2015-04-27 06:37:32

标签: android android-layout android-fragments navigation-drawer ui-patterns

我在Android UI开发方面相对较新。所以我需要更有经验的开发人员的帮助 我正在使用Navigation Drawer创建我的应用,我遇到了很多问题 首先,这是导航抽屉的示例代码。

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!-- The main content view -->
    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    <!-- The navigation drawer -->
    <ListView android:id="@+id/left_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp"
        android:background="#111"/>
</android.support.v4.widget.DrawerLayout>

这是来自官方网站的简单示例。

  

主要内容视图(上面的FrameLayout)必须是第一个子视图   在DrawerLayout中,因为XML顺序意味着z-ordering和   抽屉必须位于内容之上。

在此示例中,有两个嵌套视图:前面提到的用于存储主要内容的FrameLayout和用于表示ListView菜单的NavigationDrawer

所以这是我的问题。

  1. Real app在整个Activity上没有一个视图。主要是Activity有很多不同的视图,并且有几个片段可以使UI更具响应性并为用户提供更好的用户体验。我的活动当然是不同的观点和片段(相同活动的目的是什么?:))。 One Activity只有一个片段,另一个片段有几个片段,所以它们都是不同的...... 在以前的代码示例中,只有一个FrameLayout容器用于保存Fragment ONLY ONE片段,如果我的Activity有两个,三个或更多片段,我该怎么办?在这种情况下,最佳解决方案是什么。
  2. 正如我所描述的,我的应用程序有多个活动,因此我的导航抽屉必须(根据Android UI实践)在每个活动上让用户导航到应用程序的顶级元素。在这种情况下,最好有一个BaseActivity(我已经在stackoverflow上读到了答案),它将保存NavigationDrawer的所有配置内容。但就导航抽屉在XML活动布局中需要DrawerLayout而言,BaseActivity应调用setContentView方法。从BaseActivity活动继承的所有活动应该做一些技巧来设置自己的布局,或者覆盖这个方法没有意义,因为它会打破所有逻辑。在这种情况下该怎么办?
  3. 创建自定义导航抽屉列表的最有效方法是在google +或YouTube中使用,而不使用复杂的视图层次结构,这会使GPU工作变得严重并且会给用户带来不良体验
  4. 对于第二个问题,我有一些想法如何解决这个问题,但不知道它是正确的方法,哪种方法更好。
    第一个想法是实现TemplateMethod模式。在BaseActivity中创建类似setupCustomViewGroup()的方法并在所有活动中覆盖它从xml中膨胀所需的视图组并从此方法返回它,而不是在膨胀整个视图中使用它。

    或者向Activity显式添加视图,使用merge和include标记。

    但是这又可以仅对整个活动或一个片段有用,如果我们有更多片段,使用嵌套片段怎么办,我认为这是个坏主意。

    此外,我的目标是优化视图层次结构,使其快速高效,以便在旧设备上实现平滑。

    对于能够描述或建议在这种情况下使用最有效和正确的方法来使UI响应和代码可读的人,我将非常感激。

    谢谢。

3 个答案:

答案 0 :(得分:0)

您可以使用片段并从mainActivity中调用它们,如下所示:

MainActivity.java
public class MainActivity extends Activity {
..
..
@Override
protected void onCreate(Bundle savedInstanceState) {
..
mDrawerList.setOnItemClickListener(new SlideMenuClickListener());
}

/**
 * Slide menu item click listener
 * */
private class SlideMenuClickListener implements
        ListView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
        // display view for selected nav drawer item
        displayView(position);
    }
}

 /**
 * Diplaying fragment view for selected nav drawer list item
 * */
private void displayView(int position) {
    // update the main content by replacing fragments
    Fragment fragment = null;
    switch (position) {
    case 0:
        fragment = new HomeFragment();
        break;
    case 1:
        fragment = new FindPeopleFragment();
        break;
    case 2:
        fragment = new PhotosFragment();
        break;
    case 3:
        fragment = new CommunityFragment();
        break;
    case 4:
        fragment = new PagesFragment();
        break;
    case 5:
        fragment = new WhatsHotFragment();
        break;

    default:
        break;
    }

    if (fragment != null) {
        FragmentManager fragmentManager = getFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.frame_container, fragment).commit();

        // update selected item and title, then close the drawer
        mDrawerList.setItemChecked(position, true);
        mDrawerList.setSelection(position);
        setTitle(navMenuTitles[position]);
        mDrawerLayout.closeDrawer(mDrawerList);
    } else {
        // error in creating fragment
        Log.e("MainActivity", "Error in creating fragment");
    }
}

}

查看this教程,它可能会对您有所帮助

答案 1 :(得分:0)

解决方案:

1。我可以在这里考虑2个案例:

  1. 多个片段,单个活动:在这种情况下,当您在片段之间切换时,最好的方法是在replace FrameLayoutcontent_frame个片段。 navigation drawer内容对他们来说仍然相同
  2. 多个片段,多个活动:在这种情况下,您应该定义不同的navigation drawer内容布局,并在活动之间切换时使用setHasOptionsMenu(true)调用。
  3. 2。如果您使用ListView作为navigation drawer,则可以通过动态填充row ListView来轻松完成工作。对于此方案,尽可能避免从BaseActivity覆盖。如果您没有使用ListView作为navigation drawer内容,那么您可以为上面的点 1

    中所写的不同活动定义不同的布局

    3。我认为Google+应用程序使用ListView作为navigation drawer设计的custom。这取决于您的应用程序的需求,您可以使用List,也可以为您的应用程序创建simple自定义布局

    我希望我的解决方案能在某种程度上解决您的疑虑

答案 2 :(得分:0)

1)从NavigationDrawer迁移到SlideMenu(在github上可用)。

2)确保您的BaseActivity完全没有布局。

3)通过ArrayAdapter为您的listview项目充气。

希望有帮助。