實(shí)現(xiàn)效果
????????效果如下,使用RadioGroup實(shí)現(xiàn),不能左右滑動(dòng)切換頁(yè)面,適用于導(dǎo)航頁(yè)里還有需要切換頁(yè)面的場(chǎng)景,如果需要滑動(dòng)效果,使用ViewPager實(shí)現(xiàn)。
?準(zhǔn)備工作
??????? 以下示例按照?qǐng)D上實(shí)現(xiàn),具體多少個(gè)頁(yè)面,按需修改。
??????? 由于需要用到icon,提前下載好圖標(biāo)到drawable文件。
??????? 提前定義好樣式
??????? 在values文件下新建styles.xml,用作fragment的布局樣式,代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="fragment">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">match_parent</item>
<item name="android:padding">5dp</item>
<item name="android:gravity">center</item>
<item name="android:textColor">@drawable/rb_text_color</item>
<item name="android:textSize">10dp</item>
<item name="android:textStyle">normal</item>
</style>
</resources>
??????? 首頁(yè)的選擇圖標(biāo)樣式,在drawable文件下新建rb_home_selector.xml,代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/home2" android:state_selected="true" />
<item android:drawable="@drawable/home" />
</selector>
??????? 個(gè)人頁(yè)面圖標(biāo),drawable下新建rb_mine_selector.xml,如下:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/mine2" android:state_selected="true" />
<item android:drawable="@drawable/mine" />
</selector>
???????? 選擇頁(yè)面時(shí)的字體樣式,drawable下新建rb_text_color.xml,如下;
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:color="#1296db"/>
<item android:color="#808080"/>
</selector>
使用replace方法代碼實(shí)現(xiàn)
??????? 什么是replace方法,使用replace方法,當(dāng)切換碎片時(shí),當(dāng)前碎片會(huì)銷毀,下次切換回來(lái)時(shí)再重新創(chuàng)建,適用于只使用一次碎片的場(chǎng)景。
activity_main.xml代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<FrameLayout
android:id="@+id/fragment_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
/>
<RadioGroup
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/rg_group"
android:layout_alignParentBottom="true"
android:background="#ffff"
android:orientation="horizontal"
>
<RadioButton
android:id="@+id/rb_home"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:button="@null"
style="@style/fragment"
android:drawableTop="@drawable/rb_home_selector"
android:text="首頁(yè)"
/>
<RadioButton
android:id="@+id/rb_mine"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:button="@null"
style="@style/fragment"
android:drawableTop="@drawable/rb_mine_selector"
android:text="我的"
/>
</RadioGroup>
</RelativeLayout>
MainActivity類如下:
public class MainActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener {
private RadioButton rb_home,rb_mine;
private RadioGroup rg_group;
private List<Fragment> fragments;
private int position=0;
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.getSupportActionBar().hide();//去除標(biāo)題欄
rb_home=findViewById(R.id.rb_home);
rb_mine=findViewById(R.id.rb_mine);
rg_group=findViewById(R.id.rg_group);
//默認(rèn)選中第一個(gè)
rb_home.setSelected(true);
rg_group.setOnCheckedChangeListener(this);
//初始化fragment
initFragment();
//默認(rèn)布局,選第一個(gè)
defaultFragment();
}
private void defaultFragment() {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.fragment_layout,fragments.get(0));
transaction.commit();
}
private void setSelected() {
rb_home.setSelected(false);
rb_mine.setSelected(false);
}
private void initFragment() {
fragments = new ArrayList<>();
fragments.add(0,new homeFragment());
fragments.add(1,new mineFragment());
}
@Override
public void onCheckedChanged(RadioGroup group, int i) {
//獲取fragment管理類對(duì)象
FragmentManager fragmentManager = getSupportFragmentManager();
//拿到fragmentManager的觸發(fā)器
FragmentTransaction transaction = fragmentManager.beginTransaction();
switch (i) {
case R.id.rb_home:
position = 0;
//調(diào)用replace方法,將fragment,替換到fragment_layout這個(gè)id所在UI,或者這個(gè)控件上面來(lái)
//這是創(chuàng)建replace這個(gè)事件,如果想要這個(gè)事件執(zhí)行,需要把這個(gè)事件提交給觸發(fā)器
//用commit()方法
transaction.replace(R.id.fragment_layout, fragments.get(0));
//將所有導(dǎo)航欄設(shè)成默認(rèn)色
setSelected();
rb_home.setSelected(true);
break;
case R.id.rb_mine:
position = 1;
transaction.replace(R.id.fragment_layout, fragments.get(1));
//將所有導(dǎo)航欄設(shè)成默認(rèn)色
setSelected();
rb_mine.setSelected(true);
break;
}
//事件的提交
transaction.commit();
}
}
??????? 如下圖操作新建fragment類,一起創(chuàng)建xml文件
???????? homeFragment.java代碼:這個(gè)類寫(xiě)頁(yè)面的具體邏輯
public class homeFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_home, container, false);
return view;
}
}
??????? mineFragment類和上面一樣,略。
??????? fragment_home.xml和fragment_mine.xml里按需寫(xiě)頁(yè)面的布局就可以了。
完成。
使用add和hide方法
????????通過(guò)add、hide、show方法顯示隱藏碎片,當(dāng)下次切換回當(dāng)前碎片時(shí),不會(huì)重新創(chuàng)建碎片,適用于多次使用碎片的場(chǎng)景,比如導(dǎo)航欄。
????????布局和上面方法的布局一樣。
??????? 只修改MainActivity類:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-498734.html
??????? 先判斷有沒(méi)有添加碎片,如果沒(méi)有則添加碎片(注意需要判斷,重復(fù)添加會(huì)報(bào)錯(cuò)),隱藏所有的碎片,再展示當(dāng)前選擇的碎片。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-498734.html
public class MainActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener {
private RadioButton rb_home,rb_schedule,rb_circle,rb_rank,rb_mine;
private RadioGroup rg_group;
private List<Fragment> fragments;
private int position=0;
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setStatusBar();//設(shè)置狀態(tài)欄和標(biāo)題欄
rb_home=findViewById(R.id.rb_home);
rb_schedule=findViewById(R.id.rb_schedule);
rb_circle=findViewById(R.id.rb_circle);
rb_rank=findViewById(R.id.rb_rank);
rb_mine=findViewById(R.id.rb_mine);
rg_group=findViewById(R.id.rg_group);
//默認(rèn)選中第一個(gè)
rb_home.setSelected(true);
rg_group.setOnCheckedChangeListener(this);
//初始化fragment
initFragment();
//默認(rèn)布局,選第一個(gè)
defaultFragment();
}
private void defaultFragment() {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.add(R.id.fragment_layout,fragments.get(0));
transaction.commit();
}
private void setSelected() {
rb_home.setSelected(false);
rb_schedule.setSelected(false);
rb_circle.setSelected(false);
rb_rank.setSelected(false);
rb_mine.setSelected(false);
}
private void initFragment() {
fragments = new ArrayList<>();
fragments.add(0,new HomeFragment());
fragments.add(1,new ScheduleFragment());
fragments.add(2,new CircleFragment());
fragments.add(3,new RankFragment());
fragments.add(4,new MineFragment());
}
@Override
public void onCheckedChanged(RadioGroup group, int i) {
//獲取fragment管理類對(duì)象
FragmentManager fragmentManager = getSupportFragmentManager();
//拿到fragmentManager的觸發(fā)器
FragmentTransaction transaction = fragmentManager.beginTransaction();
switch (i) {
case R.id.rb_home:
position = 0;
// transaction.replace(R.id.fragment_layout, fragments.get(0));
if(!fragments.get(0).isAdded())
transaction.add(R.id.fragment_layout,fragments.get(0));
hideFragment(transaction);
transaction.show(fragments.get(0));
//將所有導(dǎo)航欄設(shè)成默認(rèn)色
setSelected();
rb_home.setSelected(true);
break;
case R.id.rb_schedule:
position = 1;
if(!fragments.get(1).isAdded())
transaction.add(R.id.fragment_layout,fragments.get(1));
hideFragment(transaction);
transaction.show(fragments.get(1));
//將所有導(dǎo)航欄設(shè)成默認(rèn)色
setSelected();
rb_schedule.setSelected(true);
break;
case R.id.rb_circle:
position = 2;
if(!fragments.get(2).isAdded())
transaction.add(R.id.fragment_layout,fragments.get(2));
hideFragment(transaction);
transaction.show(fragments.get(2));
//將所有導(dǎo)航欄設(shè)成默認(rèn)色
setSelected();
rb_circle.setSelected(true);
break;
case R.id.rb_rank:
position = 3;
if(!fragments.get(3).isAdded())
transaction.add(R.id.fragment_layout,fragments.get(3));
hideFragment(transaction);
transaction.show(fragments.get(3));
//將所有導(dǎo)航欄設(shè)成默認(rèn)色
setSelected();
rb_rank.setSelected(true);
break;
case R.id.rb_mine:
position = 4;
if(!fragments.get(4).isAdded())
transaction.add(R.id.fragment_layout,fragments.get(4));
hideFragment(transaction);
transaction.show(fragments.get(4));
//將所有導(dǎo)航欄設(shè)成默認(rèn)色
setSelected();
rb_mine.setSelected(true);
break;
}
//事件的提交
transaction.commit();
}
private void hideFragment(FragmentTransaction transaction){
if(fragments.get(0) != null){
transaction.hide(fragments.get(0));
}
if(fragments.get(1) != null){
transaction.hide(fragments.get(1));
}
if(fragments.get(2) != null) {
transaction.hide(fragments.get(2));
}
if(fragments.get(3) != null){
transaction.hide(fragments.get(3));
}
if(fragments.get(4) != null){
transaction.hide(fragments.get(4));
}
}
}
到了這里,關(guān)于【Android入門(mén)到項(xiàng)目實(shí)戰(zhàn)-- 11.2】—— 實(shí)現(xiàn)底部導(dǎo)航欄(RadioGroup+Fragment)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!