Ispam
Ispam

Reputation: 615

Navigation Item Selected State through Multiple Activities

Gif of problem

I have a working Navigation Drawer through out multiple activities and I am looking to highlight the current Navigation Item Selected after it changes the activity. How can I save the Item Selected Listener through out the whole app while the onCreateDrawer its recreating itself on every other activity?

If you need any other relevant activity or have any feedback, dont hesitate to indulge me!

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

}

Home

public class Home extends BaseActivity {

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

Selection

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>

Upvotes: 0

Views: 1238

Answers (1)

SpiralDev
SpiralDev

Reputation: 7321

Once I also had similar problem. And here is what worked for me:

Change menu ids and class names as per your situation.

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

And here 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);
        }
    }

Upvotes: 1

Related Questions