使用DrawerLayout处理主页按钮单击事件

时间:2017-07-14 11:59:06

标签: android android-fragments android-actionbar android-toolbar drawerlayout

[UPDATE]

我已经更改了activity_main.xmlMainActivity.class,如下所示:Creating a Navigation Drawer,来自Android开发人员指南,现在效果非常好。

我正在为DrawerLayout使用MainActivity,其中包含FrameLayout只是为了设置不同的Fragments,但我无法处理其点击次数。它工作,菜单打开和关闭,但我不知道如何或在何处管理它们。这是我的代码:

toolbar.xml

<android.support.v7.widget.Toolbar 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?attr/actionBarSize"/>

activity_main.xml中

<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:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:openDrawer="start">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/ll_main_layout"
        android:orientation="vertical">

        <include layout="@layout/toolbar"
            android:id="@+id/toolbar"/>

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

    <android.support.design.widget.NavigationView
        android:id="@+id/navigation_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <include layout="@layout/lateral_menu_header" />

            <ListView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:id="@+id/lateral_menu_listView"
                android:layout_marginTop="16dp"
                android:divider="@android:color/transparent"
                android:dividerHeight="0dp"/>
        </LinearLayout>
    </android.support.design.widget.NavigationView>
</android.support.v4.widget.DrawerLayout>

MainActivity.class

public class MainActivity extends AppCompatActivity
        implements ListView.OnItemClickListener {

    private static final String LOG_TAG = MainActivity.class.getSimpleName();
    private static final String CURRENT_FRAGMENT = "mCurrentFragment";

    private DrawerLayout mDrawerLayout;
    private ActionBarDrawerToggle mDrawerToggle;
    private ListView mDrawerList;
    private ArrayList<LateralMenuItem> lateralMenuItems;

    private Toolbar mToolbar;
    public ActionBar mActionBar;

    private FragmentManager mFragmentManager;


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

        initToolbar();
        initLateralMenu();

        mFragmentManager = getSupportFragmentManager();
    }

    private void initLateralMenu() {
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (mDrawerLayout != null) {
            mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, mToolbar, 0, 0);
            mDrawerToggle.syncState();

            mDrawerLayout.addDrawerListener(mDrawerToggle);

            mDrawerList = (ListView) findViewById(R.id.lateral_menu_listView);
            if (mDrawerList != null) {
                lateralMenuItems = initLateralMenuList();

                LateralMenuListAdapter lateralMenuListAdapter = new LateralMenuListAdapter(MainActivity.this, lateralMenuItems);
                mDrawerList.setAdapter(lateralMenuListAdapter);

                mDrawerList.setOnItemClickListener(this);
            }
        }
    }

    private void initToolbar() {
        mToolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(mToolbar);

        mActionBar = getSupportActionBar();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if(mDrawerToggle.onOptionsItemSelected(item)) {
            // THIS DOESN'T WORK, I'VE DEBUGGED AND IS UNREACHABLE
        }
        return super.onOptionsItemSelected(item);
    }
}

问题是onOptionesItemSelected(MenuItem item)无效。我还尝试设置mDrawerToggle.setToolbarNavigationClickListener(...)mToolbar.setOnMenuItemClickListener(...)mToolbar.setNavigationOnClickListener(),但没有一个有效。

我的目标是处理我在一个或另一个Fragment时将主页按钮设置为向上并可以覆盖onBackPressed()

使用DrawerLayout时,逻辑可能有所不同,我错过了什么吗?

2 个答案:

答案 0 :(得分:0)

Column A

试试这个

答案 1 :(得分:0)

您正在使用带有自定义列表视图的NavigationView,并且您将$_SESSION提供给列表视图而不是NavigationView,因此呼叫将转到

setOnItemClickListener

但我不确定你班上的这段代码在哪里。

对于你的情况,回调将来到@Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { } 而不是onNavigationItemSelected。

如果您有任何疑问,请告诉我。