使用一个导航抽屉显示不同的选项,具体取决于当前显示的活动

时间:2014-05-19 12:55:59

标签: java android navigation navigation-drawer

我正在尝试在BaseActivity中实现导航抽屉,根据当前显示的活动显示不同的选项。为此,我开发了一个BaseActivity,它实现了导航抽屉,并决定要显示的内容,具体取决于当前显示的活动。这样做的目的是使所有其他活动需要使用导航抽屉,扩展BaseActivity。

以下代码显示没有错误,但导航抽屉显示自己完全为空,并且在我点击“主页”时未显示。按钮,'菜单'按钮,我使用' onKeyDown'实现的功能。方法。它只是显示,当我使用以下手势时:将手指从屏幕左侧的左侧移动到右侧。

当我在我需要的每个类中执行相同操作时,不是使用BaseActivity,一切都很好。

我已经尝试了好几天了,我仍然不明白为什么,导航抽屉的内容仍未显示。我很感激一些帮助。提前谢谢。

这里是问题的核心类:

BaseActivity.java

public abstract class BaseActivity extends ActionBarActivity
{
    public DrawerLayout drawerLayout = null;
    public ActionBarDrawerToggle drawerToggle = null;
    public Activity currentActivity = null;
    public ArrayList<Item> navDrawerItems = new ArrayList<Item>();
    public ItemListAdapter adapter = null;
    public ListView drawerList = null;
    int id = 0;

    protected void onCreate(Bundle savedInstanceState, int resLayoutID)
    {
        super.onCreate(savedInstanceState);
        setContentView(resLayoutID);
        currentActivity = this;

        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawerToggle = new ActionBarDrawerToggle(currentActivity,
                                                 drawerLayout,
                                                 R.drawable.ic_drawer,
                                 R.string.open_menu,
                                 R.string.close_menu)
        {
            public void onDrawerClosed(View view)
            {
                Log.e("", "Close drawer");
                getSupportActionBar().setTitle(getTitle());
                ActivityCompat.invalidateOptionsMenu(currentActivity);
            }

            public void onDrawerOpened(View drawerView)
            {
                Log.e("", "Open drawer");
                getSupportActionBar().setTitle(getTitle());
                ActivityCompat.invalidateOptionsMenu(currentActivity);
            }
        };

        drawerLayout.setDrawerListener(drawerToggle);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);

        // Populate navigation drawer depending on the activity
        // that is currently showing.
        if (this.getClass().getSimpleName().equals("Z"))
            setUpNavigationForZActivity();
    }

    private void setUpNavigationForZActivity()
    {
        Log.e("", "In setUpNavigationForZActivity");

        // Prepare list items.
        id = R.string.title_activity_A;
        navDrawerItems.add(new NavigationDrawerItem(getString(id), Utils.activityIcon().get(id)));
        id = R.string.title_activity_B;
        navDrawerItems.add(new NavigationDrawerItem(getString(id), Utils.activityIcon().get(id)));

        // Populate view.
        drawerList = (ListView) findViewById(R.id.left_menu);
        adapter = new ItemListAdapter(currentActivity, navDrawerItems;
        drawerList.setAdapter(adapter);
        drawerList.setOnItemClickListener(new OnItemClickListener()
        {
            public void onItemClick(AdapterView<?> parent, View view, int position,
                               long id)
            {
                Intent intent = null; 
                switch(position)
                {
                    case 0:
                        intent = new Intent(currentActivity, A.class);
                        startActivity(intent)
                        break;
                    case 1:
                        intent = new Intent(currentActivity, B.class);
                        startActivity(intent)
                        break;
                    default:
                }
            }
        });
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        if (drawerToggle.onOptionsItemSelected(item))
            return true;
        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState)
    {
        super.onPostCreate(savedInstanceState);
        drawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig)
    {
        super.onConfigurationChanged(newConfig);
        drawerToggle.onConfigurationChanged(newConfig);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent e)
    {
        Log.e("", "onKeyDown");
        if (keyCode == KeyEvent.KEYCODE_MENU)
        {
            if(!drawerLayout.isDrawerOpen(Gravity.LEFT))
                drawerLayout.openDrawer(Gravity.LEFT);
            else
                drawerLayout.closeDrawer(Gravity.LEFT);
        }
        return super.onKeyDown(keyCode, e);
    }
}

Z.java

public class Z extends BaseActivity
{   
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState, R.layout.Z);
        setContentView(R.layout.Z);

        //Other things to do...
    }
}

Z.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" >

    <!-- Main content view -->

    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:fillViewport="true" >

        // Other layout and views configurations...
    </ScrollView>

    <!-- Navigation drawer -->
    <ListView
        android:id="@+id/left_menu"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="@color/gray_7_5"
        android:choiceMode="singleChoice" />

</android.support.v4.widget.DrawerLayout>

1 个答案:

答案 0 :(得分:0)

我不知道你为什么要这样实现它但是如果你仍然想这样做我会建议让你的导航器使用带有适配器的listview来从数组中绘制项目然后拥有你的基础activity有一个getData()调用,你可以在派生的活动中覆盖它,它将提供适配器的数据,以便listview随后在navdrawer中绘制相应的项目。然后,您必须为每个活动的每个列表视图实现onItemClick事件。