亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android底部導(dǎo)航欄的三種風(fēng)格實現(xiàn)

 更新時間:2020年06月09日 09:55:32   作者:阿飛__  
這篇文章主要介紹了Android底部導(dǎo)航欄的三種風(fēng)格實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、效果圖展示


如果動圖沒有動的話,也可以看下面這個靜態(tài)圖


以下挨個分析每個的實現(xiàn),這里只做簡單的效果展示,大家可以基于目前代碼做二次開發(fā)。

二、BottomNavigationView

    這是 Google 給我們提供的一個專門用于底部導(dǎo)航的 View,你只需要在新建 Activity 的時候選擇 “Bottom Navigation Activity”,IDE 就會自動使用 BottomNavigationView 幫你生成好相應(yīng)的代碼了。

1. 在 xml 中使用

 <android.support.design.widget.BottomNavigationView
    android:id="@+id/navigation"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginEnd="0dp"
    android:layout_marginStart="0dp"
    android:background="?android:attr/windowBackground"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:menu="@menu/navigation" />

    這里面唯一要注意的就是 app:menu 屬性了,它指定了你的導(dǎo)航欄顯示的頁面菜單是怎樣的。

2. menu 的布局文件

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
 
  <item
    android:id="@+id/navigation_home"
    android:icon="@drawable/ic_home_black_24dp"
    android:title="@string/title_home" />
 
  <item
    android:id="@+id/navigation_dashboard"
    android:icon="@drawable/ic_dashboard_black_24dp"
    android:title="@string/title_dashboard" />
 
  <item
    android:id="@+id/navigation_notifications"
    android:icon="@drawable/ic_notifications_black_24dp"
    android:title="@string/title_notifications" />
 
</menu>

3. 在 Activity 中調(diào)用

 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);
          return true;
        case R.id.navigation_dashboard:
          mTextMessage.setText(R.string.title_dashboard);
          return true;
        case R.id.navigation_notifications:
          mTextMessage.setText(R.string.title_notifications);
          return true;
      }
      return false;
    }
  };
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_style1);
 
    mTextMessage = findViewById(R.id.message);
    BottomNavigationView navigation = findViewById(R.id.navigation);
    navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
  }

    這里的演示 code 都是 IDE 自動生成的,由于 BottomNavigationView 目前我還沒有在項目中實際使用過,這里不做過多分析,使用起來不難,以上代碼已經(jīng)足以滿足我們的基本使用要求了。

三、RadioGroup + ViewPager

    這是一種比較常見了的,下面 4 個 tab 的導(dǎo)航按鈕,可以切換不同的頁面,這里頁面使用了 ViewPager + Fragment 的組合,實現(xiàn)了滑動的頁面效果,也可以不使用 ViewPager,這個根據(jù)產(chǎn)品的定義來使用即可。

1. 布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context=".style2.Style2Activity">
 
  <android.support.v4.view.ViewPager
    android:id="@+id/fragment_vp"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@+id/tabs_rg" />
 
  <RadioGroup
    android:id="@+id/tabs_rg"
    android:layout_width="match_parent"
    android:layout_height="56dp"
    android:layout_alignParentBottom="true"
    android:background="#dcdcdc"
    android:orientation="horizontal">
 
    <RadioButton
      android:id="@+id/today_tab"
      style="@style/Custom.TabRadioButton"
      android:checked="true"
      android:drawableTop="@drawable/tab_sign_selector"
      android:text="今日" />
 
    <RadioButton
      android:id="@+id/record_tab"
      style="@style/Custom.TabRadioButton"
      android:drawableTop="@drawable/tab_record_selector"
      android:text="記錄" />
 
    <RadioButton
      android:id="@+id/contact_tab"
      style="@style/Custom.TabRadioButton"
      android:drawableTop="@drawable/tab_contact_selector"
      android:text="通訊錄" />
 
    <RadioButton
      android:id="@+id/settings_tab"
      style="@style/Custom.TabRadioButton"
      android:drawableTop="@drawable/tab_setting_selector"
      android:text="設(shè)置" />
  </RadioGroup>
</RelativeLayout>

2. Activity 類

public class Style2Activity extends AppCompatActivity {
 
  private ViewPager mViewPager;
  private RadioGroup mTabRadioGroup;
 
  private List<Fragment> mFragments;
  private FragmentPagerAdapter mAdapter;
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_style2);
    initView();
  }
 
  private void initView() {
    // find view
    mViewPager = findViewById(R.id.fragment_vp);
    mTabRadioGroup = findViewById(R.id.tabs_rg);
    // init fragment
    mFragments = new ArrayList<>(4);
    mFragments.add(BlankFragment.newInstance("今日"));
    mFragments.add(BlankFragment.newInstance("記錄"));
    mFragments.add(BlankFragment.newInstance("通訊錄"));
    mFragments.add(BlankFragment.newInstance("設(shè)置"));
    // init view pager
    mAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager(), mFragments);
    mViewPager.setAdapter(mAdapter);
    // register listener
    mViewPager.addOnPageChangeListener(mPageChangeListener);
    mTabRadioGroup.setOnCheckedChangeListener(mOnCheckedChangeListener);
  }
 
  @Override
  protected void onDestroy() {
    super.onDestroy();
    mViewPager.removeOnPageChangeListener(mPageChangeListener);
  }
 
  private ViewPager.OnPageChangeListener mPageChangeListener = new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
 
    }
 
    @Override
    public void onPageSelected(int position) {
      RadioButton radioButton = (RadioButton) mTabRadioGroup.getChildAt(position);
      radioButton.setChecked(true);
    }
 
    @Override
    public void onPageScrollStateChanged(int state) {
 
    }
  };
 
  private RadioGroup.OnCheckedChangeListener mOnCheckedChangeListener = new RadioGroup.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
      for (int i = 0; i < group.getChildCount(); i++) {
        if (group.getChildAt(i).getId() == checkedId) {
          mViewPager.setCurrentItem(i);
          return;
        }
      }
    }
  };
 
  private class MyFragmentPagerAdapter extends FragmentPagerAdapter {
 
    private List<Fragment> mList;
 
    public MyFragmentPagerAdapter(FragmentManager fm, List<Fragment> list) {
      super(fm);
      this.mList = list;
    }
 
    @Override
    public Fragment getItem(int position) {
      return this.mList == null ? null : this.mList.get(position);
    }
 
    @Override
    public int getCount() {
      return this.mList == null ? 0 : this.mList.size();
    }
  }
 
}

    這里唯一注意點的就是兩個監(jiān)聽事件,要實現(xiàn)底部導(dǎo)航按鈕和頁面的聯(lián)動。

四、帶頁面跳轉(zhuǎn)功能的底部導(dǎo)航

    很多 APP 的底部導(dǎo)航欄中間有一個很大的按鈕,點擊后通常是打開一個新的頁面,這里我們要實現(xiàn)的就是這種底部導(dǎo)航。
依舊是使用 RadioGroup 來做,只不過中間一個 tab 我們先用一個空的 View 來占位,然后在這個 View 的位置放置一個較大的按鈕來覆蓋住。

1. 布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context=".style3.Style3Activity">
 
  <FrameLayout
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@+id/tabs_rg" />
 
  <RadioGroup
    android:id="@+id/tabs_rg"
    android:layout_width="match_parent"
    android:layout_height="56dp"
    android:layout_alignParentBottom="true"
    android:background="#dcdcdc"
    android:orientation="horizontal">
 
    <RadioButton
      android:id="@+id/today_tab"
      style="@style/Custom.TabRadioButton"
      android:checked="true"
      android:drawableTop="@drawable/tab_sign_selector"
      android:text="今日" />
 
    <RadioButton
      android:id="@+id/record_tab"
      style="@style/Custom.TabRadioButton"
      android:drawableTop="@drawable/tab_record_selector"
      android:text="記錄" />
 
    <View style="@style/Custom.TabRadioButton" />
 
    <RadioButton
      android:id="@+id/contact_tab"
      style="@style/Custom.TabRadioButton"
      android:drawableTop="@drawable/tab_contact_selector"
      android:text="通訊錄" />
 
    <RadioButton
      android:id="@+id/settings_tab"
      style="@style/Custom.TabRadioButton"
      android:drawableTop="@drawable/tab_setting_selector"
      android:text="設(shè)置" />
  </RadioGroup>
 
  <ImageView
    android:id="@+id/sign_iv"
    android:layout_width="80dp"
    android:layout_height="80dp"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:background="@android:color/transparent"
    android:src="@mipmap/sign" />
</RelativeLayout>

2. Activity 類

public class Style3Activity extends AppCompatActivity {
 
  private RadioGroup mTabRadioGroup;
  private SparseArray<Fragment> mFragmentSparseArray;
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_style3);
    initView();
  }
 
  private void initView() {
    mTabRadioGroup = findViewById(R.id.tabs_rg);
    mFragmentSparseArray = new SparseArray<>();
    mFragmentSparseArray.append(R.id.today_tab, BlankFragment.newInstance("今日"));
    mFragmentSparseArray.append(R.id.record_tab, BlankFragment.newInstance("記錄"));
    mFragmentSparseArray.append(R.id.contact_tab, BlankFragment.newInstance("通訊錄"));
    mFragmentSparseArray.append(R.id.settings_tab, BlankFragment.newInstance("設(shè)置"));
    mTabRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
      @Override
      public void onCheckedChanged(RadioGroup group, int checkedId) {
        // 具體的fragment切換邏輯可以根據(jù)應(yīng)用調(diào)整,例如使用show()/hide()
        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
            mFragmentSparseArray.get(checkedId)).commit();
      }
    });
    // 默認顯示第一個
    getSupportFragmentManager().beginTransaction().add(R.id.fragment_container,
        mFragmentSparseArray.get(R.id.today_tab)).commit();
    findViewById(R.id.sign_iv).setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        startActivity(new Intent(Style3Activity.this, SignActivity.class));
      }
    });
  }
 
}

注意:

    如果這里你也想使用 ViewPager 來展示 Fragment 的話,一定要注意這里的 RadioGroup 中間有一個占位的 View,即兩者的監(jiān)聽事件里,實現(xiàn)聯(lián)動時要考慮多個這個 View 的存在。

代碼地址: https://gitee.com/afei_/BottomTabbar

到此這篇關(guān)于Android底部導(dǎo)航欄的三種風(fēng)格實現(xiàn)的文章就介紹到這了,更多相關(guān)Android底部導(dǎo)航欄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android利用Espresso進行UI自動化測試的方法詳解

    Android利用Espresso進行UI自動化測試的方法詳解

    因為我是搞android開發(fā)的,所以被分到了自動化測試小組,所以了解了一些UI自動化測試。下面這篇文章主要給大家介紹了關(guān)于Android利用Espresso進行UI自動化測試的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-12-12
  • Android隱藏和沉浸式虛擬按鍵NavigationBar的實現(xiàn)方法

    Android隱藏和沉浸式虛擬按鍵NavigationBar的實現(xiàn)方法

    今天小編就為大家分享一篇Android隱藏和沉浸式虛擬按鍵NavigationBar的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • 如何用HMS Nearby Service給自己的App添加近距離數(shù)據(jù)傳輸功能

    如何用HMS Nearby Service給自己的App添加近距離數(shù)據(jù)傳輸功能

    這篇文章主要介紹了如何用HMS Nearby Service給自己的App添加近距離數(shù)據(jù)傳輸功能,本文通過圖文示例代碼相結(jié)合給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • android 獲取手機內(nèi)存及 內(nèi)存可用空間的方法

    android 獲取手機內(nèi)存及 內(nèi)存可用空間的方法

    下面小編就為大家?guī)硪黄猘ndroid 獲取手機內(nèi)存及SD卡內(nèi)存可用空間的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • Android適配器(Adapter)的概念與自定義

    Android適配器(Adapter)的概念與自定義

    這篇文章主要給大家介紹了關(guān)于Android適配器(Adapter)的相關(guān)資料,適配器是一個非常重要的知識點,Adapter是用來幫助填出數(shù)據(jù)的中間橋梁,本文介紹的非常詳細,需要的朋友可以參考下
    2021-07-07
  • flutter輪子計劃之進度條

    flutter輪子計劃之進度條

    這篇文章主要為大家詳細介紹了flutter輪子計劃之進度條,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Android使用ViewPager實現(xiàn)滾動廣告

    Android使用ViewPager實現(xiàn)滾動廣告

    這篇文章主要為大家詳細介紹了Android使用ViewPager實現(xiàn)滾動廣告,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • 詳解flutter之網(wǎng)絡(luò)請求dio,請求,攔截器簡單示例

    詳解flutter之網(wǎng)絡(luò)請求dio,請求,攔截器簡單示例

    這篇文章主要介紹了詳解flutter之網(wǎng)絡(luò)請求dio,請求,攔截器簡單示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Android ListView 默認選中某一項實現(xiàn)代碼

    Android ListView 默認選中某一項實現(xiàn)代碼

    這篇文章主要介紹了Android ListView 默認選中某一項實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Android Studio 3.6安裝全過程及AVD安裝運行步驟詳解

    Android Studio 3.6安裝全過程及AVD安裝運行步驟詳解

    這篇文章主要介紹了Android Studio 3.6安裝全過程及AVD安裝運行步驟詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03

最新評論