主要是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类,才能在此使用。具体的使用办法可以参照我的代码。
转载于:https://blog.51cto.com/cm0425/1947356