Android -- 四大组件Fragment 与 Activity 之间通信

Posted Kevin-Dev

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android -- 四大组件Fragment 与 Activity 之间通信相关的知识,希望对你有一定的参考价值。

不断学习,做更好的自己!💪

视频号CSDN简书
欢迎打开微信,关注我的视频号:KevinDev点我点我

一、Activity 之间数据通信

1. Bundle

此方法可以传递基本数据类型和 String 类型的数据,如果传递的是对象就需要进行序列化(Parcelable)。

Bundle bundle = new Bundle();
bundle.putString("name", "chenjy");
bundle.putInt("age", 18);

Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtras(bundle);
startActivity(intent);

2. 静态变量/全局变量及Application/android 系统剪切板

这三种方式其实非常相似,静态变量和全局变量都可以采用 static 的方式来定义,如果采用这种方式还是推荐用一个专门的类结合单体模式进行管理,尽量减少对内存的消耗。

3. EventBus

EventBus 是一款针对 Android 的发布以及订阅事件总线,使用它可以很方便的进行信息传递,而且使用起来很方便。
首先是定义一个消息:

public class Event 
    private String message;
    public Event()
        message = "EventBus message";
    

    public void setMessage(String message)
        this.message = message;
    

    public String getMessage()
        return message;
    

发送消息:
这里使用了postSticky,这是发送的粘性广播,使用这个发送就可以先发送信息再进行注册,后注册的也能接收到前面发送的广播。当然还有其他的使用方式,可以查查api文档。

EventBus.getDefault().postSticky(new Event());
startActivity(new Intent(MainActivity.this,ReceiveActivity.class));

注册事件的订阅者:

EventBus.getDefault().register(this);

接受粘性广播:

@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onEventThread(Event event) 
    textView.setText(event.getMessage());

二、Fragment 之间数据通信

1. 接口回调

step1. 在Menuragment中创建一个接口以及接口对应的set方法:

//MenuFragment.java文件中
public interface OnDataTransmissionListener 
    public void dataTransmission(String data);

public void setOnDataTransmissionListener(OnDataTransmissionListener mListener) 
    this.mListener = mListener;

step2: 在MenuFragment中的ListView条目点击事件中进行接口进行接口回调

//MenuFragment.java文件中
lv.setOnItemClickListener(new AdapterView.OnItemClickListener()  
   @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
        /**
         * 方法二:采取接口回调的方式进行数据传递
         */
        if (mListener != null) 
            mListener.dataTransmission(mDatas.get(position));
        
    
);

step3: 在MainActivity中根据menuFragment获取到接口的set方法,在这个方法中进行进行数据传递,具体如下:

//在MainActivity.java中
menuFragment.setOnDataTransmissionListener(new MenuFragment.OnDataTransmissionListener() 
    @Override
    public void dataTransmission(String data) 
        mainFragment.setData(data);  //注:对应的mainFragment此时应该要用final进行修饰
    
);

2. EventBus

三、Fragment 与 Activity 之间数据通信

1. handler方案

public class MainActivity extends FragmentActivity 
      //声明一个Handler 
      public Handler mHandler = new Handler()       
          @Override
           public void handleMessage(Message msg)  
                super.handleMessage(msg);
                 ...相应的处理代码
           
     
     ...相应的处理代码
    

    public class MainFragment extends Fragment 
          //保存Activity传递的handler
           private Handler mHandler;
           @Override
           public void onAttach(Activity activity)  
                super.onAttach(activity);
               //这个地方已经产生了耦合,若还有其他的activity,这个地方就得修改 
                if(activity instance MainActivity) 
                      mHandler =  ((MainActivity)activity).mHandler; 
                
           
           ...相应的处理代码
     

2. 广播方案

3. EventBus方案

4. 接口方案

//MainActivity实现MainFragment开放的接口 
  public class MainActivity extends FragmentActivity implements FragmentListener 
        @override
         public void toH5Page() 
       ...其他处理代码省略
    

    public class MainFragment extends Fragment

         public FragmentListener mListener;  
        //MainFragment开放的接口 
        public static interface FragmentListener 
            //跳到h5页面
           void toH5Page();
         

         @Override 
        public void onAttach(Activity activity)  
              super.onAttach(activity); 
              //对传递进来的Activity进行接口转换
               if(activity instance FragmentListener)
                   mListener = ((FragmentListener)activity); 
              
         
         ...其他处理代码省略 
   

5. 封装Functions

FunctionException.java

public class FunctionException extends Exception 
    public FunctionException(String msg)
        super();
    

Functions.java

public class Functions 
    /**
     * 带有参数和返回值的 方法
     * @param <Result>
     * @param <Param>
     */
    public static abstract class FunctionWithParamAndResult<Result,Param> extends Function
        public FunctionWithParamAndResult(String functionName) 
            super(functionName);
        

        public abstract Result function(Param data);
    

    /**
     * 没有参数和返回值的方法
     */
    public static abstract class Function
        public String mFunctionName;
        public Function(String functionName)
            this.mFunctionName = functionName;
        
    

    /**
     * 有返回值,没有参数的方法
     * @param <Result>
     */
    public static abstract class FunctionWithResult<Result> extends Function
        public FunctionWithResult(String functionName) 
            super(functionName);
        

        public abstract Result function();
    

    /**
     * 带有参数没有返回值的方法
     * @param <Param>
     */
    public static abstract class  FunctionWithParam<Param> extends Function
        public FunctionWithParam(String functionName) 
            super(functionName);
        

        public abstract void function(Param param);
    

    /**
     * 没有参数和返回值的方法
     */
    public static abstract class  FunctionNoParamAndResult extends Function
        public FunctionNoParamAndResult(String functionName) 
            super(functionName);
        

        public abstract void function();
    

    private HashMap<String,FunctionWithParam> mFunctionWithParam ;
    private HashMap<String,FunctionWithResult> mFunctionWithResult ;
    private HashMap<String,FunctionNoParamAndResult> mFunctionNoParamAndResult ;
    private HashMap<String,FunctionWithParamAndResult> mFunctionWithParamAndResult ;


    /**
     * 添加带参数的函数
     * @param function
     * @return
     */
    public Functions addFunction(FunctionWithParam function)
        if(function == null)
            return this;
        
        if(mFunctionWithParam == null)
            mFunctionWithParam = new HashMap<>(1);
        
        mFunctionWithParam.put(function.mFunctionName,function);

        return this;
    

    /**
     * 添加带返回值的函数
     * @param function 
     * @return
     */
    public Functions addFunction(FunctionNoParamAndResult function)
        if(function == null)
            return this;
        
        if(mFunctionNoParamAndResult == null)
            mFunctionNoParamAndResult = new HashMap<>(1);
        
        mFunctionNoParamAndResult.put(function.mFunctionName,function);

        return this;
    

    /**
     * 添加既有参数又有返回值的函数
     * @param function 
     * @return
     */
    public Functions addFunction(FunctionWithParamAndResult function)
        if(function == null)
            return this;
        
        if(mFunctionWithParamAndResult == null)
            mFunctionWithParamAndResult = new HashMap<>(1);
        
        mFunctionWithParamAndResult.put(function.mFunctionName,function);

        return this;
    

    /**
     * 添加带有返回值的函数
     * @param function
     * @return
     */
    public Functions addFunction(FunctionWithResult function)
        if(function == null)
            return this;
        
        if(mFunctionWithResult == null)
            mFunctionWithResult = new HashMap<>(1);
        
        mFunctionWithResult.put(function.mFunctionName,function);

        return this;
    

    /**
     * 根据函数名,回调无参无返回值的函数
     * @param funcName
     */
    public void invokeFunc(String funcName) throws FunctionException 
        FunctionNoParamAndResult f = null;
        if(mFunctionNoParamAndResult != null)
            f = mFunctionNoParamAndResult.get(funcName);
            if(f != null)
                f.function();
            
        

        if(f == null)
            throw new FunctionException("没有此函数");

        
    

    /**
     * 根据函数名,回调无参有返回值的函数
     * @param funcName
     */
    public <Result> Result invokeFuncWithResult(String funcName, Class<Result> c) throws FunctionException 
        FunctionWithResult f = null;
        if(mFunctionWithResult != null)
            f = mFunctionWithResult.get(funcName);
            if(f != null)
                if(c != null)
                    return c.cast(f.function());
                else
                    return (Result)f.function();
                

            
        

        if(f == null)
            throw new FunctionException("没有此函数");
        
        return null;
    

    /**
     * 调用具有参数的函数
     * @param funcName
     * @param param
     * @param <Param>
     */
    public <Param> void invokeFunc(String funcName,Param param)throws FunctionException
        FunctionWithParam f = null;
        if(mFunctionWithParam != null)
            f = mFunctionWithParam.get(funcName);
            if(f != null)
                f.function(param);
            
        


    

    /**
     * 调用具有参数,同时具有返回值的函数
     * @param funcName
     * @param param
     * @param <Result>
     * @param <Param>
     * @return
     */
    public <Result,Param> Result invokeFuncWithResult(String funcName,Param param,Class<Result> c) throws FunctionException 
        FunctionWithParamAndResult f = null;
        if(mFunctionWithParamAndResult != null)
            f = mFunctionWithParamAndResult.get(funcName);
            if(f != null)
                if(c != null)
                    return c.cast(f.function(param));
                else
                    return (Result)f.function(param);
                
            
        

        if( f == null)
            throw new FunctionException("没有此函数");

        
        return null;
    

    /**
     * 函数的参数,当函数的参数涉及到多个值时,可以用此类,
     * 此类使用规则:存参数与取参数的顺序必须一致,否则报错
     */
    public static class FunctionParams 

        private Bundle mParams = new Bundle(1);
        private int mIndex = -1;
        private Map mObjectParams = new HashMap(1);

        FunctionParams(Bundle mParams,Map mObjectParams)
            this.mParams = mParams;
            this.mObjectParams = mObjectParams;
        

        public <Param> Param getObject(Class<Param> p)
            if(mObjectParams == null)
                return null;
            
            return p.cast(mObjectParams.get((mIndex++) + ""));
        

        /**
         * 获取int值
         * @return
         */
        public int getInt()
            if(mParams != null)
                return mParams.getInt((mIndex++) + "");
            
            return 0;
        

        /**
         * 获取int值
         * @param defalut
         * @return
         */
        public int getInt(int defalut)
            if(mParams != null)
                return mParams.getInt((mIndex++) + "");
            
            return defalut;
        

        /**
         * 获取字符串
         * @param defalut
         * @return
         */
        public String getString(String defalut)
            if(mParams != null)
                return mParams.getString((mIndex++) + "");
            
            return defalut;
        

        /**
         * 获取字符串
         * @return
         */
        public String getString()
            if(mParams != null)
                return mParams.getString((mIndex++) + "");
            
            return null;
        



        /**
         * 获取Boolean值
         * @return 默认返回false
         */
        public boolean getBoolean()
            if(mParams != null)
                return mParams.getBoolean((mIndex++) + 以上是关于Android -- 四大组件Fragment 与 Activity 之间通信的主要内容,如果未能解决你的问题,请参考以下文章

Android四大基本组件介绍与生命周期

Android四大基本组件介绍与生命周期

Android四大基本组件介绍与生命周期

Android 四大组件 ContentProvider介绍

Android学习之Fragment的各种实现功能(头部折叠,循环列表RecyclerView,左右滑动ViewPager)

Android学习之Fragment的各种实现功能(头部折叠,循环列表RecyclerView,左右滑动ViewPager)