Android实现Activity+fragment的APP流行框架

简介

现如今的安卓app基本都采用了activity+fragment的模式来搭建框架;
而四大组件之一的activity和自带生命周期控件的fragment就自然而然的成为了众多产品经理的青睐,今天就来搭建一个简单的activity+fragment框架。。

  • 控件简介
  • Activity:一个负责与用户交互的组件
  • Fragment:一个应用适配不同设备的大屏幕、支持更加动态和灵活的UI设计所提供的一个组件。
  • 必须说明的是:fragment必须依赖于activity生存

1.首先,既然fragment必须依赖activity生存,那么就先创建一个启动的activity。

activity_main.xml



    
    

    
    
    





    

        

            

            

        


        

            

            

        

        

            

            

        

        

            

            

        
    


注:需要在activity的xml文件中定义一个Fragment控件,并声明ID。

2.activity声明之后,需要声明fragment所要加载的xml文件(一般为四个fragment的xml文件):




    
	






    






    






    


注:四个fragment是最终要显示的界面

3.当xml都声明完之后,需要通过代码把他们加载出来,让fragment依赖于activity之上。

package com.cc.activity;

import android.graphics.Color;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.FragmentManager;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import com.cc.fragment.FourFragment;
import com.cc.fragment.OneFragment;
import com.cc.fragment.ThreeFragment;
import com.cc.fragment.TwoFragment;

import java.util.HashMap;

/**
 * fragment 的 add和replace方法
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    /** 底部导航栏 */
    LinearLayout Lin_one, Lin_two, Lin_three, Lin_four;

    //获取底部导航栏的ImageView
    ImageView img_one_bottom, img_two_bottom, img_three_bottom, img_four_bottom;

    /** 第一个fragment */
    public static final int PAGE_COMMON = 0;
    /** 第二个fragment */
    public static final int PAGE_TRANSLUCENT = 1;
    /** 第三个fragment */
    public static final int PAGE_COORDINATOR = 2;
    /** 第四个fragment */
    public static final int PAGE_COLLAPSING_TOOLBAR = 3;

    /** 管理fragment */
    private HashMap fragments = new HashMap<>();

    //当前activity的fragment控件
    private int fragmentContentId = R.id.fragment_content;

    /** 设置默认的fragment */
    private int currentTab;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initFrag();
        initView();
        // 设置默认的Fragment
        defaultFragment();
        SelectColor(0);
    }

    private void initFrag() {
        fragments.put(PAGE_COMMON, new OneFragment());
        fragments.put(PAGE_TRANSLUCENT, new TwoFragment());
        fragments.put(PAGE_COORDINATOR, new ThreeFragment());
        fragments.put(PAGE_COLLAPSING_TOOLBAR, new FourFragment());
    }

    private void defaultFragment() {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.add(fragmentContentId,fragments.get(PAGE_COMMON));
        currentTab = PAGE_COMMON;
        ft.commit();
    }

    private void initView() {
        //底部导航栏的父控件
        Lin_one = (LinearLayout) findViewById(R.id.Lin_one);
        Lin_two = (LinearLayout) findViewById(R.id.Lin_two);
        Lin_three = (LinearLayout) findViewById(R.id.Lin_three);
        Lin_four = (LinearLayout) findViewById(R.id.Lin_four);

        img_one_bottom = (ImageView) findViewById(R.id.img_one_bottom);
        img_two_bottom = (ImageView) findViewById(R.id.img_two_bottom);
        img_three_bottom = (ImageView) findViewById(R.id.img_three_bottom);
        img_four_bottom = (ImageView) findViewById(R.id.img_four_bottom);


        Lin_one.setOnClickListener(this);
        Lin_two.setOnClickListener(this);
        Lin_three.setOnClickListener(this);
        Lin_four.setOnClickListener(this);
    }

    /**
     * 当页面选中时改变当前的导航栏蓝色和图片的状态
     * @param position 当前页面
     */
    public void SelectColor(int position) {
        if(position == 0){
            //给底部到导航栏的image更换图片
            img_one_bottom.setImageResource(R.mipmap.xiao);
            img_two_bottom.setImageResource(R.mipmap.ws);
            img_three_bottom.setImageResource(R.mipmap.ws);
            img_four_bottom.setImageResource(R.mipmap.nu);

            //给底部导航栏更换背景色
            Lin_one.setBackgroundResource(R.color.blue);
            Lin_two.setBackgroundResource(R.color.white);
            Lin_three.setBackgroundResource(R.color.white);
            Lin_four.setBackgroundResource(R.color.white);
        } else if (position == 1){
            //给底部到导航栏的image更换图片
            img_one_bottom.setImageResource(R.mipmap.ws);
            img_two_bottom.setImageResource(R.mipmap.xiao);
            img_three_bottom.setImageResource(R.mipmap.ws);
            img_four_bottom.setImageResource(R.mipmap.nu);

            //给底部导航栏更换背景色
            Lin_one.setBackgroundResource(R.color.white);
            Lin_two.setBackgroundResource(R.color.blue);
            Lin_three.setBackgroundResource(R.color.white);
            Lin_four.setBackgroundResource(R.color.white);
        } else if (position == 2){
            //给底部到导航栏的image更换图片
            img_one_bottom.setImageResource(R.mipmap.nu);
            img_two_bottom.setImageResource(R.mipmap.ws);
            img_three_bottom.setImageResource(R.mipmap.xiao);
            img_four_bottom.setImageResource(R.mipmap.ws);

            //给底部导航栏更换背景色
            Lin_one.setBackgroundResource(R.color.white);
            Lin_two.setBackgroundResource(R.color.white);
            Lin_three.setBackgroundResource(R.color.blue);
            Lin_four.setBackgroundResource(R.color.white);
        } else if (position == 3){
            //给底部到导航栏的image更换图片
            img_one_bottom.setImageResource(R.mipmap.nu);
            img_two_bottom.setImageResource(R.mipmap.ws);
            img_three_bottom.setImageResource(R.mipmap.ws);
            img_four_bottom.setImageResource(R.mipmap.xiao);

            //给底部导航栏更换背景色
            Lin_one.setBackgroundResource(R.color.white);
            Lin_two.setBackgroundResource(R.color.white);
            Lin_three.setBackgroundResource(R.color.white);
            Lin_four.setBackgroundResource(R.color.blue);
        }
    }

    /**
     * 点击切换下部按钮
     * @param page
     */
    private void changeTab(int page) {
        //默认的currentTab == 当前的页码,不做任何处理
        if (currentTab == page) {
            return;
        }

        //获取fragment的页码
        Fragment fragment = fragments.get(page);
        //fragment事务
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        //如果该Fragment对象被添加到了它的Activity中,那么它返回true,否则返回false。
        //当前activity中添加的不是这个fragment
        if(!fragment.isAdded()){
            //所以将他加进去
            ft.add(fragmentContentId,fragment);
        }
        //隐藏当前currentTab的
        ft.hide(fragments.get(currentTab));
        //显示现在page的
        ft.show(fragments.get(page));
        //设置当前currentTab底部的状态
        SelectColor(currentTab);
        //当前显示的赋值给currentTab
        currentTab = page;
        //设置当前currentTab底部的状态
        SelectColor(currentTab);
        //activity被销毁?  !否
        if (!this.isFinishing()) {
            //允许状态丢失
            ft.commitAllowingStateLoss();
        }
    }

    /**
     * 所有的控件在这里进行点击(单击)事件
     * @param v
     */
    @Override
    public void onClick(View v) {
        int temdId = v.getId();
        if(temdId == R.id.Lin_one){
            changeTab(PAGE_COMMON);
        } else if (temdId == R.id.Lin_two){
            changeTab(PAGE_TRANSLUCENT);
        } else if (temdId == R.id.Lin_three){
            changeTab(PAGE_COORDINATOR);
        } else if (temdId == R.id.Lin_four){
            changeTab(PAGE_COLLAPSING_TOOLBAR);
        }
    }
}

注:这个是真个activity里面的代码。主要用于在代码中注释的很清楚了,可以阅读一下代码。

4.activty设置好之后,也需要在fragment加载出最终运行的fragment.xml文件。具体如下:

package com.cc.fragment;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.cc.activity.R;
/**
 * Created by admin on 2018/4/10.
 */

public class TwoFragment extends Fragment {

    View view;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_one, container, false);
        return view;
    }
}
注:四个fragment的写法都是一样,这里写一个就可以了,其他三个只需要换掉加载的layout就可以。

重要提醒:

  1. activity的xml文件中需要声明一个fragment控件;
  2. fragment的声明周期受activity影响。当activity暂停时,依赖它的所有fragment随之暂停;销毁随之全部销毁。

如需使用demo,请前往下载:

点我点我下载

期待互动留言,支持email交互:

邮箱地址:[email protected]。希望各位大佬来骚扰。

感谢,今天的表演就到这里结束了,我们下次再见!

																			---财财亲笔

你可能感兴趣的:(自定义状态栏)