android 底部栏切换fragment(radiogroup+fragment linearlayout+fragment)

两种方式:radiogroup+fragment  和linerlayout+fragment

步骤:

1、主界面布局如下:   

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <FrameLayout
        android:id="@+id/home_fl_container"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">
    </FrameLayout>
    
    
    <RadioGroup
        android:id="@+id/home_rg_buttons"
        android:layout_width="match_parent"
        android:layout_height="55dp"
        android:orientation="horizontal"
        android:gravity="center_vertical"
       >
        <RadioButton
            android:id="@+id/home_rb_message"
            style="@style/HomeRadiobutton"
            android:drawableTop="@drawable/sel_tab_message"
            android:text="消息"
            />
        <RadioButton
            android:id="@+id/home_rb_work"
            style="@style/HomeRadiobutton"
            android:drawableTop="@drawable/sel_tab_work"
            android:text="工作"
            />
        <RadioButton
            android:id="@+id/home_rb_addressbook"
            style="@style/HomeRadiobutton"
            android:drawableTop="@drawable/sel_tab_addressbook"
            android:text="通讯录"
            />
        <RadioButton
            android:id="@+id/home_rb_personal"
            style="@style/HomeRadiobutton"
            android:drawableTop="@drawable/sel_tab_personal"
            android:text="个人"
            />

    </RadioGroup>
</LinearLayout>

效果图

贴其中一个的背景选择器  其他都类似

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:drawable="@mipmap/tab_message_selected" android:state_selected="true"></item>
   <item android:drawable="@mipmap/tab_message_selected" android:state_pressed="true"></item>
   <item android:drawable="@mipmap/tab_message_selected" android:state_checked="true"></item>
   <item android:drawable="@mipmap/tab_message_normal" ></item>
</selector>

2、  准备好所有的fragment,默认选中第一个

    prepareFragments();
    //默认选中第一个
    rb_message.setChecked(true);

private void prepareFragments() {
    fragments = new ArrayList<>();
    fragments.add(new MessageFragment());
    fragments.add(new WorkFragment());
    fragments.add(new AddressBookFragment());
    fragments.add(new PersonalFragment());
}

3、点击按钮切换fragment

@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
    switch (checkedId){
        case R.id.home_rb_message:
            showFragment(0);
            break;
        case R.id.home_rb_work:
            showFragment(1);
            break;
        case R.id.home_rb_addressbook:
            showFragment(2);
            break;
        case R.id.home_rb_personal:
            showFragment(3);
            break;
    }

}
private void showFragment(int position) {

    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    for(int i=0;i<fragments.size();i++){
        BaseFragment baseFragment = fragments.get(i);
        if(i==position){
            if(baseFragment.isAdded()){
                transaction.show(baseFragment);
            }else{
                transaction.add(R.id.home_fl_container,baseFragment);
            }
        }else{
            if(baseFragment.isAdded()){
                transaction.hide(baseFragment);
            }
        }
    }
    transaction.commitAllowingStateLoss();
}

思想就是点中该按钮  看该按钮对应的fragment添加没,,没添加就添加  添加了就显示   其他按钮对应的fragment如果添加了则隐藏

再贴一下另一种方法 :linearlayout+framlayout

1、布局编写

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">

    <FrameLayout
        android:id="@+id/fragment_content"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"></FrameLayout>

    <TextView
        style="@style/bg_line"/>

    <include layout="@layout/bottom_nav_bar"/>

</LinearLayout>

include进去的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="53dp"
              android:background="@color/white"
              android:orientation="horizontal">

    <FrameLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_centerInParent="true"
        android:layout_weight="1">

        <LinearLayout
            android:id="@+id/ll_tab_message"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center_horizontal"
            android:orientation="vertical">

            <ImageView
                android:id="@+id/iv_tab_message"
                android:layout_width="20dp"
                android:layout_height="20dp"
                android:layout_marginTop="6dp"
                android:src="@mipmap/tab_message_normal"/>

            <TextView
                android:id="@+id/tv_tab_message"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="6dp"
                android:text="@string/message"
                android:textColor="@color/black_54alpha"
                android:textSize="@dimen/txt_min"/>
        </LinearLayout>

        <com.hiteamtech.ddbes.ui.view.DragPointView
            android:id="@+id/message_num"
            android:layout_width="19dp"
            android:layout_height="19dp"
            android:layout_gravity="right"
            android:layout_marginRight="19dp"
            android:layout_marginTop="2dp"
            android:layout_toRightOf="@id/ll_tab_message"
            android:textColor="@android:color/white"
            android:textSize="12sp"
            android:visibility="invisible"/>
    </FrameLayout>

    <LinearLayout
        android:id="@+id/ll_tab_work"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center"
        android:orientation="vertical">

        <ImageView
            android:id="@+id/iv_tab_work"
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:layout_marginTop="6dp"
            android:src="@mipmap/tab_work_normal"/>

        <TextView
            android:id="@+id/tv_tab_work"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="6dp"
            android:text="@string/work"
            android:textColor="@color/black_54alpha"
            android:textSize="@dimen/txt_min"/>
    </LinearLayout>

    <LinearLayout
        android:id="@+id/ll_tab_addressbook"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center"
        android:orientation="vertical">

        <ImageView
            android:id="@+id/iv_tab_addressbook"
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:layout_marginTop="6dp"
            android:src="@mipmap/tab_addressbook_normal"/>

        <TextView
            android:id="@+id/tv_tab_addressbook"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="6dp"
            android:text="@string/addressbook"
            android:textColor="@color/black_54alpha"
            android:textSize="@dimen/txt_min"/>
    </LinearLayout>

    <LinearLayout
        android:id="@+id/ll_tab_personal"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center"
        android:orientation="vertical">

        <ImageView
            android:id="@+id/iv_tab_personal"
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:layout_marginTop="6dp"
            android:src="@mipmap/tab_personal_normal"/>

        <TextView
            android:id="@+id/tv_tab_personal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="6dp"
            android:text="@string/personal"
            android:textColor="@color/black_54alpha"
            android:textSize="@dimen/txt_min"/>
    </LinearLayout>

2、初始化所有的fragmnet ,点击切换fragment

   

@Override
public void onClick(View v) {
    super.onClick(v);
    switch (v.getId()) {
        case R.id.ll_tab_personal:
            setSelect(3);
            break;
        case R.id.ll_tab_addressbook:
            setSelect(2);
            break;
        case R.id.ll_tab_work:
            setSelect(1);
            break;
        case R.id.ll_tab_message:
            setSelect(0);
            break;
    }
}
public void setSelect(int i) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    //将Fragment中的内容隐藏
    hideFragment(transaction);
    //将底部Tab恢复默认模式
    reSetTab();
    //替换Fragment内容
    switch (i) {
        case 0:
            if (mMessageFragment == null) {
                mMessageFragment = new MessageFragment();
                transaction.add(R.id.fragment_content, mMessageFragment);
            } else {
                transaction.show(mMessageFragment);
            }
            mIv_msg.setImageResource(R.mipmap.tab_message_selected);
            mTv_msg.setTextColor(0xdd509DE1);
            setGuideConfig("home_message_guide", R.mipmap.home_message_guide_bg);
            break;
        case 1:
            if (mWorkFragment == null) {
                mWorkFragment = new WorkFragment();
                transaction.add(R.id.fragment_content, mWorkFragment);
            } else {
                transaction.show(mWorkFragment);
            }
            mIv_work.setImageResource(R.mipmap.tab_work_selected);
            mTv_work.setTextColor(0xdd509DE1);
            setGuideConfig("home_work_guide", R.mipmap.home_work_guide_bg);
            break;
        case 2:
            if (mAddressBookFragment == null) {
                mAddressBookFragment = new AddressBookFragment();
                transaction.add(R.id.fragment_content, mAddressBookFragment);
            } else {
                transaction.show(mAddressBookFragment);
            }
            mIv_addressbook.setImageResource(R.mipmap.tab_addressbook_selected);
            mTv_addressbook.setTextColor(0xdd509DE1);
            setGuideConfig("home_contact_guide", R.mipmap.home_contact_guide_bg);
            break;
        case 3:
            if (mPersonalFragment == null) {
                mPersonalFragment = new PersonalFragment();
                transaction.add(R.id.fragment_content, mPersonalFragment);
            } else {
                transaction.show(mPersonalFragment);
            }
            mIv_personal.setImageResource(R.mipmap.tab_personal_selected);
            mTv_personal.setTextColor(0xdd509DE1);
            setGuideConfig("home_personal_guide", R.mipmap.home_personal_guide_bg);
            break;
    }
    transaction.commitAllowingStateLoss();
}

//隐藏现有的fragment

//隐藏现有的fragment
private void hideFragment(FragmentTransaction transaction) {
    if (mPersonalFragment != null)
        transaction.hide(mPersonalFragment);
    if (mAddressBookFragment != null)
        transaction.hide(mAddressBookFragment);
    if (mWorkFragment != null)
        transaction.hide(mWorkFragment);
    if (mMessageFragment != null)
        transaction.hide(mMessageFragment);
}

//恢复底部栏图标文字默认的颜色

private void reSetTab() {
    mIv_msg.setImageResource(R.mipmap.tab_message_normal);
    mIv_work.setImageResource(R.mipmap.tab_work_normal);
    mIv_addressbook.setImageResource(R.mipmap.tab_addressbook_normal);
    mIv_personal.setImageResource(R.mipmap.tab_personal_normal);

    mTv_msg.setTextColor(0x8a000000);
    mTv_work.setTextColor(0x8a000000);
    mTv_addressbook.setTextColor(0x8a000000);
    mTv_personal.setTextColor(0x8a000000);
}

小感慨(瞎写):这基本是每个app主界面的常见设置  ,进入主界面 ,点击底部栏切换fragment  。然后现在框架太多,我又是个纠结的人  每次都不知道用哪个框架 ,比如常用的有FragmentHost,tablayout,PagerSlidingTabStrip等,但是我觉得程序员每个都会用学的很杂 然后不懂这是个什么东西是个很恐怖的东西,而且项目能少引进三方尽量少引进 ,要不然天天用三方 ,最后你也就会用个三方了 ,所以这个我一般都推荐自己写linearlayout+fragment 或者radiogroup+fragment ,把某个研究明白 ,什么需求都可以实现就可以了。跟学技术一样,某个方面需要很深入的了解,其他方面大概也得知道。以防别人提到时你都不知道是干嘛的

猜你喜欢

转载自blog.csdn.net/weixin_38811767/article/details/81353207
今日推荐