#Android项目# ——day01 Fragment搭配RadioGroup创建导航栏

需求:

1. 底部导航栏中部按钮突出可以选择
2. 点击中部按钮弹出悬浮框选择功能

分析:

  • 制作一个四个 RadioButton 按钮的导航栏,中间使用一个 View去占位 。再利用 RelativeLayout 的特性把中间需要突出的按钮用 ImageView 去覆盖在 View 上面
  • 在后端代码绑定中间突出的 ImageView 设置它的点击事件,实现使用 Dialog 显示弹窗

效果:

#Android项目# ——day01 Fragment搭配RadioGroup创建导航栏_第1张图片

今天的收获:

  • 使用AndroidStudio自带的 BottomNavigationView 控件item多于3个时文字不显示的解决方案

转载:在升级API28之前,该解决方案主要是通过反射的方式实现的,参考https://www.jianshu.com/p/5e3b9f59a936,
升级到API28后,只要设置属性就可以解决,
如下
app:labelVisibilityMode=“labeled” />

  • 绑定的Fragment自动生成只需要留下 onCreateView、onStart()方法,在继承 Fragment 的类中实例化等操作要在onStart方法里面实现不同于在Activity的 onCreate 方法实现实例化。

#Android项目# ——day01 Fragment搭配RadioGroup创建导航栏_第2张图片

  • 创建颜色选择器去设置点击切换颜色(具体代码在下面)

xml布局文件:




    
        
    
        
        
        
        

        
        
       
        

        
    


    
    
    

自定义RadioButton样式:


按钮的颜色选择器:



    
    
    


后端代码实现:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private RadioGroup mTabRadioGroup;
    private SparseArray mFragmentSparseArray;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //实例化控件
        initView();
    }

    private void initView() {
        mTabRadioGroup = findViewById(R.id.tabs_rg);
        /*
        一般我们使用TabLayout切换Fragment中展示内容,既然不销毁加载好的内容
        那就是不销毁Fragment就能实现了。不销毁Fragment就是对已经存在的Fragment进行缓存
        传统的java方法存储一个唯一的对象采用HashMap,但是Google用SparseArray替代HashMap来提高效率。
        */
        mFragmentSparseArray = new SparseArray<>();
        mFragmentSparseArray.append(R.id.home, new Home());
        mFragmentSparseArray.append(R.id.find, new Find());
        mFragmentSparseArray.append(R.id.recruit, new Recruit());
        mFragmentSparseArray.append(R.id.personal, new Personal());
        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();
            }
        });
        // 默认显示第一个是home
        getSupportFragmentManager().beginTransaction().add(R.id.fragment_container,
                mFragmentSparseArray.get(R.id.home)).commit();
        
        findViewById(R.id.send).setOnClickListener(this);
    }

    private void showBottomDialog() {
        //1、使用Dialog、设置style
        final Dialog dialog = new Dialog(this, R.style.DialogTheme);
        //2、设置布局
        View view = View.inflate(this, R.layout.dialog_send, null);
        dialog.setContentView(view);

        Window window = dialog.getWindow();
        //设置弹出位置
        window.setGravity(Gravity.BOTTOM);
        //设置弹出动画
        window.setWindowAnimations(R.style.main_menu_animStyle);

        //获得窗体的属性
        WindowManager.LayoutParams lp = window.getAttributes();
        //设置Dialog距离底部的距离
        lp.y = 235;
        //将属性设置给窗体
        window.setAttributes(lp);
        dialog.show();//显示对话框

        dialog.findViewById(R.id.dialog_dynamics).setOnClickListener(this);

        dialog.findViewById(R.id.dialog_photo).setOnClickListener(this);

        dialog.findViewById(R.id.dialog_video).setOnClickListener(this);

        dialog.findViewById(R.id.dialog_pictures).setOnClickListener(this);

        dialog.findViewById(R.id.dialog_notes).setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.send:
                showBottomDialog();
                break;
            case R.id.dialog_dynamics:
                Toast.makeText(this, "点击了动态", Toast.LENGTH_SHORT).show();
                break;
            case R.id.dialog_photo:
                Toast.makeText(this, "点击了图片", Toast.LENGTH_SHORT).show();
                break;
            case R.id.dialog_video:
                Toast.makeText(this, "点击了视频", Toast.LENGTH_SHORT).show();
                break;
            case R.id.dialog_pictures:
                Toast.makeText(this, "点击了拍照", Toast.LENGTH_SHORT).show();
                break;
            case R.id.dialog_notes:
                Toast.makeText(this, "点击了游记", Toast.LENGTH_SHORT).show();
                break;
        }
    }
}

dialogxml布局:




    

        

        

        

        

        
    

你可能感兴趣的:(Android个人项目)