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

ttisahbt  于 2023-08-01  发布在  Java
关注(0)|答案(9)|浏览(107)

我创建了一个新的项目“底部导航活动”:


的数据
这是生成的代码:

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

}

字符串
我怎样才能改变到新的碎片与底部酒吧?例如,我有三个片段:Fragment1、Fragment2和Fragment3我想用底部栏的3个按钮更改为它们。我还想通过左右滑动手指来切换碎片,我该怎么做呢?

du7egjpx

du7egjpx1#

我的做法是,首先添加三个与此类似的方法(每个方法对应一个片段)。将布局名称和片段对象替换为要切换到的适当片段):

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

字符串
所以你的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;
        }


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

wlp8pajw

wlp8pajw2#

这很“简单”。
1.创建你的碎片。假设我们想要3个片段; FragmentAFragmentBFragmentC,其中FragmentA是我们希望在BottomNavigationView上显示的第一个片段。
1.在Activity中,转到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;
 }

};

字符串
1.在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);
  }


如果未在onCreate()中添加FragmentA,则在首次启动Activity时,该Activity为空。
如果您想知道R.id.content指的是什么,它是Activity布局中的Framelayout的ID。它最初包含一个TextView,删除TextView,使其看起来像这样:

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


最后,ftcurrentFragment是这样定义的:

Fragment currentFragment = null;
FragmentTransaction ft;


不确定优雅与否,但这很有效。

rbl8hiat

rbl8hiat3#

最好的方法是使用ViewPagerFragmentPagerAdapter。因为它能把里面的碎片兑现。使用setOnNavigationItemSelectedListenerBottomNavigationView来监听用户的点击。并使用viewPager.setCurrentItem(..)在页面之间移动。
每次用户单击底部导航视图中的项目时创建一个新片段并不是一个好的解决方案(尤其是当用户单击他当前所在的屏幕项目时,上面的解决方案将创建一个新片段,即使在这种情况下)

lx0bsm1f

lx0bsm1f4#

如果你使用的是Jetpack Navigation,你可以通过下面的代码切换片段。

val navController = findNavController(R.id.your_nav_host_fragment)
navController.navigate(R.id.your_fragment_id_in_menu)

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

wbrvyc0a

wbrvyc0a5#

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

    }

字符串

gjmwrych

gjmwrych6#

简单的方法是使用导航组件:

bottom_navigation_view?.setupWithNavController(navController)

字符串

j5fpnvbx

j5fpnvbx7#

还有另一种避免重新创建片段的方法--fm.beginTransaction().hide(active).show(aimFragment)
我的例子如下(只是从我最近的项目复制):

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

字符串
它看起来很有效率,在你旋转手机之前会工作得很好。我通过将清单文件中的以下代码添加到Activity中以保留片段状态来修复它。(例如AndroidManifest.xml):

android:configChanges="screenSize|orientation|screenLayout"

lbsnaicq

lbsnaicq8#

这是我的建议方式,它有一个理想的性能,我做了它与使用naveControllerandroidx.navigation:navigation
步骤1:将导航依赖项添加到应用程序级build.gradle文件。这将允许您在应用中使用导航组件。

dependencies {
def nav_version = "2.3.5"
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
}

字符串
步骤2:为底部导航栏创建新的菜单资源文件。此文件将包含将在栏中显示的菜单项。要创建新的菜单资源文件,请右键单击“项目”面板中的res文件夹,选择New > Android resource file,并将“资源类型”设置为“菜单”。
步骤3:在菜单资源文件中,添加将在底部导航栏中显示的菜单项。每个菜单项都应该有一个唯一的ID和标题。举例来说:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
    android:id="@+id/navigation_home"
    android:title="Home" />
<item
    android:id="@+id/navigation_dashboard"
    android:title="Dashboard" />
<item
    android:id="@+id/navigation_notifications"
    android:title="Notifications" />


步骤4:在要显示底部导航栏的布局文件中,添加BottomNavigationView元素。举例来说:

<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_navigation_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:menu="@menu/bottom_navigation_menu"
/>


注意,app:menu属性被设置为在步骤2中创建的菜单资源文件的名称。
步骤5:在将承载底部导航栏的Activity或片段中,使用findNavController()方法创建NavController的示例,并将BottomNavigationView作为参数传入。举例来说:

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:startDestination="@id/navigation_home">

<fragment
    android:id="@+id/navigation_home"
    android:name="com.example.myapp.HomeFragment"
    android:label="@string/title_home" />

<fragment
    android:id="@+id/navigation_dashboard"
    android:name="com.example.myapp.DashboardFragment"
    android:label="@string/title_dashboard" />

<fragment
    android:id="@+id/navigation_notifications"
    android:name="com.example.myapp.NotificationsFragment"
    android:label="@string/title_notifications" />


请注意,每个片段都由一个唯一的ID标识,该ID对应于底部导航栏中菜单项的ID。
就是这样!通过这些步骤,你现在应该有一个基本的底部导航栏,可以用来替换应用程序中的不同片段。

qnzebej0

qnzebej09#

你可以用这个

fragmentManager = getFragmentManager();
                    transaction = fragmentManager.beginTransaction();

                    FragmentA a = new FragmentA();
                    transaction.replace(R.id.frame, a);
                    transaction.commit();

字符串

相关问题