日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Android底部導航欄的三種風格實現

瀏覽:156日期:2022-09-23 17:42:47

一、效果圖展示

Android底部導航欄的三種風格實現

如果動圖沒有動的話,也可以看下面這個靜態圖

Android底部導航欄的三種風格實現

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

二、BottomNavigationView

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

1. 在 xml 中使用

<android.support.design.widget.BottomNavigationView android: 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 屬性了,它指定了你的導航欄顯示的頁面菜單是怎樣的。

2. menu 的布局文件

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

3. 在 Activity 中調用

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 目前我還沒有在項目中實際使用過,這里不做過多分析,使用起來不難,以上代碼已經足以滿足我們的基本使用要求了。

三、RadioGroup + ViewPager

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

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: android:layout_width='match_parent' android:layout_height='match_parent' android:layout_above='@+id/tabs_rg' /> <RadioGroup android: android:layout_width='match_parent' android:layout_height='56dp' android:layout_alignParentBottom='true' android:background='#dcdcdc' android:orientation='horizontal'> <RadioButton android: android:checked='true' android:drawableTop='@drawable/tab_sign_selector' android:text='今日' /> <RadioButton android: android:drawableTop='@drawable/tab_record_selector' android:text='記錄' /> <RadioButton android: android:drawableTop='@drawable/tab_contact_selector' android:text='通訊錄' /> <RadioButton android: android:drawableTop='@drawable/tab_setting_selector' android:text='設置' /> </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('設置')); // 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(); } } }

這里唯一注意點的就是兩個監聽事件,要實現底部導航按鈕和頁面的聯動。

四、帶頁面跳轉功能的底部導航

很多 APP 的底部導航欄中間有一個很大的按鈕,點擊后通常是打開一個新的頁面,這里我們要實現的就是這種底部導航。依舊是使用 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: android:layout_width='match_parent' android:layout_height='match_parent' android:layout_above='@+id/tabs_rg' /> <RadioGroup android: android:layout_width='match_parent' android:layout_height='56dp' android:layout_alignParentBottom='true' android:background='#dcdcdc' android:orientation='horizontal'> <RadioButton android: android:checked='true' android:drawableTop='@drawable/tab_sign_selector' android:text='今日' /> <RadioButton android: android:drawableTop='@drawable/tab_record_selector' android:text='記錄' /> <View /> <RadioButton android: android:drawableTop='@drawable/tab_contact_selector' android:text='通訊錄' /> <RadioButton android: android:drawableTop='@drawable/tab_setting_selector' android:text='設置' /> </RadioGroup> <ImageView android: android:layout_width='80dp' android:layout_height='80dp' android:layout_alignParentBottom='true' android:layout_centerHorizontal='true' android:background='@android:color/transparent' android:src='http://m.b3g6.com/bcjs/@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('設置')); mTabRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) {// 具體的fragment切換邏輯可以根據應用調整,例如使用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,即兩者的監聽事件里,實現聯動時要考慮多個這個 View 的存在。

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

到此這篇關于Android底部導航欄的三種風格實現的文章就介紹到這了,更多相關Android底部導航欄內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美aⅴ一区二区三区视频| 亚洲色图综合| 国产日韩视频| 国产日韩欧美一区二区三区在线观看| 亚洲精品影视| 日韩精品一区二区三区中文字幕| 日本午夜精品久久久| 欧美综合精品| 久久99久久人婷婷精品综合| 精品三级av在线导航| 日产精品一区二区| 午夜精品成人av| 色网在线免费观看| 99tv成人| 一区二区三区国产在线| 日本a口亚洲| 麻豆精品视频在线观看免费| 日韩成人a**站| 影视先锋久久| 亚洲综合中文| 久久久精品国产**网站| 香蕉成人av| 蜜乳av另类精品一区二区| 日韩精品电影一区亚洲| 国产精品免费99久久久| 另类专区亚洲| 亚洲精品123区| 日韩福利在线观看| 国产精品一级| 日韩一区二区在线免费| 亚洲少妇诱惑| 国产日韩一区二区三区在线播放| 91亚洲国产| 亚洲综合精品四区| 日韩不卡一二三区| 色婷婷亚洲mv天堂mv在影片| 午夜av一区| 国产午夜久久av| 三上悠亚国产精品一区二区三区| 视频在线观看一区| 久久99高清| 老牛影视一区二区三区| 欧美激情福利| 欧美中文字幕一区二区| 青青草伊人久久| 成人国产精品一区二区网站| 在线视频精品| 精品精品国产三级a∨在线| 午夜欧美在线| 国产精品毛片aⅴ一区二区三区| 99视频精品全国免费| 欧美一级全黄| av一区二区高清| 国产精品sm| 狠狠色狠狠色综合日日tαg| 国产精品亚洲二区| 午夜欧美理论片| 美女久久久精品| 激情五月综合网| 国产精品白丝一区二区三区| 亚洲免费婷婷| 韩国久久久久久| 日韩不卡一二三区| 亚洲精品一区二区在线看| 国产精品宾馆| 蜜臀久久99精品久久久画质超高清 | 国产91在线播放精品| 欧美特黄一级| 久久精品国产一区二区| 日韩在线a电影| 欧美丰满日韩| 欧美在线不卡| 99国产精品私拍| 日本久久黄色| 欧美专区一区| 日av在线不卡| 亚洲午夜黄色| 国产中文字幕一区二区三区| 日本成人精品| 国产精品女主播一区二区三区| 国产精品porn| 亚洲精品美女91| 不卡一区2区| 国产传媒av在线| 欧美黄色一区| 人人精品久久| 免费观看在线综合| 免费不卡中文字幕在线| 高清日韩欧美| 国产精品大片免费观看| 日韩精选在线| 日本大胆欧美人术艺术动态| 韩日一区二区三区| 日韩综合精品| 国产一区二区三区四区大秀| 四虎精品一区二区免费| 黄色精品网站| 日韩欧美三级| 国产精品99一区二区三区| 国产精品一区毛片| 午夜天堂精品久久久久| 先锋影音国产一区| 亚洲激情中文| 精品在线91| 99精品在线| 日韩成人亚洲| а√天堂8资源中文在线| 麻豆成人av在线| 久久国产视频网| 日本视频中文字幕一区二区三区| 奶水喷射视频一区| 99riav国产精品| 欧美午夜不卡影院在线观看完整版免费| 国产探花一区| 影音先锋久久精品| 视频一区二区中文字幕| aa亚洲婷婷| 男女精品网站| 亚洲永久精品唐人导航网址| 亚洲欧美不卡| 久久久久91| 秋霞国产精品| 久久一区二区中文字幕| 日本国产精品| 欧美日韩国产在线观看网站| 久久天堂成人| 国产精品88久久久久久| 亚洲女同一区| 老鸭窝毛片一区二区三区| 国产女优一区| 亚洲一区二区免费在线观看| 亚洲狼人精品一区二区三区| 日韩精彩视频在线观看| 国产精品欧美三级在线观看 | 久久av一区二区三区| 国产精品美女| 亚洲欧美日韩精品一区二区| 老鸭窝毛片一区二区三区| 日韩一区精品字幕| 亚洲一区二区三区在线免费| 视频一区中文字幕精品 | 亚洲精品一二| 欧美日韩视频免费看| 国产精品15p| 中文在线资源| 91九色精品| 亚洲三级毛片| 国产精品成人3p一区二区三区| 国产精品一区二区精品| 精品91福利视频| 毛片在线网站| 国产精品伦理久久久久久| 欧美日韩在线观看视频小说| 欧美大黑bbbbbbbbb在线| 婷婷精品进入| 蜜臀av性久久久久蜜臀aⅴ流畅 | 国产精品美女午夜爽爽| 国产一区2区| 亚洲第一区色| 亚洲伊人精品酒店| 日韩激情一区二区| 精品国产18久久久久久二百| 美女少妇全过程你懂的久久| 婷婷视频一区二区三区| 成人午夜网址| 国产亚洲在线| 国产精品白丝久久av网站| 精品国模一区二区三区| 中文字幕一区二区av| 久久精品国产免费| 伊人精品一区| 青青草精品视频| 亚洲成人不卡| 婷婷五月色综合香五月| 福利一区二区| 尤物精品在线| 久久国产乱子精品免费女| 日韩欧美精品一区| 中文字幕成人| 日韩理论视频| 少妇高潮一区二区三区99| 黄色在线观看www| 亚洲免费福利一区| 黄色在线观看www| 日韩中文字幕在线一区| 午夜av成人| 欧美一级全黄| 亚洲激情精品| 国产a亚洲精品| 亚洲性视频在线| 国产精品麻豆久久| 日韩中文一区二区| 欧美中文一区二区| 美女国产精品久久久| 三级亚洲高清视频| 高清不卡亚洲| 88久久精品| 亚洲美洲欧洲综合国产一区| 久久久久亚洲精品中文字幕| 亚洲专区视频|