导航抽屉无法关闭。

11
我的应用程序中的导航抽屉无法关闭。我正在使用活动而非片段。当我点击列表视图中的任何项时,它会像应该一样打开其他活动,但是当我返回时,抽屉仍然打开。我尝试使用DrawerLayout.closeDrawers();但它没有起作用。如何关闭导航抽屉?以下是我的代码:
public class MainActivity extends FragmentActivity {
final String[] data ={"Aluminium","Gold","Zinc"};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data);

    final DrawerLayout drawer = (DrawerLayout)findViewById(R.id.drawer_layout);
    final ListView navList = (ListView) findViewById(R.id.left_drawer);
    navList.setAdapter(adapter);
    navList.setOnItemClickListener(new AdapterView.OnItemClickListener(){
        @Override
        public void onItemClick(AdapterView<?> parent, View view, final int pos,long id){

            switch (pos){
                case 0:
                    Intent i = new Intent(MainActivity.this,Aluminium.class);
                    startActivity(i);
                    break;
                case 1:
                    Intent i2 = new Intent(MainActivity.this,Gold.class);
                    startActivity(i2);
                    break;
                case 2:
                    Intent i3 = new Intent(MainActivity.this,Zinc.class);
                    startActivity(i3);
                    break;
            }
        }
    });
}
}

XML

<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:orientation="horizontal"
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:background="#000000"
    android:layout_height="match_parent" >
</FrameLayout>

<ListView android:id="@+id/left_drawer"
    android:layout_width="220dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:choiceMode="singleChoice"
    android:divider="@android:color/transparent"
    android:dividerHeight="1dp"
    android:background="#000000"/>
</android.support.v4.widget.DrawerLayout>

你能展示一下你在哪里以及如何尝试使用drawer.closeDrawer()吗? - fweigl
11个回答

7

您尝试过:

mDrawerLayout.closeDrawer(drawerListView);

在调用 startActivity() 之前,您可以添加这段代码。

不知道为什么closeDrawers不起作用,但是closeDrawer(Gravity...)可以,所以谢谢你给了我需要的线索,我不知道还有更多的方法。 - cutiko

5

延续其他答案和@Chinmay Dabke在评论中提出的“抽屉关闭一半然后暂停,然后完全关闭”的问题,以下是您可以做的:

首先像其他人建议的那样, 这行代码缺失:drawer.closeDrawer(navList);

至于抽屉关闭时暂停的问题,您可以像这样使用Runnable和Handler:

mRunnable = = new Runnable() {
    @Override
    public void run() {
         //say
         selectItem(pos); //Implement your switch case logic in this func
    }
}

然后在重写的 onDrawerClosed 方法中:

@Override
public void onDrawerClosed(View view) {

if (mRunnable != null) {
    mHandler.post(mRunnable);
    mRunnable = null;
}
}

希望这能有所帮助!

我建议您使用片段来进行导航抽屉,并解决抽屉关闭不当的问题,我发现这篇文章非常有用(使用片段)。http://www.michenux.net/android-asynctask-in-fragment-best-pratices-725.html


我将可运行的初始化放在了onclick事件中,这样它就可以从行中获取所需的内容。然后像droidx一样,在onDrawerClosed中放置了post。优美地解决了卡顿问题。 - George Baker

4

调用

drawer.closeDrawer(navList);

onItemClick()方法中。

4

尝试使用以下代码:

drawer.closeDrawer(Gravity.START);

因为你的drawer重力是start,所以使用它来关闭相应的drawer


3

我没有看到任何关闭ListView的代码... 在ListItem点击时关闭ListView抽屉...

    navList.setOnItemClickListener(new AdapterView.OnItemClickListener(){
        @Override
        public void onItemClick(AdapterView<?> parent, View view, final int pos,long id){
            drawer.closeDrawer(navList);
            switch (pos){
                case 0:
                    Intent i = new Intent(MainActivity.this,Aluminium.class);
                    startActivity(i);
                    break;
                case 1:
                    Intent i2 = new Intent(MainActivity.this,Gold.class);
                    startActivity(i2);
                    break;
                case 2:
                    Intent i3 = new Intent(MainActivity.this,Zinc.class);
                    startActivity(i3);
                    break;
            }
        }
    });

谢谢Gopal,它起作用了!但是它只关闭了一半,然后暂停了一下,然后完全关闭了。我该怎么办? - Chinmay Dabke
@ChinmayDabke 将 drawer.closeDrawer(navList) 语句移动到 switch 语句后面,也就是在启动 Activity 后面。 - Gopal Gopi
我在 <startActivity(i)> 后面写了 <drawer.closeDrawer(navList)>,但它仍然暂停!请帮忙。 - Chinmay Dabke
@ChinmayDabke 有意让抽屉布局在关闭时不会暂停...可能是应用程序线程在UI上执行一些工作,比如启动Activity,这会使抽屉暂停一小段时间... - Gopal Gopi

2

当单击列表项时,您需要关闭抽屉。

drawer.closeDrawer(navList);

同时,您的XML中使用FrameLayout有什么用处。它并不用作添加或替换片段的容器。

我正在使用导航抽屉来在不同的活动之间切换。 - Chinmay Dabke
@ChinmayDabke 那又怎样? - Raghunandan
没有我刚才提到的任何内容。不是有意冒犯您! - Chinmay Dabke
@ChinmayDabke 我在问如果你关闭抽屉会发生什么? - Raghunandan
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/45642/discussion-between-chinmay-dabke-and-raghunandan - Chinmay Dabke
显示剩余3条评论

2
在switch case之前调用drawer.closeDrawer(navList)函数。

谢谢Mohan!但它只关闭了一半,然后暂停了一下,然后完全关闭了。我该怎么办? - Chinmay Dabke

1
private DrawerLayout mDrawerLayout;
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerLayout.closeDrawers();

它有效


1
使用。
if(drawer.isDrawerOpen(navList))  
  {  
      drawer.closeDrawer(navList);      
  }

在onResume()和onItemClick()方法的开头。 或者你可以尝试另一种方法...当你选择抽屉项时运行一个UI线程。
private void selectDrawerItemItem(final int position){

     //Toast.makeText(getApplicationContext(), "ItemClicked", Toast.LENGTH_SHORT).show();

     darwer.closeDrawer(navList);

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            Fragment fragment = new Fragment(Activity.this);
            Bundle args = new Bundle();
            args.putInt(Fragment.ARG_PLANET_NUMBER, position);
            fragment.setArguments(args);

            FragmentManager fragmentManager = getSupportFragmentManager();
             fragmentManager.beginTransaction().replace(R.id.content_frame,fragment).commit();

            // update selected item and title, then close the drawer
            navList.setItemChecked(position, true);

            setTitle(" " + navListTitles[position]);
        }
    }, 200);


    // update the main content by replacing fragments


}

1
我遇到了同样的问题。

我使用了

mDrawerLayout.closeDrawer(drawerListView);

在开始我的新活动之前,它会优美地将抽屉滑回。

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