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

您的位置:首頁技術(shù)文章
文章詳情頁

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

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

一、效果圖展示

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

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

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

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

二、BottomNavigationView

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

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 屬性了,它指定了你的導(dǎo)航欄顯示的頁面菜單是怎樣的。

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

三、RadioGroup + ViewPager

這是一種比較常見了的,下面 4 個(gè) tab 的導(dǎo)航按鈕,可以切換不同的頁面,這里頁面使用了 ViewPager + Fragment 的組合,實(shí)現(xiàn)了滑動的頁面效果,也可以不使用 ViewPager,這個(gè)根據(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: 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='設(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(); } } }

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

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

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

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='設(shè)置' /> </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.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('設(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(); } }); // 默認(rèn)顯示第一個(gè) 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 中間有一個(gè)占位的 View,即兩者的監(jiān)聽事件里,實(shí)現(xiàn)聯(lián)動時(shí)要考慮多個(gè)這個(gè) View 的存在。

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

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

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久精品一区二区三区中文字幕| 香蕉久久99| 亚洲毛片网站| 久久精品亚洲一区二区| 欧美日韩激情| 久久99国产精品视频| 日韩**一区毛片| 黄色日韩精品| 国产成人精品999在线观看| 欧美一区免费| 综合激情网站| 亚洲欧美日韩专区| 一区二区三区四区日本视频| 日本va欧美va瓶| 亚洲日韩视频| 女人天堂亚洲aⅴ在线观看| 日本激情一区| 欧美黄色网页| 久久人人97超碰国产公开结果| 欧美日韩水蜜桃| 国产精选在线| 捆绑调教美女网站视频一区| 狠狠干综合网| 日本欧美在线| 最新日韩av| а√天堂8资源中文在线| 日本99精品| 九九色在线视频| 麻豆视频一区| 日韩制服丝袜av| 国产白浆在线免费观看| 四虎国产精品免费久久| 黄毛片在线观看| 国产精品日本一区二区三区在线| 精品亚洲美女网站| 久久久夜夜夜| 精精国产xxxx视频在线野外| 欧美a级一区| 亚洲一区日本| 亚洲人成精品久久久| 日本不卡一二三区黄网| 精品国产乱码久久久久久樱花| 成人在线视频免费| 99国产精品视频免费观看一公开 | 免费人成精品欧美精品| 日韩三级久久| 日韩免费视频| 中文字幕亚洲在线观看| 国产精品高清一区二区| 亚洲精品网址| 国产一区二区三区久久| 麻豆成人在线| 国产一区不卡| 日韩av不卡一区二区| 精品美女视频| 夜夜嗨一区二区| 高清av一区| 国产成人精品亚洲线观看| 欧美性www| 免播放器亚洲| 九九色在线视频| 国产精品日本一区二区不卡视频| 激情五月色综合国产精品| 国产福利一区二区三区在线播放| 激情欧美亚洲| 亚洲性色av| 久久久久黄色| 欧美一区久久| 日韩av影院| av不卡免费看| 久久精品高清| 日本不卡免费高清视频在线| 久久av影院| 69堂精品视频在线播放| 日本va欧美va瓶| 日韩视频在线一区二区三区 | 欧美.日韩.国产.一区.二区 | 91精品国产自产在线丝袜啪| 国产视频久久| 黄色欧美日韩| 免费在线观看视频一区| 男人的天堂久久精品| 在线精品国产亚洲| 中文精品视频| 久久亚洲视频| 欧美一区免费| 国产高清精品二区| 国产福利一区二区精品秒拍| 精品久久久亚洲| 欧美交a欧美精品喷水| se01亚洲视频| 久久精品国产久精国产| 性色一区二区| 亚洲欧美综合| 国产精品久久久一区二区| 一区在线免费观看| 亚洲综合在线电影| 精品视频一区二区三区在线观看 | 成人国产综合| 日韩国产欧美三级| 在线国产精品一区| 亚洲国产专区校园欧美| 国产一区二区久久久久| 中文国产一区| 日韩精品视频一区二区三区| 国产精品第一国产精品| 亚洲综合在线电影| 国产亚洲在线观看| 国产伦精品一区二区三区千人斩| 日韩一区自拍| 免费一区二区视频| 97精品国产一区二区三区| 国产视频一区三区| 国产成人精品一区二区三区免费| 激情综合激情| 婷婷综合一区| 在线观看精品| 国产精品毛片视频| 免费日韩精品中文字幕视频在线| 久久久精品国产**网站| 久久中文字幕二区| 亚洲精品在线国产| 精品少妇av| 日韩二区三区在线观看| 日韩国产在线| 久久精品国产久精国产爱| 亚洲自啪免费| 91久久久精品国产| 狠狠躁少妇一区二区三区| 日本久久二区| 国产视频久久| 亚洲激情精品| 精品在线99| 日韩欧美二区| 成年男女免费视频网站不卡| 视频一区日韩精品| 狠狠干成人综合网| 欧美成人日韩| 一本一道久久a久久| 日本视频在线一区| 国产精品视频3p| 国产精品xvideos88| 精品72久久久久中文字幕| 国产一区二区精品久| 91精品久久久久久久久久不卡| 亚洲天堂av影院| 久久精品青草| 亚洲香蕉视频| 精品国产精品久久一区免费式| 日本久久综合| 欧美在线亚洲综合一区| 91精品国产乱码久久久久久久| 在线看片日韩| 麻豆国产一区| 久久高清免费| 视频一区欧美精品| 欧美精品第一区| 一本大道色婷婷在线| 黄页网站一区| 蜜桃精品视频| 蘑菇福利视频一区播放| 国产美女精品视频免费播放软件| 国产精品毛片一区二区在线看| 在线日韩中文| 亚洲自拍另类| 国产精品九九| 日韩1区2区| 亚洲区第一页| 欧美日韩国产高清电影| 欧美日本二区| 亚洲女人av| 色偷偷色偷偷色偷偷在线视频| 亚洲影院天堂中文av色| 成人在线视频免费| 亚洲精品在线二区| 国产一区二区精品福利地址| 日韩视频不卡| 精品九九在线| 日日摸夜夜添夜夜添国产精品| 精精国产xxxx视频在线野外| 国产欧美自拍| 91精品啪在线观看国产18| 国产精品99久久免费| 另类激情亚洲| 久久久久久久久久久妇女| 国产精品亚洲欧美一级在线| 99国产成+人+综合+亚洲欧美| 国产精品久一| 免费不卡在线视频| 999精品色在线播放| 欧美精品导航| 日韩精品一区二区三区免费视频 | 日韩高清欧美激情| 国产成人77亚洲精品www| 亚洲久久在线| 一区二区亚洲精品| 亚洲高清激情| 亚洲v在线看| 一区二区精品伦理...| 国产欧美日韩一区二区三区四区 |