从左边滑动时,导航抽屉未能打开

6

正如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" />


请查看@Xyaren的编辑。 - rrrocky
不。我可以通过触摸操作栏上的图标或触摸导航抽屉外部的内容来关闭抽屉。 - rrrocky
你的主页Activity继承了哪个类? 你能否将你的NavigationDrawerFragment的代码发布一下(可以使用Pastebin,因为它可能会很长)? - Xyaren
MainPageµ¡úÕ£¿µë®Õ▒òActionBarActivityÞ┐ÖÚçîµÿ»NavigationDrawerFragmentþ▒╗ÒÇé - rrrocky
“NavigationDrawerFragment” 对我来说看起来很好。你正在使用支持工具栏,对吗?我在布局中看不到它?容器中是否显示任何“特殊”的内容?你介意提供你的“MainPage”代码吗? - Xyaren
显示剩余3条评论
5个回答

1
你的 ´NavigationDrawerFragment´ 已经在其 `setUp´ 方法中为您创建了一个抽屉 Toggle。
你不应该在你的 ´MainPage´ Activity 中创建一个新的。

注意: 您可以在NavigationDrawerFragment中使用android.support.v7.app.ActionBarDrawerToggle代替v4版本。


更新:

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

  1. 原帖创建了一个第二个抽屉切换在它的 MainPage - Activity 中,但是已经在 NavigationDrawerFragment 的 setUp 方法中创建了一个,该方法由 MainPage 调用以设置抽屉。 (这基本上是将一些抽屉内容外包给抽屉片段。)
  2. 原帖在 onCreateOptionsMenu 中锁定了抽屉,通过调用将 DrawerLockMode 设置为 LOCK_MODE_LOCKED_CLOSED 的方法。他从未恢复此更改。

你的工具栏在布局中的哪里? 在上面的评论中,你说你正在使用Toolbar小部件。android.support.v7.widget.Toolbar - Xyaren
支持库使用自己的工具栏视图/小部件,而不是使用Android ActionBar(请参见我的布局示例此处)。 - Xyaren
我猜仅仅导入它并不是唯一需要做的事情,对吧?我该如何“使用”支持库? - rrrocky
应用程序强制关闭。日志信息:01-31 19:27:25.206 10313-10313/com.example.android.effectivenavigation E/AndroidRuntime﹕ FATAL EXCEPTION: main java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android.effectivenavigation/com.example.android.handsfree.MainPage}: java.lang.NullPointerException at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2218) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2268) - rrrocky
编辑:我使用日志消息发现在切换状态更改期间,MainPage的切换方法实际上被调用,而不是NavigationDrawerFragment中的方法。 - rrrocky
显示剩余6条评论

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

这会如何解决问题? OP使用的抽屉片段非常好。 - Xyaren
是的。Android开发者文档中提到我们可以使用ListView,但这并不是唯一的方法。 - rrrocky
所以你需要使用ActionBarDrawableToggle,这样你就可以使用任何其他布局而不是ListView。 - Akash
它适用于API-21。 - Akash

0

在你的 activity 类中添加这些字段:

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

希望对您有所帮助。


你所使用的ActionBarDrawerToggle构造函数是针对v4.app.ActionBarDrawerToggle的。而我所使用的是v7.app.ActionBarDrawerToggle。因此,没有可用于drawable的参数。 这里是链接。 - rrrocky
有什么区别或优势吗? - Anggrayudi H

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

我使用的是v7版本。但除此之外,我看不出你的代码和我的代码有什么区别。 - rrrocky

0

你应该使用:

drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);


2
抽屉在创建后默认应该是解锁状态。 - Xyaren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接