成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

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

瀏覽:125日期: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://www.piao2010.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
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
ww久久中文字幕| 成人av资源在线| 国产成人在线视频网站| 久久亚洲综合| 午夜免费欧美电影| 香蕉久久夜色| 一区二区三区精品在线| 在线看片欧美| 国产午夜亚洲精品午夜鲁丝片| 波多野结衣中文字幕一区| 日韩免费一区二区| 高清不卡在线观看| 精品国产乱子伦一区| 粉嫩欧美一区二区三区高清影视 | 91精品国产综合久久婷婷香蕉| 另类综合日韩欧美亚洲| 在线观看91精品国产入口| 视频一区免费在线观看| 色视频一区二区| 久久成人综合网| 欧美一级国产精品| 91亚洲男人天堂| 中文字幕欧美激情一区| 亚洲久久一区| 香蕉av福利精品导航| 色综合激情久久| 久久99久久精品欧美| 日韩一区二区三区四区五区六区| 国产成人综合在线| 欧美精品一区二区三区蜜桃| 欧美日韩一区二区高清| 综合久久久久综合| 欧美亚洲免费高清在线观看| 美女国产一区二区| 欧美一级免费大片| 91偷拍与自偷拍精品| 欧美国产精品一区二区三区| 欧美午夜精品久久久久免费视| 中文字幕中文字幕中文字幕亚洲无线| 亚洲高清资源综合久久精品| 一区二区三区中文在线| 一本大道综合伊人精品热热| 国产成人在线电影| 国产三级三级三级精品8ⅰ区| 国内一区二区三区| 亚洲成在人线免费| 欧美日韩在线不卡| 国产91精品一区二区麻豆亚洲| 日韩精品一区二区三区在线观看| 91视视频在线观看入口直接观看www| 中文字幕一区二区不卡| 久久精品五月婷婷| 国产真实乱子伦精品视频| 久久久久久久性| 亚洲欧洲一级| 琪琪一区二区三区| 精品成人免费观看| 91久久视频| 免费三级欧美电影| 亚洲精品在线三区| 亚洲欧洲日本mm| 蜜桃av一区二区三区电影| 欧美成人在线直播| 亚洲精品乱码久久久久久蜜桃麻豆 | 欧美一级在线视频| 99精品视频在线观看免费| 亚洲精品中文字幕乱码三区| 91国产福利在线| jlzzjlzz国产精品久久| 亚洲欧美区自拍先锋| 欧美伊人久久久久久久久影院| 99这里都是精品| 亚洲一区二区3| 日韩一区二区三区三四区视频在线观看 | 中文字幕av资源一区| 久久国产精品免费一区| 国产suv精品一区二区883| 自拍偷拍亚洲综合| 欧美天天综合网| 欧美日韩国产探花| 日本91福利区| 国产日韩欧美精品综合| 色综合久久九月婷婷色综合| 不卡av在线免费观看| 亚洲一区二区三区免费视频| 欧美精品色一区二区三区| 黄色亚洲精品| 久久99深爱久久99精品| 国产精品你懂的| 欧美最新大片在线看| 97精品超碰一区二区三区| 亚洲一级二级三级在线免费观看| 日韩无一区二区| 亚洲欧美网站| 97精品电影院| 美女脱光内衣内裤视频久久影院| 欧美—级在线免费片| 欧美综合视频在线观看| 国产一区二区三区自拍| 激情久久久久久久久久久久久久久久| 中文字幕亚洲成人| 日韩一区二区三区精品视频| 午夜在线播放视频欧美| 91视频免费看| 日本aⅴ免费视频一区二区三区| 国产亚洲人成网站| 欧美网站大全在线观看| 亚洲精品乱码久久久久久蜜桃麻豆| 国产乱一区二区| 亚洲香蕉伊在人在线观| 日本一区二区三区免费乱视频| 欧美日韩亚洲综合| 国产亚洲毛片在线| 99久久精品情趣| 韩国中文字幕2020精品| 亚洲国产wwwccc36天堂| 国产午夜精品一区二区三区四区| 欧美午夜精品一区二区蜜桃| 亚洲激情婷婷| 福利视频网站一区二区三区| 视频在线观看国产精品| 自拍偷拍亚洲欧美日韩| 日韩欧美电影一区| 欧美性猛片xxxx免费看久爱| 99视频+国产日韩欧美| 91亚洲精华国产精华精华液| 狠狠色丁香婷婷综合| 亚洲影视资源网| 国产精品久久国产精麻豆99网站 | 午夜精品福利一区二区三区av| 日本一区二区免费在线| 欧美美女黄视频| 一本色道久久综合亚洲91| 亚洲香蕉视频| 91亚洲午夜精品久久久久久| 国产麻豆一精品一av一免费| 日本美女视频一区二区| 亚洲精品少妇30p| 国产欧美一区二区精品仙草咪| 欧美一二三区在线观看| 欧美在线free| 另类亚洲自拍| 国产欧美综合一区二区三区| 红桃视频欧美| 欧美~级网站不卡| 成人免费福利片| 国产麻豆成人精品| 久久99精品久久久久婷婷| 视频在线观看一区二区三区| 亚洲精品视频一区二区| 中文字幕av不卡| 久久九九影视网| 久久久久99精品一区| 精品久久国产字幕高潮| 日韩精品一区二区三区中文不卡 | 午夜在线一区二区| 亚洲国产精品第一区二区三区 | 国产一区二区电影| 热久久国产精品| 洋洋av久久久久久久一区| 国产精品欧美久久久久一区二区 | 免费高清在线视频一区·| 亚洲另类色综合网站| 国产精品国产三级国产专播品爱网| 国产亚洲一区二区三区四区 | 久久成人国产| 国产精品久久久久毛片大屁完整版| 亚洲一级电影| 亚洲欧洲精品一区二区三区波多野1战4 | 国产日韩一区二区三区| 91久久视频| 永久91嫩草亚洲精品人人| 国产一区二区中文| 亚洲一级特黄| 永久久久久久| av成人黄色| 久久精品综合一区| 久久精品国产综合精品| 久久伊人一区二区| 欧美无砖砖区免费| 亚洲理伦在线| 亚洲免费网站| 久久成人国产| 色婷婷综合久久| 欧美丝袜第三区| 5566中文字幕一区二区电影| 欧美一区二区三区在线观看| 日韩久久久精品| 久久久久久日产精品| 国产精品嫩草影院com| 亚洲人妖av一区二区| 亚洲午夜一区二区| 日本不卡一区二区三区| 久久99久久久久| 粉嫩嫩av羞羞动漫久久久| a4yy欧美一区二区三区| 国产精品v欧美精品v日本精品动漫| 亚洲国产二区| 色诱视频网站一区| 这里只有精品99re|