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

有朋友刚开始学android,于是我就顺便写篇关于主页切换的效果吧
先讲一些基础概念
Fragment Fragment可以做为Activity的一个界面的一个组成部分,Activity的界面可以完全由不同的Fragment组成,注意的是Fragment拥有自己的生命周期和接收、处理用户的事件,这样就不必在Activity写一堆控件的事件处理的代码了。更为重要的是,你可以动态的添加、替换和移除某个Fragment。当然,你可以把fragment当成普通的控件一样放在activity的xml布局文件中。
Fragment必须是依存与Activity而存在的,因此Activity的生命周期会直接影响到Fragment的生命周期。官网这张图很好的说明了两者生命周期的关系:
FragmentLayout+fragment实现新闻类型四个主页
文章图片
可以看到Fragment比Activity多了几个额外的生命周期回调方法:
onAttach(Activity) 当Fragment与Activity发生关联时调用。
onCreateView(LayoutInflater, ViewGroup,Bundle) 【FragmentLayout+fragment实现新闻类型四个主页】创建该Fragment的视图
onActivityCreated(Bundle) 当Activity的onCreate方法返回时调用
onDestoryView() 与onCreateView想对应,当该Fragment的视图被移除时调用
onDetach() 与onAttach相对应,当Fragment与Activity关联被取消时调用
注意:除了onCreateView,其他的所有方法如果你重写了,必须调用父类对于该方法的实现 FragmentManager:你可以把FragmentManager想象成管理一系列的fragment的隐藏展示的一个类 一、main_activity.xml


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

底部按钮的选中和不选中状态我们可以是用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(); }}

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

    推荐阅读