导航抽屉:DrawerToggle无效,DrawerList无法监听

时间:2013-11-27 20:37:31

标签: android android-navigation

我正在尝试使用导航抽屉,我已经按照官方开发者网站的每一步,仍然有两个问题:

  • DrawerToggle,按下时,绝对没有任何内容
  • 抽屉中的ListView项目未收到点击事件

其他所有工作(甚至是开放/关闭监听器)。你能帮我找到错误吗?

import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.widget.DrawerLayout;    

public class ActTimerList extends FragmentActivity {


private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;


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

            ---
    configureActionBarAndNavigationDrawer();

    retrieveStuff();
}

private void configureActionBarAndNavigationDrawer(){

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerList = (ListView) findViewById(R.id.drawer_list);
    mDrawerToggle = new ActionBarDrawerToggle(this, /* host Activity */
            mDrawerLayout, /* DrawerLayout object */
            R.drawable.ic_drawer, /* nav drawer icon to replace 'Up' caret */
            R.string.drawer_open, /* "open drawer" description */
            R.string.drawer_close /* "close drawer" description */
            ) {

        /** Called when a drawer has settled in a completely closed state. */
        public void onDrawerClosed(View view) {
            //Some code that works
        }

        /** Called when a drawer has settled in a completely open state. */
        public void onDrawerOpened(View drawerView) {
        }
    };
    // Set the drawer toggle as the DrawerListener
    mDrawerLayout.setDrawerListener(mDrawerToggle);
    mDrawerList.setOnItemClickListener(new ListView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {

            Log.d("Drawer", "Stuff clicked: " + position);  
            mDrawerList.setItemChecked(position, true);
            getActionBar().setTitle(stuff[position].name);
            mDrawerLayout.closeDrawer(mDrawerList);


        }
    });


    getActionBar().setDisplayHomeAsUpEnabled(true);
    getActionBar().setHomeButtonEnabled(true);
}


@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);
    mDrawerToggle.onConfigurationChanged(newConfig);
}

@Override
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;
    }
    // Handle your other action bar items...

    return super.onOptionsItemSelected(item);
}



private void retrieveStuff() {

            query.findInBackground(new FindCallback<ParseObject>() { //Parse API to retrieve stuff, async
        public void done(List<ParseObject> stuffList, ParseException e) { //Callback for when the query completes
            if (e == null) {
            //This works, stuff is being loaded and the adapter is set correctly
                mDrawerList.setAdapter(new StuffAdapter(context,
                        R.layout.item_stuff, stuff));
                ---
            } 
        }
    });
}

3 个答案:

答案 0 :(得分:1)

解释错误:什么不能正常工作?

这里有一些我的片段:

    mDrawerToggle = new ActionBarDrawerToggle(
            this, 
            mDrawerLayout, 
            R.drawable.ic_drawer, 
            R.string.drawer_open,
            R.string.drawer_close) {

        public void onDrawerClosed(View view) {
            getSupportActionBar().setTitle(mTitle);
            supportInvalidateOptionsMenu();
        }

        public void onDrawerOpened(View view) {
            getSupportActionBar().setTitle(mDrawerTitle);
            supportInvalidateOptionsMenu();
        }
    };

    mDrawerLayout.setDrawerListener(mDrawerToggle);

关于ListView Listener:

    mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

和听众:

    private class DrawerItemClickListener implements ListView.OnItemClickListener {
         @Override
         public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
              selectItem(position);
         }
    }

selectItem():

  private void selectItem(int position) {
    FragmentManager fragmentManager = getSupportFragmentManager();


    fragmentTrnsaction = fragmentManager.beginTransaction();

    switch (position) {

    case 0:
        <some code>
        break;
    case 1:
        <some code>
        break;

    case 2:
        <some code>
        break;

    case 3:
        <some code>
        break;

    default:
        break;
    }


    mDrawerList.setItemChecked(position, true);

    mDrawerLayout.closeDrawer(mDrawerList);
}

答案 1 :(得分:0)

我没看到你流行的导航抽屉在哪里。可能这是问题所在?在抽屉布局初始化结束时考虑使用以下片段

getFragmentManager().beginTransaction().add(R.id.left_drawer, new MenuFragment(), "menu").commit();

MenuFragment是我的自定义片段,用于准备抽屉ui。实施取决于您。如果您在菜单中有一组简单的项目,请考虑使用ListFragment

您的活动的布局示例应该包含:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/drawer_layout"
    tools:context=".activities.MainActivity">

    <!-- Your awesome content here -->

    <FrameLayout android:id="@+id/left_drawer"
              android:layout_width="240dp"
              android:layout_height="match_parent"
              android:layout_gravity="start"
              android:choiceMode="singleChoice" />
</android.support.v4.widget.DrawerLayout>

答案 2 :(得分:0)

在您的选择方法中,您没有正确启动片段

private void selectItem(int position)  
{    
     FragmentManager fragmentManager = getSupportFragmentManager();

     fragmentTrnsaction = fragmentManager.beginTransaction();

------&GT;&GT;&GT;使用完毕后

fragmentTrnsaction.add() or replace() method.