web-dev-qa-db-fra.com

Comment mettre en surbrillance l'élément lorsqu'il est pressé à l'aide de BottomNavigationView entre les activités?

J'ai ajouté la vue de navigation inférieure pour mon application, mais j'ai besoin de la vue de navigation inférieure entre les activités au lieu du fragment, j'ai donc ajouté ce code à Java pour toutes mes 3 activités).

Lorsque je sélectionne Second ou Third dans mon téléphone, tout est correct mais le problème est que le point culminant va au premier élément.

Je dois mettre en évidence l'élément sur lequel j'appuie.

J'ai utilisé fragment et cela fonctionne parfaitement mais je suis toujours débutant pour utiliser fragment donc j'utilise des activités.

Le premier code d'activité est:

BottomNavigationView mBottomNavigation;

    mBottomNavigation =(BottomNavigationView) findViewById(R.id.BottomNavigator);

    mBottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch (item.getItemId()){
                case R.id.Nav_Second:
                    Intent Second= new Intent(First.this, Second.class);
                    startActivity(Second);
                    break;
                case R.id.Nav_Third:
                    Intent Third= new Intent(First.this, Third.class);
                    startActivity(Third);
                    break;
            }

            return true;
        }
    });


}}

La deuxième activité est:

BottomNavigationView mBottomNavigation;

    mBottomNavigation =(BottomNavigationView) findViewById(R.id.BottomNavigator);

    mBottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch (item.getItemId()){
                case R.id.Nav_First:
                    Intent First= new Intent(Second.this, First.class);
                    startActivity(First);
                    break;
                case R.id.Nav_Third:
                    Intent Third= new Intent(Second.this, Third.class);
                    startActivity(Third);
                    break;
            }

            return true;
        }
    });

}}

La troisième activité est:

BottomNavigationView mBottomNavigation;

    mBottomNavigation =(BottomNavigationView) findViewById(R.id.BottomNavigator);

    mBottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch (item.getItemId()){
                case R.id.Nav_First:
                    Intent First= new Intent(Third.this, First.class);
                    startActivity(First);
                    break;
                case R.id.Nav_Second:
                    Intent Second= new Intent(Third.this, Second.class);
                    startActivity(Second);
                    break;
            }

            return true;
        }
    });


}}

Les xml sont les mêmes pour 3 activités:

<Android.support.design.widget.BottomNavigationView
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:id="@+id/BottomNavigator"
        Android:background="@color/colorPrimaryDark"
        Android:layout_alignParentBottom="true"
        app:itemTextColor="@drawable/item_bg"
        app:itemIconTint="@drawable/item_bg"
        app:menu="@menu/navigate_items">
    </Android.support.design.widget.BottomNavigationView>
17
7uthaifah

Vous pouvez utiliser BottomNavigationView avec des activités représentant des onglets. La clé consiste à répéter le composant de vue de navigation dans chaque activité et à faire en sorte que le code de chaque activité contrôle le composant de navigation: démarrer la bonne activité lors des clics sur l'élément de navigation et sélectionner un élément de navigation approprié après le démarrage de l'activité.

Vous devez démarrer les activités nouvellement sélectionnées (onglets) avec un délai permettant à l'animation de changement d'onglet de se terminer avant que la nouvelle activité ne remplace la précédente.

Mon approche consistait à faire en sorte que toutes les activités représentant des onglets héritent de la même classe BaseActivity implémentant le comportement commun.

Voici le code d'un exemple de BaseActivity:

public abstract class BaseActivity extends AppCompatActivity implements BottomNavigationView.OnNavigationItemSelectedListener {

    protected BottomNavigationView navigationView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getContentViewId());

        navigationView = (BottomNavigationView) findViewById(R.id.navigation);
        navigationView.setOnNavigationItemSelectedListener(this);
    }

    @Override
    protected void onStart() {
        super.onStart();
        updateNavigationBarState();
    }

    // Remove inter-activity transition to avoid screen tossing on tapping bottom navigation items
    @Override
    public void onPause() {
        super.onPause();
        overridePendingTransition(0, 0);
    }

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        navigationView.postDelayed(() -> {
            int itemId = item.getItemId();
            if (itemId == R.id.navigation_home) {
                startActivity(new Intent(this, HomeActivity.class));
            } else if (itemId == R.id.navigation_dashboard) {
                    startActivity(new Intent(this, DashboardActivity.class));
            } else if (itemId == R.id.navigation_notifications) {
                    startActivity(new Intent(this, NotificationsActivity.class));
            }
            finish();
        }, 300);
        return true;
    }

    private void updateNavigationBarState(){
        int actionId = getNavigationMenuItemId();
        selectBottomNavigationBarItem(actionId);
    }

    void selectBottomNavigationBarItem(int itemId) {
        Menu menu = navigationView.getMenu();
        for (int i = 0, size = menu.size(); i < size; i++) {
            MenuItem item = menu.getItem(i);
            boolean shouldBeChecked = item.getItemId() == itemId;
            if (shouldBeChecked) {
                item.setChecked(true);
                break;
            }
        }
    }

    abstract int getContentViewId();

    abstract int getNavigationMenuItemId();

}

Voici tout mon exemple basé sur le modèle d'activité de navigation inférieure de Android Android Studio:

https://github.com/ddekanski/BottomNavigationViewBetweenActivities

17
javaxian

Pour tous ceux qui recherchent toujours cela, la réponse de @ javazian consistant à étendre chaque activité est vraiment exagérée à mon avis.

Une solution beaucoup plus succincte consiste à récupérer le menu de navigation et à vérifier manuellement l'élément de menu correspondant.

Remarque dans l'exemple ci-dessous, INSERT_INDEX_HERE doit être remplacé par l'index de l'élément de menu, (par exemple, l'élément de menu à l'extrême gauche aurait l'index 0).

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

    BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
    navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);

    // Ensure correct menu item is selected (where the magic happens)
    Menu menu = navigation.getMenu();
    MenuItem menuItem = menu.getItem(INSERT_INDEX_HERE);
    menuItem.setChecked(true);
}
6
hardanger

Vous pouvez absolument utiliser BottomNavigationView avec des activités, mais ce n'est pas recommandé. Mieux vaut l'utiliser avec des fragments, les principaux avantages sont:

  • Animation dans BottomNavigationView (sans vilain retard en cas d'activités)
  • Maintenir facilement l'état des fragments
  • Backstack flexible

Mais si vous voulez vous en tenir aux activités, la réponse @javaxian est très bonne, mais nous pouvons l'améliorer:

  1. Si notre fichier de mise en page n'a pas de BottomNavigation avec l'ID approprié, nous aurons une exception. Il vaut mieux avoir un fichier de mise en page commun pour les activités avec navigation.

Solution:

1) Renommez BaseActivity en BaseNavigationActivity

2) Créez un fichier de mise en page unique pour toutes vos activités (par exemple activity_navigation.xml), Et appelez explicitement BaseNavigationActivity setContentView(R.layout.activity_navigation);

3) Supprimer abstract int getContentViewId();

  1. Le code dans selectBottomNavigationBarItem(int itemId) est une surcharge, nous pouvons le faire beaucoup plus simple

Solution (dans Kotlin):

private fun selectBottomNavigationBarItem(itemId: Int) {
    val menuItem = navigationView.menu.findItem(itemId)
    menuItem.isChecked = true
}
5
Vlad Sonkin

Vous pouvez utiliser setSelectedItemId dans chaque activité lorsqu'elle démarre.

bottomNavigationView.setSelectedItemId(R.id.menu_item_id);

R.id.menu_item_id situé dans le menu/naviguer_items

2
Oyeme