J'ai créé un nouveau projet avec "l'activité de navigation inférieure":
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?
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 .
C'est assez "simple".
FragmentA
, FragmentB
et FragmentC
avec FragmentA
étant le premier fragment que nous voulons sur BottomNavigationView.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;
}
};
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.
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)
//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);
}
}
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)
Le moyen le plus simple est d'utiliser le composant de navigation:
bottom_navigation_view?.setupWithNavController(navController)