5.1.1 Fragment 练气一阶 底部导航栏实现

标注:本文为个人学习使用,仅做自己学习参考使用,请勿转载和转发
2018-07-18: 初稿,参考博主coder-pig
2018-07-18: 昨天肠胃炎,去人民医院看病打针,整个人就虚的不行不行的了,然后就睡觉,趴着,哎!

0. 引言

  • 上一节主要是简单的介绍了Fragment的概念、生命周期、Fragment管理、Fragment事务,以及静态和动态加载Fragment。
  • 这节开始讲解一些实例!
  • 实现的是底部导航栏。

1. 要实现的效果和工程目录的结构

先看看效果图吧:


接着看看我们的工程的目录结构

Step 1:写下底部选项的一些资源文件

  • 从上图可以看出,地步每一个点击都会又不同的效果,是通过selected来判定的,我们需要写的资源文件有:首先是图片、然后是文字、接着是背景

图片Drawable资源:tab_menu_channel.xml



    
    

其他三个照葫芦画瓢!
文字资源:tab_menu_text.xml



    
    

背景资源:tab_menu_bg.xml



    
        
            
        
    
    
        
            
        
    

Step 2:编写我们的Activity布局
activity_main.xml:



    

        


        

    



    

        

        

        

        

    

    


    

    


代码解析

  • 首先定义顶部标题栏的样式、48dp的LinearLayout中间加上一个TextView作为标题
  • 接着定义一个大小为56dp的LinearLayout对其底部,在这个里面加入四个TextView,比例1:1:1:1,并设置相关属性,接着在这个LiearLayout上面加一条线段
  • 最后以标题栏和导航栏为边界,写一个FrameLayout,宽高match_parent,用作Fragment的容器!

Step 3:隐藏顶部导航栏

  • 发现Activity中调用requestWindowFeature(Window.Feature_NO_TITLE);可以隐藏手机自带顶部导航栏,但是写demo的时候发现会报错,计时这句写在setContentView之前,可能是因为继承的是AppCompatActivity而非Activity类
  • 当然以前的getSupportActionbar().hide()隐藏掉Actionbar,但是他还是会在界面上,最后还有一种方法,就是自己编写一个style,然后在AdnroidManifest.xml中为Application设置这个Theme
  • 把 requestWindowFeature(Window.FEATURE_NO_TITLE);放在super.onCreate(savedInstanceState);前面就可以隐藏ActionBar而不报错。
  • 接着在AdnroidManifest.xml设置下theme属性:android:theme="@style/Theme.AppCompat.NoActionBar"

Step 4:创建一个Fragment的简单布局与类:
fg_content.xml:



    
    


MyFragment.java:

public class MyFragment extends Fragment {

    private String content;
    public MyFragment(String content) {
        this.content = content;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fg_content,container,false);
        TextView txt_content = (TextView) view.findViewById(R.id.txt_content);
        txt_content.setText(content);
        return view;
    }
}

Step 5:编写MainActivity.java
先说说我们要考虑的一些关键问题:

  1. Fragment什么时候初始化和add到容器中?什么时候hide和show?
  2. 如何让TextView被选中?选中一个TextView后,要做一些什么操作?
  3. 刚进入MainActivity怎么样让一个TextView处于Selected的状态?

嗯,接下来一一解答上面这些问题:

  1. 我们选中TextView之后对对应的Fragment进行判空,初始化,并添加到容器中,而hide的话,我们定义一个方法hide所有的Fragment,每次触发点击时间的话就先调用这个hideAll方法,将所有的Fragment隐藏起来,然后如果TextView对赢的Fragment不为空,我们就将这个Fragment显示出来;
  2. 这个我们通过点击事件来实现,点击TextView后先重置所有的TextView的选中状态为flase,然后设置点击的TextView的选中状态为true;
  3. 这个是通过点击事件来设置选中的,在onCreate方法里面加一个触发点击时间的方法即可。
public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    //UI Object
    private TextView txt_topbar;
    private TextView txt_channel;
    private TextView txt_message;
    private TextView txt_better;
    private TextView txt_setting;
    private FrameLayout ly_content;

    //Fragment Object
    private MyFragment fg1,fg2,fg3,fg4;
    private FragmentManager fManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        fManager = getFragmentManager();
        bindViews();
        txt_channel.performClick();   //模拟一次点击,既进去后选择第一项
    }

    //UI组件初始化与事件绑定
    private void bindViews() {
        txt_topbar = (TextView) findViewById(R.id.txt_topbar);
        txt_channel = (TextView) findViewById(R.id.txt_channel);
        txt_message = (TextView) findViewById(R.id.txt_message);
        txt_better = (TextView) findViewById(R.id.txt_better);
        txt_setting = (TextView) findViewById(R.id.txt_setting);
        ly_content = (FrameLayout) findViewById(R.id.ly_content);

        txt_channel.setOnClickListener(this);
        txt_message.setOnClickListener(this);
        txt_better.setOnClickListener(this);
        txt_setting.setOnClickListener(this);
    }

    //重置所有文本的选中状态
    private void setSelected(){
        txt_channel.setSelected(false);
        txt_message.setSelected(false);
        txt_better.setSelected(false);
        txt_setting.setSelected(false);
    }

    //隐藏所有Fragment
    private void hideAllFragment(FragmentTransaction fragmentTransaction){
        if(fg1 != null)fragmentTransaction.hide(fg1);
        if(fg2 != null)fragmentTransaction.hide(fg2);
        if(fg3 != null)fragmentTransaction.hide(fg3);
        if(fg4 != null)fragmentTransaction.hide(fg4);
    }


    @Override
    public void onClick(View v) {
        FragmentTransaction fTransaction = fManager.beginTransaction();
        hideAllFragment(fTransaction);
        switch (v.getId()){
            case R.id.txt_channel:
                setSelected();
                txt_channel.setSelected(true);
                if(fg1 == null){
                    fg1 = new MyFragment("第一个Fragment");
                    fTransaction.add(R.id.ly_content,fg1);
                }else{
                    fTransaction.show(fg1);
                }
                break;
            case R.id.txt_message:
                setSelected();
                txt_message.setSelected(true);
                if(fg2 == null){
                    fg2 = new MyFragment("第二个Fragment");
                    fTransaction.add(R.id.ly_content,fg2);
                }else{
                    fTransaction.show(fg2);
                }
                break;
            case R.id.txt_better:
                setSelected();
                txt_better.setSelected(true);
                if(fg3 == null){
                    fg3 = new MyFragment("第三个Fragment");
                    fTransaction.add(R.id.ly_content,fg3);
                }else{
                    fTransaction.show(fg3);
                }
                break;
            case R.id.txt_setting:
                setSelected();
                txt_setting.setSelected(true);
                if(fg4 == null){
                    fg4 = new MyFragment("第四个Fragment");
                    fTransaction.add(R.id.ly_content,fg4);
                }else{
                    fTransaction.show(fg4);
                }
                break;
        }
        fTransaction.commit();
    }
}

3. 小结

  • 本节主要使用了LinarLayout和四个TextView实现了一个地步导航栏以及Fragment add、hide、show的逻辑

你可能感兴趣的:(5.1.1 Fragment 练气一阶 底部导航栏实现)