首页 > 解决方案 > 我可以从底部栏单击侦听器打开片段吗?

问题描述

我创建了一个带有 xml 文件的底部栏,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<tabs>
    <tab
        id="@+id/tab_signals"
        icon="@drawable/ic_recents"
        title="Signals"
        barColorWhenSelected="@color/colorAccent" />
    <tab
        id="@+id/tab_tutorials"
        icon="@drawable/ic_favorites"
        title="Tutorials"
        barColorWhenSelected="#5D4037" />
    <tab
        id="@+id/tab_training"
        icon="@drawable/ic_nearby"
        title="Training"
        barColorWhenSelected="#7B1FA2" />
    <tab
        id="@+id/tab_management"
        icon="@drawable/ic_friends"
        title="Management"
        barColorWhenSelected="#FF5252" />
    <tab
        id="@+id/tab_pool"
        icon="@drawable/ic_restaurants"
        title="Pool"
        barColorWhenSelected="#FF9800" />
    <tab
        id="@+id/tab_contact"
        icon="@drawable/ic_restaurants"
        title="Contact"
        barColorWhenSelected="#FF9800" />
</tabs>

我的 activity_main.xml 如下所示:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <TextView
        android:id="@+id/messageView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/bottomBar"
        android:gravity="center"
        android:text="Hi mom!" />

    <com.roughike.bottombar.BottomBar
        android:id="@+id/bottomBar"
        android:layout_width="match_parent"
        android:layout_height="64dp"
        android:layout_alignParentBottom="true"
        app:bb_tabXmlResource="@xml/bottombar_tabs_color_changing"
        app:bb_behavior="shifting|underNavbar" />

</RelativeLayout>

MainActivity.class 如下:

public class MainActivity extends AppCompatActivity {
    private TextView messageView;


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

        messageView = (TextView) findViewById(R.id.messageView);

        BottomBar bottomBar = (BottomBar) findViewById(R.id.bottomBar);
        bottomBar.setOnTabSelectListener(new OnTabSelectListener() {
            @Override
            public void onTabSelected(@IdRes int tabId) {
                messageView.setText(TabClicks.get(tabId, false));
            }
        });

        bottomBar.setOnTabReselectListener(new OnTabReselectListener() {
            @Override
            public void onTabReSelected(@IdRes int tabId) {
                Toast.makeText(getApplicationContext(), TabClicks.get(tabId, true), Toast.LENGTH_LONG).show();
            }
        });
    }

    
}

另一个 TabClicks.java 具有点击监听器,如下所示:

package com.example.bottombar.sample;

public class TabClicks {
    public static String get(int menuItemId, boolean isReselection) {
        String message = "Content for ";

        switch (menuItemId) {
            case R.id.tab_signals:
                message += "signals";
                break;
            case R.id.tab_tutorials:
                message += "tutorials";
                break;
            case R.id.tab_training:
                message += "training";
                break;
            case R.id.tab_management:
                message += "management";
                break;
            case R.id.tab_pool:
                message += "pool";
                break;
            case R.id.tab_contact:
                message += "contact";
                break;
        }

        if (isReselection) {
            message += " WAS RESELECTED! YAY!";
        }

        return message;
    }
}

它工作得很好,但现在我想从显示文本更改为打开片段。我希望每个项目都打开一个片段,我该如何开始,如何更改此代码?

标签: javaandroid-studiobottomnavigationview

解决方案


您可以使用它来打开/替换片段

Fragment someFragment = new SomeFragment(); 
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, someFragment ); // give your fragment container id in first parameter
transaction.addToBackStack(null);  // if written, this transaction will be added to backstack
transaction.commit(); 

但是,根据 Material design 指南,底部导航应该有 3-5 个项目。你的有 6 个,我建议你使用导航抽屉。

您还可以使用导航组件查看底部导航,这使得导航和替换片段更加容易。


推荐阅读