当前位置: 首页 > 知识库问答 >
问题:

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

燕航
2023-03-14

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

这是生成的代码:

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

}

如何使用底部栏更改为新片段?例如,我有3个片段:Fragment1 Fragment2和Fragment3,我想用底部栏中的3个按钮更改为它们。我还想通过左右滑动手指来切换片段,我该怎么做?

共有3个答案

通骁
2023-03-14

最好的方法是将“查看页面”(ViewPager)与“碎片页面”(FragmentPagerAdapter)一起使用。因为它会把里面的碎片兑换成现金。使用带有底部导航视图的setOnNavigationItemSelectedListener来监听用户的点击。并使用viewPager。setCurrentItem(…) 在页面之间移动。

每次用户单击底部导航视图中的项目时都创建一个新片段不是一个好的解决方案(尤其是当用户单击他当前所在的屏幕项目时,即使在这种情况下,上述解决方案也会创建一个新片段)

慕容兴贤
2023-03-14

这很“简单”。

>

  • 创建片段。假设我们需要3个片段FragmentAFragmentBFragmentC,其中FragmentA是我们想要在BottomNavigationView上显示的第一个片段
  • 在活动中,转到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;
     }
    
    };
    

    在您的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,则首次启动活动时该活动为空白。

    如果您想知道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"/>
    

    最后,ft和currentFragment的定义如下:

    Fragment currentFragment = null;
    FragmentTransaction ft;
    

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

  • 华星驰
    2023-03-14

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

    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。

     类似资料:
    • 我创建了一个带有底部导航栏的活动。我在谷歌上搜索了很多关于它的信息,但现在我不知道如何准确地处理这个问题。之前,当用户点击底部导航时,我刚刚开始了另一个活动,但我认为这不好。 如何在选项卡之间切换?我必须处理碎片吗?那么“setContentView(int layoutResID)”呢?我该怎么做?我很困惑。。。 非常感谢你的帮助——我希望你明白我的意思。

    • 我将其添加到我的应用程序底部导航栏中,但现在的问题是,我想从底部导航栏中的一个按钮移动到活动必须分段才能查看的活动(TabLayout,ViewPager)。当我尝试将其设置为selectedFragment=newmainActivityoderlistfargmant()时;“显示我”这样的错误。。也是这样,也不管用。。startActivity(新意图(NafMain.this,MainAc

    • 问题内容: 我知道这些类型的问题已经在这里,但仍然找不到这个问题的答案: 我已经创建了一个应用程序,并使用了由该应用程序自动创建的导航抽屉(AndroidStudio) 这是我所拥有的: 还有更多: 我想使用导航抽屉中的按钮显示另一个片段。我想使用此代码,所以请不要向我发送任何制作自己的抽屉的指南或教程。 现在的问题是,我该怎么放 ,并在情况下,我想打开另一个片段?谢谢。 还有一个问题: 如何添加

    • 我在MainActivity中使用了两个片段,一个是首选项片段,另一个(默认)是主片段。我想确保,若在导航栏中选择了相同的项目,则不会重新创建该片段。但是现在我有两个问题: 1。如果我尝试更改首选项中的主题,底部导航栏将停止工作。切换到preferences片段不会更改操作栏中的标题,但它应该会更改(在实施片段替换预防之前,我进行了测试,它起到了作用。下面是一些代码:

    • 我有底部的导航栏,点击导航栏中的项目,我正在替换片段。我有3个片段A、B、C,所以点击B项B片段被加载,在B中我调用3-4个API。所以现在如果我转到C,然后再次转到B,将创建一个新的B片段实例,并再次调用这些API,那么如何保存片段实例状态,并且在更改片段时不再调用API。这是我的密码。 我已经在MainActivity的onCreate中初始化了上面的片段成员变量

    • 我正在创建和应用程序,到目前为止一切都很好。今天,我处理一个片段中的数据,以访问我的webservice并返回json,然后将该数据插入到我的sqlite中,然后在listview中显示该数据并逐秒更新数据。 一切都是正确的,直到我发现如果我在底部导航中单击片段中的项目的位置过快,它将在应用程序对片段执行事务时崩溃。只有当我在该片段和其他4个片段中的多个片段之间单击时,才会发生这种情况。 所以我的