0

我使用 ActionBarDrawerToggle 打开和关闭 DrawerLayout。但是我的抽屉布局中的 listView 没有显示。

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerList = (ListView) mDrawerLayout.findViewById(R.id.left_drawer);

    mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
    mDrawerList.setBackgroundColor(getResources().getColor(R.color.abs__background_holo_light));
    mDrawerList.setAdapter(menuAdapter);

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_navigation_drawer, 
            R.string.open, R.string.close) {

        /** Called when a drawer has settled in a completely closed state. */
        public void onDrawerClosed(View view) {
            invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        }

        /** Called when a drawer has settled in a completely open state. */
        public void onDrawerOpened(View drawerView) {
            invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        }
    };

 // Set the drawer toggle as the DrawerListener
    mDrawerLayout.setDrawerListener(mDrawerToggle);        

它只显示一个没有条目的黑色抽屉。抽屉列表应该是白色的,如“setBackgroundColor”中设置的那样,抽屉列表应该显示来自适配器的条目。

当我用 openDrawer(mDrawerList) 打开抽屉时,它可以工作,但不能滑动。

    public boolean onOptionsItemSelected(MenuItem item) {
    // Pass the event to ActionBarDrawerToggle, if it returns
    // true, then it has handled the app icon touch event
    //if (mDrawerToggle.onOptionsItemSelected(item)) {
    //          return true;
    //}

    switch (item.getItemId()) {
    case android.R.id.home:
        if (mDrawerLayout.isDrawerOpen(mDrawerList)) {
            mDrawerLayout.closeDrawer(mDrawerList);
        } else {
            mDrawerLayout.openDrawer(mDrawerList);
        }
        break;

这是带有 DrawerLayout 的 main.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" >

<!-- The main content -->

<fragment
    android:id="@+id/activeRemindersList"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    class="com.colapps.reminder.fragments.ActiveRemindersFragment" />

<!-- The navigation drawer -->

<ListView
    android:id="@+id/left_drawer"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:background="#111"
    android:choiceMode="singleChoice"
    android:divider="@android:color/transparent"
    android:dividerHeight="0dp" />

有人可以帮忙吗?

更新:

问题似乎是片段。如果我添加一个简单的 FrameLayout 而不是 Fragment,则一切正常:

<!-- The main content -->

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="0dp" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Test" />
</FrameLayout>

<!-- The navigation drawer -->

<ListView
    android:id="@+id/left_drawer"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:background="#111"
    android:choiceMode="singleChoice"
    android:divider="@android:color/transparent"
    android:dividerHeight="0dp" />
4

3 回答 3

1

问题解决了!

问题是在片段布局中也是一个“抽屉布局”。

我改变了很多,忘记从片段布局中删除它。

感谢所有试图帮助我的人。

于 2013-08-18T18:30:56.600 回答
0

我很确定这与以下任何一项有关:

  • ListView 没有权重属性
  • ListView 适配器为
  • ListView 被Fragment 隐藏

尝试更改layot 文件,使ListView 也具有权重属性,并更改Fragment 的height 属性。此外,将它们都放在LinearLayout中。

还要确保在 Activity 中覆盖了这些方法:

/**
 * 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);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // The action bar home/up action should open or close the drawer.
    // ActionBarDrawerToggle will take care of this.
    if (mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    } else
        return false;
}

更新:

使用onDrawerItemSelected(int pos)方法添加/替换 Fragments。

@Override
public void onDrawerItemSelected(int pos) {     

     // update the main content by replacing fragments
    Fragment fragment = null;

    switch (pos) {
    case 0:         
        fragment = new FragOne();
        break;
    case 1:
        fragment = new FragTwo();
        break;
    case 2:
        fragment = new FragThree();
        break;
    }
    // R.id.content_frame is the id of the FrameLayout
    getFragmentManager().beginTransaction().replace(R.id.content_frame, fragment).commit() 

    // update selected item then close the drawer
    mDrawerList.setItemChecked(pos, true);
    mDrawerLayout.closeDrawer(mDrawerList);
}

在这里,您有一个详细的教程/示例,说明如何实现 NavigationDrawer。当我第一次使用 NavigationDrawer 时,我通过了本教程并能够成功实现它。

http://developer.android.com/training/implementing-navigation/nav-drawer.html

于 2013-08-18T12:52:09.917 回答
0

我认为您的 XML 中缺少 a <FrameLayout>(请注意我包装了片段内容的那个)。

它应该看起来像这样:

<android.support.v4.widget.DrawerLayout
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="fill_parent" >

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

        <fragment
            android:id="@+id/app_info_fragment_phone"
            ... />
    </FrameLayout>

    <ListView
        android:id="@+id/drawer"
        ... />

</android.support.v4.widget.DrawerLayout>
于 2013-08-18T15:55:40.970 回答