关于Fragment的显示与隐藏结合RadioGroup的默认选中问题

package myapp.first.myapplication.ui;

import android.support.v4.app.FragmentManager;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;

import myapp.first.myapplication.R;
import myapp.first.myapplication.tools.FragmentFactory;
import myapp.first.myapplication.tools.FragmentUtils;
import myapp.first.myapplication.tools.LogUtils;

public class MainActivity extends MyBaseActivity{

    private FrameLayout fl_container;
    private RadioButton rb1;
    private RadioButton rb2;
    private RadioButton rb3;
    private RadioButton rb4;
    private RadioGroup rg;
    private LinearLayout activity_main;
    private FragmentManager fragmentManager;
    private MyBaseFragment currentFragment;


    @Override
    public void init() {
        fragmentManager = getSupportFragmentManager();
    }

    @Override
    public int getLayoutResID() {
        return R.layout.activity_main;
    }

    public void initView() {
        fl_container = (FrameLayout) findViewById(R.id.fl_container);
        rb1 = (RadioButton) findViewById(R.id.rb1);
        rb2 = (RadioButton) findViewById(R.id.rb2);
        rb3 = (RadioButton) findViewById(R.id.rb3);
        rb4 = (RadioButton) findViewById(R.id.rb4);
        rg = (RadioGroup) findViewById(R.id.rg);
        activity_main = (LinearLayout) findViewById(R.id.activity_main);
    }

    @Override
    public void initData() {

    }

    @Override
    public void initListener() {
        rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                int i = -1;
                switch (checkedId){
                    case R.id.rb1:
                        FragmentFactory.create(0);
                        currentFragment = FragmentFactory.getCurrentFragment(0);
                        i = 0;
                        break;
                    case R.id.rb2:
                        FragmentFactory.create(1);
                        currentFragment = FragmentFactory.getCurrentFragment(1);
                        i = 1;
                        break;
                    case R.id.rb3:
                        FragmentFactory.create(2);
                        currentFragment = FragmentFactory.getCurrentFragment(2);
                        i = 2;
                        break;
                    case R.id.rb4:
                        FragmentFactory.create(3);
                        currentFragment = FragmentFactory.getCurrentFragment(3);
                        i = 3;
                        break;
                }
                LogUtils.e(mContext,"选中 :"+i);
                FragmentUtils.show(fragmentManager,R.id.fl_container,currentFragment);
            }
        });
        ((RadioButton)rg.findViewById(R.id.rb1)).setChecked(true);
//        rg.check(R.id.rb1);  会调用多次选中0  应该是两次都走到了判断的里面  造成重复add的错误
    }

}
package myapp.first.myapplication.tools;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;

/**
 * Created by Administrator on 2016/10/7 0007.
 */

public class FragmentUtils {

    public static Fragment preFragment;

    public static Fragment getPreFragment() {
        return preFragment;
    }

    public static void setCurrentFragment(Fragment currentFragment){
        preFragment = currentFragment;
    }

    public static void show(FragmentManager fragmentManager, int containerID, Fragment showFragment){
        if (preFragment == null)
            show(fragmentManager,containerID,showFragment,null);
        else
            show(fragmentManager,containerID,showFragment,preFragment);
    }

    public static void show(FragmentManager fragmentManager, int containerID, Fragment showFragment,Fragment hideFragment){
        FragmentTransaction transition = fragmentManager.beginTransaction();
        if (!showFragment.isAdded()){
            transition.add(containerID,showFragment);
//            transition.add(containerID,showFragment).addToBackStack(null);
        }
        if (hideFragment == null)
            transition.show(showFragment);
        else
            transition.hide(preFragment).show(showFragment);  // 这里先隐藏后显示  是为了解决 后退时选中的是第一个 再进程序时 第一个被隐藏的Bug
        transition.commit();
        preFragment = showFragment;
    }
}

package myapp.first.myapplication.tools;

import android.support.v4.app.Fragment;

import java.util.HashMap;
import java.util.Map;

import myapp.first.myapplication.ui.FragmentRbtn1;
import myapp.first.myapplication.ui.FragmentRbtn2;
import myapp.first.myapplication.ui.FragmentRbtn3;
import myapp.first.myapplication.ui.FragmentRbtn4;
import myapp.first.myapplication.ui.MyBaseFragment;

/**
 * Created by wangx on 2016/7/5.
 * 生产Fragment的工厂类
 */
public class FragmentFactory {
    private static Map<Integer, MyBaseFragment> fragmentMap = new HashMap<>();

    /***
     * 生产Fragment
     *
     * @param position
     * @return
     */
    public static MyBaseFragment create(int position) {
        // 先在缓存中取
        MyBaseFragment fragment = fragmentMap.get(position);
        //取不到 就重新创建
        if (fragment == null) {
            if (position == 0) {
                fragment = new FragmentRbtn1();
            } else if (position == 1) {
                fragment = new FragmentRbtn2();
            } else if (position == 2) {
                fragment = new FragmentRbtn3();
            } else if (position == 3) {
                fragment = new FragmentRbtn4();
            }
            // 缓存Fragment对象
            if (fragment != null) {
                fragmentMap.put(position, fragment);
            }
        }
        return fragment;
    }

    public static MyBaseFragment getCurrentFragment(int index){
        return fragmentMap.get(index);
    }
}



  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Android底部导航栏的实现可以通过使用RadioGroupFragment结合使用来实现。首先,在布局文件中添加一个RadioGroup,然后在其中添加多个RadioButton,每个RadioButton代表一个导航项。接着,使用Fragment来实现每个导航项对应的页面内容。在RadioGroup中设置监听器,当用户点击某个RadioButton时,切换到对应Fragment页面。这样就可以实现一个简单的底部导航栏了。 ### 回答2: Android底部导航栏的实现一般可以通过RadioGroupFragment结合使用来完成。首先,在XML布局文件中定义一个RadioGroup,并在其中添加多个RadioButton,每个RadioButton对应导航栏中的一个选项。 接下来,在Activity中,我们需要定义一个Fragment的容器,用于加载不同的Fragment页面。在RadioGroup的选择监听器中,根据所选中RadioButton的id,切换对应Fragment页面。 在切换Fragment页面时,可以使用FragmentManager和FragmentTransaction来实现。通过FragmentManager的beginTransaction()方法获取一个FragmentTransaction的实例,然后使用replace()方法将容器中的Fragment替换为选中的目标Fragment,最后通过commit()方法提交事务即可完成页面切换。 为了方便管理和切换Fragment,可以定义一个Fragment的集合,用于存放所有的Fragment实例,并在选择监听器中根据RadioButton的顺序获取对应Fragment。 另外,为了保持Fragment的状态,在切换Fragment时可以使用hide()和show()方法而不是replace()来隐藏显示Fragment,这样可以避免Fragment被重复实例化。 总结来说,通过RadioGroupFragment结合使用,我们可以实现Android底部导航栏的功能。通过监听RadioGroupRadioButton的选择事件,来切换不同的Fragment页面。这样可以实现底部导航栏的选项切换,同时保持Fragment的状态。 ### 回答3: Android底部导航栏的实现可以通过使用RadioGroupFragment来实现。 首先,我们可以在布局文件中创建一个包含多个RadioButton的RadioGroup,这些RadioButton将作为底部导航栏的按钮。我们可以为每个RadioButton设置图标和文本,以表示不同的导航选项。通过设置RadioGroup的布局属性可以将其放置在屏幕的底部。 接下来,我们需要创建对应Fragment,并在Activity中使用FragmentTransaction来进行Fragment的切换。在FragmentTransaction中,我们可以通过调用replace方法来替换Activity中的显示内容,将选中RadioButton对应Fragment显示出来。 当用户点击底部导航栏的RadioButton时,我们可以通过设置RadioGroup的OnCheckedChangeListener来监听选中项的变化。当选中项发生变化时,我们可以获取选中RadioButton对应Fragment,并使用FragmentTransaction来进行Fragment的切换,从而显示选中Fragment。 此外,为了更好地控制底部导航栏的切换效果,我们还可以使用fragment的缓存机制以提高切换的效率,避免每次切换都重新创建Fragment对象。 总之,通过结合RadioGroupFragment的使用,我们可以方便地实现Android底部导航栏的功能,使用户可以方便地在不同的导航选项之间进行切换。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值