NavigationDrawer和ViewPager在Android中的同一个Activity中

时间:2013-12-16 11:28:31

标签: android actionbarsherlock android-viewpager navigation-drawer drawerlayout

我正在尝试创建一个NavigationDrawer,并在使用ActionBarSherlock的活动中使用带有滑动标签的ViewPager。我有标签,我已经为视图寻呼机和抽屉布局创建了布局。我知道我所拥有的是viewpager布局和drawerlayout是在单独的文件中,它们应该在同一个文件中以查找视图。虽然我不知道如何使用我的代码执行此操作。

我已经做了很多研究,如何做到这一点,标准模式是不这样做,虽然很多人都指出,谷歌播放音乐这样做。我希望我的应用程序看起来像这样,我知道有一个解决方法正如人们所建议的那样。我只是不确定解决方法如何与ActionBarSherlock以及我目前已实现的代码一起使用。请任何人都可以帮助我。提前谢谢。

这是我的活动代码:

public class SlidingTabsActivity extends SherlockFragmentActivity
{
private ViewPager viewPager;
private TabsAdapter tabsAdapter;
private ActionBar actionBarTabs;

/* Navigation drawer */
private DrawerLayout drawerLayout;
private ListView drawerListView;
private ActionBarDrawerToggle drawerToggle;

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);

    viewPager = new ViewPager(this);
    viewPager.setId(R.id.pager);
    setContentView(viewPager);

    /* Navigation Drawer */
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawerListView = (ListView) findViewById(R.id.left_drawer);

    System.out.println("Drawer Layout test:" + drawerLayout.getId());

    drawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
    drawerListView.setAdapter(new ArrayAdapter<String>(this, R.layout.navigation_drawer_list_item, R.array.navigation_drawer_list));
    drawerListView.setOnItemClickListener(new OnItemClickListener()
    {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
        {
            // TODO Auto-generated method stub

        }
    });

    actionBarTabs = getSupportActionBar();
    actionBarTabs.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    actionBarTabs.setDisplayHomeAsUpEnabled(true);
    actionBarTabs.setHomeButtonEnabled(true);

    drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close)
    {
        public void onDrawerClosed(View view) 
        {
            invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        }

        public void onDrawerOpened(View drawerView) 
        {
            invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        }
    };
    drawerLayout.setDrawerListener(drawerToggle);

    tabsAdapter = new TabsAdapter(this, viewPager); // Declares the tabs adapter class with the view pager view 

    /* Adds fragments to the tabs adapter */
    tabsAdapter.addTab(actionBarTabs.newTab().setText("PV"), Fragment_1.class, null);
    tabsAdapter.addTab(actionBarTabs.newTab().setText("CONFIG"), Fragment_2.class, null);
    tabsAdapter.addTab(actionBarTabs.newTab().setText("DIAG"), Fragment_3.class, null); 
}

这是我的DrawerLayout布局xml代码:

<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">

<FrameLayout
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<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>

这是我的ViewPager布局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=".SlidingTabsActivity" >

<android.support.v4.view.ViewPager
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/pager" />

</RelativeLayout>

1 个答案:

答案 0 :(得分:1)

首先,您的Activity同时具有Navigation Drawer和ViewPager,但我看到您将布局描述放在不同的xml文件中。但是,您必须只为活动添加一个xml文件。

考虑到这一点,现在的关键点是:“如何在同一个xml中声明DrawerLayout和ViewPager?”。如果你输入错误的顺序它将无法工作(我有同样的问题,这就是为什么我警告你)。因此,答案是将DrawerLayout声明为root用户并在其中,ViewPager,然后在关闭ViewPager“tag”之后,声明DrawerLayout的ListView。

一个例子:

<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">

<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</android.support.v4.view.ViewPager>

<ListView android:id="@+id/drawer_list"
    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>

我希望答案可以帮助你。