web-dev-qa-db-fra.com

Comment changer de fragment avec l'activité de navigation inférieure?

J'ai créé un nouveau projet avec "l'activité de navigation inférieure":

enter image description here

C'est le code généré:

package com.aaron.waller.mrpolitik;

import Android.os.Bundle;
import Android.support.annotation.NonNull;
import Android.support.design.widget.BottomNavigationView;
import Android.support.v7.app.AppCompatActivity;
import Android.view.MenuItem;
import Android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private TextView mTextMessage;

    private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
            = new BottomNavigationView.OnNavigationItemSelectedListener() {

        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch (item.getItemId()) {
                case R.id.navigation_home:
                    mTextMessage.setText(R.string.title_home);
                case R.id.navigation_dashboard:
                    mTextMessage.setText(R.string.title_dashboard);
                case R.id.navigation_notifications:
                    mTextMessage.setText(R.string.title_notifications);
            }
            return true;
        }

    };

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

        mTextMessage = (TextView) findViewById(R.id.message);
        BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
        navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
    }

}

Comment puis-je changer de nouveaux fragments avec la barre inférieure? Par exemple, j'ai 3 Fragments: Fragment1 Fragment2 et Fragment3 Et je veux les changer avec les 3 boutons de la barre inférieure. De plus, je veux pouvoir changer les fragments en glissant mon doigt à gauche et à droite, comment puis-je faire cela?

15
TheUseracc awd

Comme je le ferais, j’ajouterais d’abord trois méthodes similaires à celle-ci (chacune pour un seul fragment. Remplacez le nom de la présentation et l’objet fragment par le fragment approprié sur lequel vous souhaitez basculer):

public void switchToFragment1() {
    FragmentManager manager = getSupportFragmentManager();
    manager.beginTransaction().replace(R.id.your_fragment_layout_name, new Fragment1()).commit();
}

Ainsi, votre déclaration de commutateur ressemblerait à ceci:

        switch (item.getItemId()) {
            case R.id.navigation_home:
                mTextMessage.setText(R.string.title_home);
                switchToFragment1();
                break;

            case R.id.navigation_dashboard:
                mTextMessage.setText(R.string.title_dashboard);                    
                switchToFragment2();
                break;

            case R.id.navigation_notifications:
                mTextMessage.setText(R.string.title_notifications);                     
                switchToFragment3();
                break;
        }

En ce qui concerne la commutation des fragments en balayant sur les côtés, je pense que vous auriez besoin de ViewPager .

20
Abdel Rahman

C'est assez "simple".

  1. Créez vos fragments. Disons que nous voulons 3 fragments; FragmentA, FragmentB et FragmentC avec FragmentA étant le premier fragment que nous voulons sur BottomNavigationView.
  2. Dans votre activité, allez à la méthode onNavigationItemSelected et modifiez le contenu en ceci:

     private BottomNavigationView.OnNavigationItemSelectedListener  
       mOnNavigationItemSelectedListener
           = new BottomNavigationView.OnNavigationItemSelectedListener(){
    
       @Override
       public boolean onNavigationItemSelected(@NonNull MenuItem item) {
    
        switch (item.getItemId()) {
            case R.id.frag_a:
                currentFragment = new FragmentA();
                ft = getSupportFragmentManager().beginTransaction();
                ft.replace(R.id.content, currentFragment);
                ft.commit();
                return true;
            case R.id.frag_b:
                currentFragment = new FragmentB();
                ft = getSupportFragmentManager().beginTransaction();
                ft.replace(R.id.content, currentFragment);
                ft.commit();
                return true;
            case R.id.frag_c:
                currentFragment = new FragmentC();
                ft = getSupportFragmentManager().beginTransaction();
                ft.replace(R.id.content, currentFragment);
                ft.commit();
                return true;
        }
    
        return false;
     }
    
    };
    
  3. Dans votre méthode onCreate(), procédez comme suit:

      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_client_profile);
        ft = getSupportFragmentManager().beginTransaction();
        currentFragment = new FragmentA();
        ft.replace(R.id.content, currentFragment);
        ft.commit();
    
        BottomNavigationView navigation = (BottomNavigationView)  
        findViewById(R.id.navigation); navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
      }
    

Si vous n'ajoutez pas FragmentA dans la onCreate(), l'activité est vide lorsque vous la lancez pour la première fois.

Si vous vous demandez à quoi R.id.content Fait référence, c'est l'identifiant de Framelayout dans la présentation de votre activité. Il contient initialement un TextView, supprimez le TextView afin qu'il ressemble à ceci:

<FrameLayout
    Android:id="@+id/content"
    Android:layout_width="match_parent"
    Android:layout_height="0dp"
    Android:layout_weight="1"/>

Enfin, ft et currentFragment sont définis comme suit:

Fragment currentFragment = null;
FragmentTransaction ft;

Pas sûr de l'élégance, mais ça marche.

10

Le meilleur moyen consiste à utiliser un ViewPager avec un FragmentPagerAdapter. Depuis qu'il encaisse les fragments à l'intérieur. Utilisez setOnNavigationItemSelectedListener avec le BottomNavigationView pour écouter les clics de l'utilisateur. Et utilisez viewPager.setCurrentItem(..) pour vous déplacer d'une page à l'autre.

Créer un nouveau fragment chaque fois que l'utilisateur clique sur un élément dans la vue de navigation inférieure n'est pas une bonne solution (en particulier lorsque l'utilisateur clique sur l'élément de l'écran où il se trouve, la solution ci-dessus créera un nouveau fragment même pour ce cas)

7
Abed Almoradi
//fully tested  
  public class DashBoardActivity extends AppCompatActivity {

        Fragment fragment = null;
        FragmentTransaction fragmentTransaction;

        private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
                = new BottomNavigationView.OnNavigationItemSelectedListener() {

            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.navigation_home:
                        return true;
                    case R.id.navigation_dashboard:
                        fragment = new FragmentDashBoard();
                        switchFragment(fragment);
                        return true;
                    case R.id.navigation_notifications:
                        fragment = new FragmentNotification();
                        switchFragment(fragment);
                        return true;
                }
                return false;
            }
        };


        private void switchFragment(Fragment fragment) {
            fragmentTransaction = getSupportFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.content, fragment);
            fragmentTransaction.commit();
        }

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

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

    }
2
Vivek Shah

Il existe un autre moyen d’éviter de recréer fragment - fm.beginTransaction().hide(active).show(aimFragment)

Voici mon exemple (copie de mon projet récent):

public class MainActivity extends AppCompatActivity {
    @BindView(R.id.main_bottom_navigation) BottomNavigationView mBottomNavigationView;
    final Fragment mTaskListFragment = new TaskListFragment();
    final Fragment mUserGroupFragment = new UserGroupFragment();
    final Fragment mUserMeFragment = new UserMeFragment();
    final FragmentManager fm = getSupportFragmentManager();
    Fragment active = mTaskListFragment;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        mBottomNavigationView
                .setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
        fm.beginTransaction().add(R.id.main_fragment_container, mUserMeFragment, "3")
                .hide(mUserMeFragment).commit();
        fm.beginTransaction().add(R.id.main_fragment_container, mUserGroupFragment, "2")
                .hide(mUserGroupFragment).commit();
        fm.beginTransaction().add(R.id.main_fragment_container, mTaskListFragment, "1").commit();

    }


    private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
        = item -> {
//        TODO: 这种切换方式比较快,但横竖屏切换会出问题,已经
            switch (item.getItemId()) {
                case R.id.nav_list:
                    fm.beginTransaction().hide(active).show(mTaskListFragment).commit();
                    active = mTaskListFragment;
                    break;
                case R.id.nav_group:
                    fm.beginTransaction().hide(active).show(mUserGroupFragment).commit();
                    active = mUserGroupFragment;
                    break;
                case R.id.nav_me:
                    fm.beginTransaction().hide(active).show(mUserMeFragment).commit();
                    active = mUserMeFragment;
                    break;
            }
            return true;
        };
}

Cela semble efficace et fonctionnera bien jusqu'à ce que vous allumiez votre téléphone. Et je l'ai corrigé en interdisant la rotation dans cette activité (à AndroidManifest.xml):

        <activity Android:name=".MainActivity"
            Android:screenOrientation="portrait"
            Android:launchMode="singleTop">

Save active peut peut-être résoudre le problème mieux, mais je n'ai pas essayé. (Désolé pour mon mauvais anglais)

0
jianQ huang

Le moyen le plus simple est d'utiliser le composant de navigation:

 bottom_navigation_view?.setupWithNavController(navController)
0
timothyjc