码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2017-07-14 09:59:49      阅读:602      评论:0      收藏:0      [点我收藏+]

标签:fragment切换与fragement使用时报错解决方法

    主要是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类,才能在此使用。具体的使用办法可以参照我的代码。

本文出自 “YuanGuShi” 博客,请务必保留此出处http://cm0425.blog.51cto.com/10819451/1947356

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

标签:fragment切换与fragement使用时报错解决方法

原文地址:http://cm0425.blog.51cto.com/10819451/1947356

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!