如何使用底部导航活动更改片段?

The*_*awd 15 java android android-fragments android-activity

我使用"底部导航活动"创建了一个新项目:https: //gyazo.com/f5efaecffd5adfd05e512921d3b8a19d

这是生成的代码:

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

}
Run Code Online (Sandbox Code Playgroud)

如何使用Bottom Bar更改为新碎片?例如,我有3个片段:Fragment1 Fragment2和Fragment3我想用底栏中的3个按钮更改它们.另外我想要我可以通过向左和向右滑动手指来切换碎片我该怎么做?

小智 21

我这样做的方法是,我首先添加三个与此类似的方法(每个方法用于单个片段.将布局名称和片段对象替换为正在切换到的相应片段):

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

所以你的switch语句最终看起来像这样:

        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;
        }
Run Code Online (Sandbox Code Playgroud)

至于通过向侧面滑动切换片段,我相信你需要一个ViewPager.

  • 根据Google Material docs,当使用Bottom Navigation时,不应使用滑动(避免使用横向运动在视图之间转换).https://material.io/guidelines/components/bottom-navigation.html#bottom-navigation-behavior (6认同)

ojo*_*ifu 10

这很"简单".

  1. 创建你的碎片.假设我们想要3个片段; FragmentA,FragmentBFragmentCFragmentA目前我们希望在BottomNavigationView第一个片段.
  2. 在您的活动中,转到onNavigationItemSelected方法并将内容更改为:

     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;
     }
    
    };
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在您的onCreate()方法中,执行以下操作:

      @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);
      }
    
    Run Code Online (Sandbox Code Playgroud)

如果您未添加FragmentA,则onCreate()首次启动时活动为空.

如果您想知道什么R.id.content是什么,它是您的活动布局中的Framelayout的ID.它最初包含一个TextView,删除TextView所以它看起来像这样:

<FrameLayout
    android:id="@+id/content"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"/>
Run Code Online (Sandbox Code Playgroud)

最后,ftcurrentFragment定义是这样的:

Fragment currentFragment = null;
FragmentTransaction ft;
Run Code Online (Sandbox Code Playgroud)

不确定优雅,但这很有效.


小智 7

最好的方法是使用ViewPagera FragmentPagerAdapter.因为它会在里面兑现碎片.使用setOnNavigationItemSelectedListenerBottomNavigationView监听用户的点击.并用于viewPager.setCurrentItem(..)在页面之间移动.

每次用户点击底部导航视图中的项目时创建一个新片段都不是一个好的解决方案(特别是当用户点击他当前所在的屏幕项目时,上面的解决方案将创建一个新片段,即使对于这个案例)


Bib*_*mon 7

如果您使用 Jetpack Navigation,您可以通过以下代码切换片段。

val navController = findNavController(R.id.your_nav_host_fragment)
navController.navigate(R.id.your_fragment_id_in_menu)
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅此文档:https://codelabs.developers.google.com/codelabs/android-navigation/#0