一、导航栏的实现(BottomNavigationView):

1.导包:

implementation 'com.google.android.material:material:1.0.0'

2.使用:

<com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/main_navigation_bar"
        android:layout_width="match_parent"
        android:layout_height="49dp"
        android:layout_alignParentBottom="true"
        android:background="@color/white"
        app:itemIconTint="@drawable/navigation_bar_color"
        app:itemTextColor="@drawable/navigation_bar_color"
        app:menu="@menu/my_navigation_items" />

控件分析:

app:itemTextColor 指的是导航栏文字的颜色
app:itemIconTint 指的是导航栏中图片的颜色
app:iteamBackground 指的是底部导航栏的背景颜色,默认是主题的颜色
app:menu 指的是布局(文字和图片都写在这个里面)

**注意:**这个控件里面app:menu 需要自己创建一个菜单(menu文件)来实现导航栏的雏形

3.创建一个menu文件:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/home"
        android:icon="@mipmap/home_normal"
        android:title="@string/text_home" />
    <!--精选-->
    <item
        android:id="@+id/selected"
        android:icon="@mipmap/select_normal"
        android:title="@string/text_selected" />
    <!--特惠或者红包-->
    <item
        android:id="@+id/red_packet"
        android:icon="@mipmap/red_packet_normal"
        android:title="@string/text_red_packet" />
    <!--搜索-->
    <item
        android:id="@+id/search"
        android:icon="@mipmap/search_normal"
        android:title="@string/text_search" />
</menu>

要想让导航栏触碰和弹起有动画效果,还需在drawable文件下创建一个xml文件,详情见下:

4.导航栏明暗效果变动;

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:color="@color/colorPrimary"
        android:state_checked="true" />
    <item android:color="@color/colorGrey" />

</selector>

在BottomNavigationView中通过app:itemTextColor="@drawable/navigation_bar_color"实现明暗变化

二、实现导航栏(RadioGroup+RadioButton):

1.在主活动的xml文件中添加如下代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:sob="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#EFEEEE"
    android:orientation="vertical">
    <RadioGroup
        android:id="@+id/test_navigation_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal">

        <RadioButton
            android:id="@+id/test_home"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:button="@null"
            android:checked="true"
            android:drawableTop="@drawable/selector_navigation_home"
            android:gravity="center"
            android:text="首页"
            android:textColor="@drawable/navigation_bar_color" />

        <RadioButton
            android:id="@+id/test_selected"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:button="@null"
            android:drawableTop="@drawable/selector_navigation_selected"
            android:gravity="center"
            android:text="精选"
            android:textColor="@drawable/navigation_bar_color" />

        <RadioButton
            android:id="@+id/test_red_packet"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:button="@null"
            android:drawableTop="@drawable/selector_navigation_red_packet"
            android:gravity="center"
            android:text="特惠"
            android:textColor="@drawable/navigation_bar_color" />

        <RadioButton
            android:id="@+id/test_search"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:button="@null"
            android:drawableTop="@drawable/selector_navigation_search"
            android:gravity="center"
            android:text="搜索"
            android:textColor="@drawable/navigation_bar_color" />
    </RadioGroup>

    <View
        android:layout_width="match_parent"
        android:layout_height="1px"
        android:layout_above="@id/test_navigation_bar"
        android:layout_marginBottom="10dp"
        android:background="@color/gray" />


</RelativeLayout>

2.在主活动.java下添加代码:

public class TestActivity extends Activity {

    @BindView(R.id.test_navigation_bar)
    public RadioGroup navigationBar;

    @BindView(R.id.test_flow_text)
    public TextFlowLayout flowText;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        ButterKnife.bind(this);
        initListener();
    }

    public void showToast(View view) {
        //Toast.makeText(this,"测试...",Toast.LENGTH_SHORT).show();
        ToastUtil.showToast("测试....");
    }

    private void initListener() {
        navigationBar.setOnCheckedChangeListener((group,checkedId) -> {
            // LogUtils.d(TestActivity.class,"checkedId -- > " + checkedId);
            switch(checkedId) {
                case R.id.test_home:
                    LogUtils.d(TestActivity.class,"切换到首页");
                    break;
                case R.id.test_selected:
                    LogUtils.d(TestActivity.class,"切换到精选页面");
                    break;
                case R.id.test_search:
                    LogUtils.d(TestActivity.class,"切换到搜索页面");
                    break;
                case R.id.test_red_packet:
                    LogUtils.d(TestActivity.class,"切换到特惠");
                    break;
            }
        });
    }
}

给RadioGroup和RadioButton添加点击事件,这就是使用RadioGroup实现导航栏的大体框架。

三、Fragment 的统一管理

前言:我们平常使用fragment时,一般都是在 public View onCreateView()方法中使用inflater.inflate(R.layout.activity_myfragment,container,false)来绑定布局。

实例如下:

public class Myfragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        //第七行代码是用来加载布局的主要代码
        View view = inflater.inflate(R.layout.activity_myfragment,container,false);
        return view;
   }
}

这其实很麻烦,一个APP不可能只有一个fragment,而且这样也不好维护,万一绑定的布局需要更改,fragment里面这个方法就要全盘修改。所以怎么办呢?

创建一个BaseFragment基类,里面创建方法,把原本fragment中需要频繁使用的一些方法封装进去,再使得fragment继承基类,这样就会好很多了

1.创建基类BaseFragment

public abstract class BaseFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return loadRootView(inflater,container,savedInstanceState);
    }

    protected  View loadRootView(LayoutInflater inflater, ViewGroup container,
                                         Bundle savedInstanceState){
        int resID = getRootViewResID();
        return inflater.inflate(resID, container, false);
    }

    protected abstract int getRootViewResID();

}

2.使得创建的fragment继承这个基类

public class  Myfragment extends BaseFragment {
    @Override
    protected int getRootViewResID() {
        return R.layout.fragment_search;
    }
}

这样就可以了,你会发现,在fragment中绑定布局,只需要返回一个布局就可以了。比起前面冗长的代码,方便了不少。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐