Day16 Android - 不同fragment切换(ButtomNavigationView)

今天主要要设计ButtomNavigationView(底部的按钮)来切换不同的fragment,而另一个,NavigationView的按钮是加在侧边的按钮(不要搞混了,但用法差不多),那麽首先先new->Fragment
->Fragment(Blank)。
https://ithelp.ithome.com.tw/upload/images/20210830/201392590M1Y3KgJlu.png
接着就会看到以下的画面。
https://ithelp.ithome.com.tw/upload/images/20210830/20139259gnZNQGdRvt.png
主要就是设定名字,他会帮你把Fragment的class跟他的布局都建起来并绑定好view,那麽我们就建三个Fragment用来後面做切换(UI画面可依照自己的喜好设计),接着加入依赖至gradle(app)/dependcies中。

依赖

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

加入完之後一样点选Sync Now。


布局

首先先将内部的TextView(Hello World!)删除後,加入ButtonNavigationView元件(按钮)在底部,以及加入FragmentContainerView(显示fragment的画面)在布局中。
https://ithelp.ithome.com.tw/upload/images/20210830/201392592XeVbXLkNx.png
而FragmentContainerView可以先设第一个Activity(BlankFragment),那麽完成设定了以後,就先来设计ButtnNavigationView的按钮。


首先先new->Android Resource Directory。
https://ithelp.ithome.com.tw/upload/images/20210830/201392595GRAhIURaq.png

将Resource type改为menu後点选ok。
https://ithelp.ithome.com.tw/upload/images/20210830/20139259tOV4tAh3wF.png

接着就会在res的资料夹中发现menu这个资料夹,就在menu的资料夹上面右键,new一个Menu Resource File。
https://ithelp.ithome.com.tw/upload/images/20210830/20139259vfAlsTB8iJ.png

file name的话我就取叫button好了,按ok以後就进入menu/button.xml中。
https://ithelp.ithome.com.tw/upload/images/20210830/20139259VXFFnioSOD.png

接着拉入三个menu至布局中,并给予每个item id及更改title,大约是这样:

<!--加入item id主要是切换时透过id去切换对应的fragment-->
    <item android:title="ItemA"
          android:id="@+id/itema"/>
    <item android:title="ItemB"
          android:id="@+id/itemb"/>
    <item android:title="ItemC"
          android:id="@+id/itemc"/>

接着在ButtonNavigationView中加入刚刚设定的menu、以及设定id。

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/navigation"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:menu="@menu/button"/>

这样就会显示对应的item了,接着就要讲到class的设计。

java

public class MainActivity extends AppCompatActivity {
    BottomNavigationView bnView;
    private BlankFragment blankFragment;
    private BlankFragment2 blankFragment2;
    private BlankFragment3 blankFragment3;
    FragmentManager fragmentManager;
    FragmentTransaction fragmentTransaction;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //绑定ButtomNavigationView元件的id
        bnView=findViewById(R.id.navigation);
        /*********fragment*******/
        fragmentManager = getSupportFragmentManager();//抽象类,负责一系列对fragment的操作,getChildFragmentManager()可获得子级fragment的引用,parent则是getParentFragmentManager()。
        bnView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {//Navigation Button listener,需实现的方法为onNavigationItemSelected,可取按下的项目id(item.getItemId())
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                int id = item.getItemId();//取得按钮id
                fragmentTransaction=fragmentManager.beginTransaction();
                switch (id){
                    case R.id.itema:
                        blankFragment = new BlankFragment();
                        //fragment覆盖(replace),使用blankFragment的class
                        fragmentTransaction.replace(R.id.fragmentContainerView, blankFragment);
                        fragmentTransaction.commit();
                        return true;
                    case R.id.itemb:
                        blankFragment2 = new BlankFragment2();
                        //fragment覆盖(replace),使用blankFragment2的class
                        fragmentTransaction.replace(R.id.fragmentContainerView, blankFragment2);
                        fragmentTransaction.commit();
                        return true;
                    case R.id.itemc:
                        blankFragment3 = new BlankFragment3();
                        //fragment覆盖(replace),使用blankFragment3的class
                        fragmentTransaction.replace(R.id.fragmentContainerView, blankFragment3);
                        fragmentTransaction.commit();
                        return true;
                }
                return false;
            }
        });
    }
}

成果

https://ithelp.ithome.com.tw/upload/images/20211001/20139259txHBYWQOGI.jpg


https://ithelp.ithome.com.tw/upload/images/20211001/20139259igZP58txIz.jpg


https://ithelp.ithome.com.tw/upload/images/20211001/20139259anMAtZou6a.jpg


<<:  Spring Framework X Kotlin Day 26 Test Driven Development

>>:  Re-architect - Domain Layer (一)

Day 05 - Scanners

本篇重点 Scanners介绍 当日成交金额排行 当日成交量排行 当日涨(跌)金额排行 最高/最低价...

6.unity建立C#脚本

今日目标:了解C# script (脚本) unity主要利用C#控制游戏,学好C#的物件导向写法就...

为了转生而点技能-javascript,day2(杂记-记忆体的回收机制-Not Defined VS undefined

Not Defined VS undefined undefined: 在创造阶段只有变数在记忆体里...

33岁转职者的前端笔记-DAY 13 图片格式及影音格式

图片 网页上一定会有多许多图片元素我们在开发网站时需多了解图片的特性及格式,在开发的过程会更加顺利。...

17. 当mentor比你想像的重要多

前言 这篇文章觉得很适合给要当mentor的人,在你当之前应该要先听过这篇演讲,然後反思一下你想对...