从左侧滑动时导航抽屉没有打开

时间:2015-01-31 12:32:41

标签: android android-fragments navigation-drawer

正如Android开发者的页面所说

  

用户可以通过从屏幕左边缘滑动或触摸操作栏上的应用程序图标将导航抽屉带到屏幕上。

但奇怪的是,我的活动中的导航抽屉没有响应滑动动作。仅在触摸操作栏上的图标时才会切换。下面是我对导航抽屉的实现

 mNavigationDrawerFragment = (NavigationDrawerFragment)
            getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);

    // Set up the drawer.
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mNavigationDrawerFragment.setUp(
            R.id.navigation_drawer,
            drawerLayout);

这有什么可能的解释吗?我怀疑的是默认情况下我的活动有一个片段的布局。那是什么原因?

编辑:我的活动的布局文件

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainPage">

<!-- The main ocntent view -->
<FrameLayout android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</FrameLayout>


<!-- The navigation drawer-->
<fragment android:id="@+id/navigation_drawer"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:divider="@android:color/transparent"
    android:name="com.example.android.handsfree.NavigationDrawerFragment"
    tools:layout="@layout/fragment_navigation_drawer" />

5 个答案:

答案 0 :(得分:1)

你的'NavigationDrawerFragment'已经在它的`setUp'方法中为你创建了一个抽屉切换。

你应该在'主页'活动中创建一个新的。


注意: 您可以在android.support.v7.app.ActionBarDrawerToggle内使用NavigationDrawerFragment代替 v4


更新

现在问题似乎已经解决了。有两个问题:

  1. OP在其MainPage - 活动中创建了第二个抽屉切换,但在NavigationDrawerFragment的setUp方法中已经创建了一个,由MainPage调用以设置抽屉。 (这基本上是将抽屉里的东西抽到抽屉里。)
  2. OP通过调用将DrawerLockMode设置为onCreateOptionsMenu的方法将抽屉锁定在LOCK_MODE_LOCKED_CLOSED内。他从未恢复过这种变化。

答案 1 :(得分:0)

您应该使用:

drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);

答案 2 :(得分:0)

<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:background="@color/white" >

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

<ListView
    android:id="@+id/listview_drawer"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:background="@color/drawer"
    android:choiceMode="singleChoice" />

关于您的活动

drawlayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    listData = (ListView) findViewById(R.id.listview_drawer);

    drawlayout.setDrawerShadow(R.drawable.drawer_shadow,
            GravityCompat.START);

答案 3 :(得分:0)

在您的活动类中添加以下字段:

private ActionBarDrawerToggle mDrawerToggle;
private DrawerLayout mDrawerLayout;

然后,在你的活动中:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ...
    // enabling action bar app icon and behaving it as toggle button
    getActionBar().setDisplayHomeAsUpEnabled(true);
    getActionBar().setHomeButtonEnabled(true)

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                R.drawable.ic_drawer, //nav menu toggle icon
                R.string.app_name, // nav drawer open - description for accessibility
                R.string.app_name // nav drawer close - description for accessibility
        ){
            public void onDrawerClosed(View view) {
                // calling onPrepareOptionsMenu() to show action bar icons
                invalidateOptionsMenu();
            }

            public void onDrawerOpened(View drawerView) {
                // calling onPrepareOptionsMenu() to hide action bar icons
                invalidateOptionsMenu();
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // toggle nav drawer on selecting action bar app icon/title
    if (mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

/**
 * When using the ActionBarDrawerToggle, you must call it during
 * onPostCreate() and onConfigurationChanged()...
 */

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    // Sync the toggle state after onRestoreInstanceState has occurred.
    mDrawerToggle.syncState();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    // Pass any configuration change to the drawer toggls
    mDrawerToggle.onConfigurationChanged(newConfig);
}

ic_drawer.png图片,位于可绘制资源中。您可以在Google上搜索此图片。

要使用的API级别为11 +。

希望它对你有所帮助。

答案 4 :(得分:0)

1-替换标签:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainPage">

    <!-- The main ocntent view -->
    <FrameLayout android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </FrameLayout>


    <!-- The navigation drawer-->
    <ListView android:id="@+id/navigation_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:divider="@android:color/transparent" />
    </android.support.v4.widget.DrawerLayout>

2-在onCreate函数中使用此代码你可以使用v4 ActionBarDrawerToggle或v7她使用v4:

private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mDrawerToggle;

mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

mDrawerToggle = new ActionBarDrawerToggle(this,    mDrawerLayout,R.drawable.ic_drawer,
R.string.app_name,R.string.app_name) {
                    public void onDrawerClosed(View view) {
                        getActionBar().setTitle(mTitle);
                        invalidateOptionsMenu();
                    }

                    public void onDrawerOpened(View drawerView) {
                        getActionBar().setTitle(mDrawerTitle);
                        invalidateOptionsMenu();
                    }
                };
                mDrawerLayout.setDrawerListener(mDrawerToggle);