FragmentLayout+fragment实现新闻类型四个主页

有朋友刚开始学android,于是我就顺便写篇关于主页切换的效果吧
先讲一些基础概念

Fragment

Fragment可以做为Activity的一个界面的一个组成部分,Activity的界面可以完全由不同的Fragment组成,注意的是Fragment拥有自己的生命周期和接收、处理用户的事件,这样就不必在Activity写一堆控件的事件处理的代码了。更为重要的是,你可以动态的添加、替换和移除某个Fragment。当然,你可以把fragment当成普通的控件一样放在activity的xml布局文件中。

Fragment必须是依存与Activity而存在的,因此Activity的生命周期会直接影响到Fragment的生命周期。官网这张图很好的说明了两者生命周期的关系:

FragmentLayout+fragment实现新闻类型四个主页_第1张图片

可以看到Fragment比Activity多了几个额外的生命周期回调方法:

onAttach(Activity)

当Fragment与Activity发生关联时调用。

onCreateView(LayoutInflater, ViewGroup,Bundle)

创建该Fragment的视图

onActivityCreated(Bundle)

当Activity的onCreate方法返回时调用

onDestoryView()

与onCreateView想对应,当该Fragment的视图被移除时调用

onDetach()

与onAttach相对应,当Fragment与Activity关联被取消时调用

注意:除了onCreateView,其他的所有方法如果你重写了,必须调用父类对于该方法的实现
FragmentManager:你可以把FragmentManager想象成管理一系列的fragment的隐藏展示的一个类
一、main_activity.xml



    

    

    

        

        

        

        

        


    

底部按钮的样式为了统一管理,我们可以把他公共的样式抽取出来放到res/values/styles.xml文件中



    
    

    


底部按钮的选中和不选中状态我们可以是用select选择器来实现,代码分别如下

rb_select_home.xml


    
    

state_checked='true'表示被选中时显示的图片,其余三个类似

好的,布局文件准备好了,接下来我们要来准备四个fragment

二、MainActivity.java
public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    private ArrayList fragmentList = new ArrayList<>();

    private RadioGroup radioGroup;
    private FragmentManager fragmentManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initViews();
        initEvent();
        initData();


    }
    private void initViews() {
        //1、获取main_activity中的控件的实例化对象
        radioGroup = (RadioGroup) findViewById(R.id.radiogroup);
        //2、获取FragmentManager
        /*注意倒入的fragmentManager,如果你的fragment是android.support.v4.app包中的,
        你倒入的fragmentManager也要试v4v 包的,
        我这里的fragment是import android.app.Fragment; 所以我导入的fragmentManager也是android.app包下面的
        * */
        /*如果是v4包的要用this.getSupportFragmentManager();*/
        fragmentManager = this.getFragmentManager();




    }



    private void initEvent() {
        radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                switch (checkedId) {
                    case R.id.radiobutton_home: {
                        setCurrentFragment(0);
                        break;
                    }
                    case R.id.radiobutton_message: {
                        setCurrentFragment(1);
                        break;
                    }
                    case R.id.radiobutton_discover: {
                        setCurrentFragment(2);
                        break;
                    }
                    case R.id.radiobutton_profile: {
                        setCurrentFragment(3);
                        break;
                    }
                    case R.id.radiobutton_post:{



                        break;
                    }
                    default: {

                    }

                }
//
            }
        });

    }

    private void initData() {
        /*3、数据的准备*/
        HomeFragment homeFragment = new HomeFragment();
        fragmentList.add(homeFragment);
        MessageFragment messageFragment = new MessageFragment();
        fragmentList.add(messageFragment);
        DiscoverFragment discoverFragment = new DiscoverFragment();
        fragmentList.add(discoverFragment);
        ProfileFragment profileFragment = new ProfileFragment();
        fragmentList.add(profileFragment);
        //默认显示第1个也就是fragmentList.get(0)
        setCurrentFragment(0);

    }

    /**
     * 显示fragment
     * @param index
     */
    private void setCurrentFragment(int index){
        //3 通过fragmentmanager获取fragment的事务管理对象
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        //4获取要显示的fragment
        Fragment fragment = fragmentList.get(index);
        //5、将要显示的fragment放入FragmentLayout中
        fragmentTransaction.replace(R.id.root_fragment_layout, fragment);
        //6、提交事务,确定显示
        fragmentTransaction.commit();
    }


}
三、HomeFragment.java

接下来我们就来实现四个页面

public class HomeFragment extends Fragment {

    public Activity mActivity;
    public LayoutInflater mInflater;


    @Override
    public void onAttach(Context context) {

        super.onAttach(context);

    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //activity创建时回掉,在这里获去依赖的activity对象
        mActivity = getActivity();

    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        mInflater = inflater;//用来将xml文件实例化成View的类实例
        //在HomeFragment的xml文件渲染成view。
        View rootView = mInflater.inflate(R.layout.fragment_home,null);
        //返回的View即为fragment要显示的View
        return rootView;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        //fragment依赖的activity创建完成时回掉,一般在这里做fragment页面数据的初始化
    }

    @Override
    public void onStart() {
        super.onStart();
    }

    @Override
    public void onResume() {
        super.onResume();
    }

    @Override
    public void onPause() {
        super.onPause();
    }

    @Override
    public void onStop() {
        super.onStop();
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public void onDetach() {

        super.onDetach();
    }

}

就是这样就可以了,是不是山哥?

你可能感兴趣的:(FragmentLayout+fragment实现新闻类型四个主页)