主要是Fragment的使用,其切换fragment的步骤如下
1、获取FragmentManager 实例,但是需要MainActivity extends FragmentActivity才能去获取FragmentManager.
通过FragmentManager fragmentManager=getSupportFragmentManager();
2、开启事务 ,有点类似javaee里的hibernate 操作数据库
FragmentTranaction tranaction= fragmentManager.beginTranction();
3、通过事务来替换fragment
tranaction.replace(R.id.fl_main_content,fragment); //参数中第一个是代表fragmentLayout容器,即这个fragment放到哪里,第二个代表fragment实例
4、提交事务
tranaction.commit();
下面概括性的写一下今天的主要内容:
1、 创建一个基类BasePager,在里面初始化数据,这里先定义了一个View ,作为测试FragmentLayou里显示的内容。
2、创建四个子类,继承BasePager ,分别是VideoPager,AudioPager,NetVideoPager,NetAudioPager
3、在MainActivity里新建一个集合,在activity的onCreate()里把集合实例new出来,并往集合里添加了四个子类的实例。
4、通过radiogroup的OnCheckedChangedListener()来监听radiobutton的状态,来切换fragment
5、通过上面监听类里的onCheckedChanged方法,来判断是哪个radiobutton被选中,然后获取其实例,进一步来获取其中的view,然后切换fragement来显示不同页面。
具体代码如下
1、BasePager
package com.yuanlp.mobileplayer.base; import android.content.Context; import android.view.View; /** * Created by 原立鹏 on 2017/7/13. * 基类 */ public abstract class BasePager { /** * 这个是上下文,子类后面要用,所以写为public * */ public final Context context; public View rootview; public boolean isinitData; public BasePager(Context context){ this.context=context; rootview=initView(); } /** * 强制子类实现特定的效果 * @return */ public abstract View initView(); /** * 当子类初始化,需要联网请求数据时,或者绑定数据时,需要重写改方法 */ public void initData(){ } }
2、VideoPager,其他三个就不写了,大同小异。
package com.yuanlp.mobileplayer.pager; import android.content.Context; import android.graphics.Color; import android.view.Gravity; import android.view.View; import android.widget.TextView; import com.yuanlp.mobileplayer.base.BasePager; import com.yuanlp.mobileplayer.utils.LogUtil; /** * Created by 原立鹏 on 2017/7/13. * 本地视频的页面 */ public class VideoPager extends BasePager { public TextView textview; public VideoPager(Context context) { super(context); } /** * 强制子类实现特定的效果 * * @return */ @Override public View initView() { LogUtil.e("本地视频被初始化了"); textview=new TextView(context); textview.setTextSize(25); textview.setGravity(Gravity.CENTER); textview.setTextColor(Color.RED); return textview; } @Override public void initData() { super.initData(); LogUtil.e("本地视频页面的数据被初始化了"); textview.setText("本地视频页面"); } }
3、MainActivity
package com.yuanlp.mobileplayer.activity; import android.os.Bundle; import android.support.annotation.IdRes; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.RadioGroup; import com.yuanlp.mobileplayer.R; import com.yuanlp.mobileplayer.base.BasePager; import com.yuanlp.mobileplayer.pager.AudioPager; import com.yuanlp.mobileplayer.pager.NetAudioPager; import com.yuanlp.mobileplayer.pager.NetVideoPager; import com.yuanlp.mobileplayer.pager.VideoPager; import java.util.ArrayList; import java.util.List; /** * 主页面 * Created by 原立鹏 on 2017/7/12. */ public class MainActivity extends FragmentActivity{ private FrameLayout fl_main_content; private RadioGroup rg_bottom_tag; /** * 本地页面集合 */ public static List<BasePager> basepagers; /** * 选中的位置 */ public static int position; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); fl_main_content= (FrameLayout) findViewById(R.id.fl_main_content); rg_bottom_tag= (RadioGroup) findViewById(R.id.rg_bottom_tag); basepagers=new ArrayList<BasePager>(); basepagers.add(new VideoPager(this)); //本地视频 位置是0 basepagers.add(new AudioPager(this)); //本地音乐 位置是1 basepagers.add(new NetVideoPager(this)); //网络视频 位置是2 basepagers.add(new NetAudioPager(this)); //网络音乐 位置是3 //在这里设置radiogroup的监听 rg_bottom_tag.setOnCheckedChangeListener(new myOnCheckedChangeListener()); rg_bottom_tag.check(R.id.rb_video); //默认选中主页的本地视频 } class myOnCheckedChangeListener implements RadioGroup.OnCheckedChangeListener{ /** * <p>Called when the checked radio button has changed. When the * selection is cleared, checkedId is -1.</p> * * @param group the group in which the checked radio button has changed * @param checkedId the unique identifier of the newly checked radio button */ @Override public void onCheckedChanged(RadioGroup group, @IdRes int checkedId) { switch (checkedId){ default: position=0; break; case R.id.rb_audio: //选中的是本地音乐 position=1; break; case R.id.rb_video: //选中的是本地视频 position=0; break; case R.id.rb_net_audio: //选中的是网络音乐 position=3; break; case R.id.rb_net_video: //选中的是网络视频 position=2; break; } //把创建的页面放到Fragment中 setFragment(); } private void setFragment() { //Fragment的步骤 //1、获取FragmentManager FragmentManager fragmentManager = getSupportFragmentManager(); //2、开启事务 FragmentTransaction transaction = fragmentManager.beginTransaction(); //3、替换Fragement transaction.replace(R.id.fl_main_content,new myFragment()); //4、提交事务 transaction.commit(); } } public static class myFragment extends Fragment{ @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { BasePager b1=getBasePager(); if (b1!=null){ return b1.rootview; } return null; } } public static BasePager getBasePager() { BasePager basepager=basepagers.get(position); if (basepager!=null&&!basepager.isinitData){ basepager.isinitData=true; basepager.initData(); //初始化页面的数据,调用各个页面类里的initData()方法 return basepager; } return basepager; } }
需要注意的是在Mainactivity中的替换fragment步骤时,第二个参数,不能写new Fragment(){}这样的匿名内部类,不然会报错:Fragment null must be a public static class to be properly recreated from in 这个错误的原因是v4包升级成25后,Fragment必须要作为一个public 的static类,才能在此使用。具体的使用办法可以参照我的代码。