您的位置:首页 > 其它

手机影音第三天,通过监听底部radiogroup按钮状态来切换中间FragmentLayout里的内容

2017-07-13 23:37 549 查看
主要是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类,才能在此使用。具体的使用办法可以参照我的代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐