通过多个活动导航项目选择状态

时间:2017-03-13 02:25:32

标签: android navigation-drawer android-navigation-drawer

Gif of problem

我有一个有效的导航抽屉来完成多项活动,我希望在更改活动后突出显示当前导航项目。如何在 onCreateDrawer 中将项目选定的监听器保存到整个应用程序中,并在其他所有活动上重新创建?

如果您需要任何其他相关活动或有任何反馈,请不要犹豫,放纵我!

BaseActivity

public class BaseActivity extends AppCompatActivity {

public NavigationView mNavigationView;
protected ActionBarDrawerToggle mToggle;
protected Toolbar mToolbar;
public DrawerLayout mDrawerLayout;

protected void onCreateDrawer() {
    //Instantiate Navigation Drawer
    setupNavDrawer();

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

    if (id == R.id.logout) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

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

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


//Set up Navigation Drawer
private void setupNavDrawer() {

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mToolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);
    mNavigationView= (NavigationView) findViewById(R.id.navigation_view);

    setSupportActionBar(mToolbar);
    mToggle = new ActionBarDrawerToggle(this, mDrawerLayout, mToolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    mDrawerLayout.setDrawerListener(mToggle);

    mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull final MenuItem item) {
            mDrawerLayout.closeDrawers();

            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    switch (item.getItemId()){
                        case R.id.nav_home:
                            Intent intent0 = new Intent(BaseActivity.this, Home.class);
                            startActivity(intent0.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION));
                            mNavigationView.setCheckedItem(R.id.nav_home);

                            break;

                        case R.id.nav_settings:
                            Intent intent1 = new Intent(BaseActivity.this, Settings.class);
                            startActivity(intent1.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION));
                            mNavigationView.setCheckedItem(R.id.nav_settings);

                            break;

                        case R.id.nav_selection:
                            Intent intent2 = new Intent(BaseActivity.this, Selection.class);
                            startActivity(intent2.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION));
                            mNavigationView.setCheckedItem(R.id.nav_selection);

                            break;

                        case R.id.nav_privacy_policy:
                            Intent intent3 = new Intent(BaseActivity.this, PrivacyPolicy.class);
                            startActivity(intent3.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION));
                            mNavigationView.setCheckedItem(R.id.nav_privacy_policy);

                            break;

                        default:
                            Intent intent4 = new Intent(BaseActivity.this, Home.class);
                            startActivity(intent4.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION));
                            mNavigationView.setCheckedItem(R.id.nav_home);

                            break;
                    }
                }
            }, 225);
            return true;
        }
    });
}

}

public class Home extends BaseActivity {

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

选择

public class Selection extends BaseActivity {

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

    super.onCreateDrawer();
}

Activity_Home.XML

<LinearLayout
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:id="@+id/layout_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

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

    <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:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">


        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                        xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:paddingLeft="@dimen/activity_horizontal_margin"
                        android:paddingRight="@dimen/activity_horizontal_margin"
                        android:paddingTop="@dimen/activity_vertical_margin"
                        android:paddingBottom="@dimen/activity_vertical_margin" >


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

        </RelativeLayout>

        <android.support.design.widget.NavigationView
            android:id="@+id/navigation_view"
                  android:layout_width="wrap_content"
                  android:layout_height="match_parent"
                  android:layout_gravity="start"
                  android:choiceMode="singleChoice"
                  android:divider="@android:color/transparent"
                  android:dividerHeight="0dp"
                  android:background="#FFFF"
            app:headerLayout="@layout/nav_header"
            app:menu="@menu/drawer_menu"/>

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

Activity_Selection.XML

<LinearLayout
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:id="@+id/layout_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

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

    <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:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.app.navigationdrawer.Teste">


        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                        xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:paddingLeft="@dimen/activity_horizontal_margin"
                        android:paddingRight="@dimen/activity_horizontal_margin"
                        android:paddingTop="@dimen/activity_vertical_margin"
                        android:paddingBottom="@dimen/activity_vertical_margin" >



            <TextView android:text="Selection" android:layout_width="wrap_content"
                      android:layout_height="wrap_content"
                      android:id="@+id/textViewTeste" />


        </RelativeLayout>

        <!-- <include layout="@layout/toolbar_actionbar" /> -->
        <android.support.design.widget.NavigationView
            android:id="@+id/navigation_view"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:choiceMode="singleChoice"
            android:divider="@android:color/transparent"
            android:dividerHeight="0dp"
            android:background="#FFFF"
            app:headerLayout="@layout/nav_header"
            app:menu="@menu/drawer_menu"/>

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

1 个答案:

答案 0 :(得分:1)

有一次我也有类似的问题。这对我有用:

根据您的具体情况更改菜单ID和类名。

private void setupNavDrawer() {

     // ...
     navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(MenuItem menuItem) {
                    menuItem.setChecked(true);

                    switch (menuItem.getItemId()) {
                        case R.id.mainSection:
                            drawerLayout.closeDrawers();
                            startNewActivity(MainActivity.class);
                            break;
                        case R.id.allGames:
                            drawerLayout.closeDrawers();
                            startNewActivity(GamesActivity.class);
                            break;

                    return true;
                }
            });

            setNavigationViewCheckedItem();
            // .....
}

这里有setNavigationViewCheckedItem mehod:

private void setNavigationViewCheckedItem() {
        if (this.getClass().equals(MainActivity.class)) {
            navigationView.setCheckedItem(R.id.mainSection);
        } else if (this.getClass().equals(GamesActivity.class)) {
            navigationView.setCheckedItem(R.id.allGames);
        }
    }