Android应用开发Android:Fragment通信的实现
白羽 2019-05-20 来源 :网络 阅读 513 评论 0

摘要:本文将带你了解Android应用开发Android:Fragment通信的实现,希望本文对大家学Android有所帮助。

    本文将带你了解Android应用开发Android:Fragment通信的实现,希望本文对大家学Android有所帮助。


Android应用开发Android:Fragment通信的实现


两个事物直接要有相互联系的话就必须要具备通信交流的功能,在Android中的Fragment也是需要与外界进行通信的,Fragment的通信分为两种,一种是与Activity的通信,还有一种是与另一个Fragment的通信,接下来我们用例子来简单介绍一下。
   
    Activity->Fragment
    Activity向Fragment传值就是以下两个步骤:
   
    Activity中重新创建有个Fragment对象,调用setArguments(),传入Bundle的方式存储值,然后再替换原有的Fragment。   Fragment中调用getArguments()获取到Bundle对象,然后解析获得具体传递过来的值
      按照这个步骤我们先写一个布局文件,上面是输入框,中间是提交按钮,下面是一个Fragment,然后我们先在MainActivity中动态引入一个Fragment,之后我们监听按钮的点击事件,当按下按钮的时候我们就进行数据的传递。
    在Fragment的通信中我们用到的是Bundle,一个键值对,我们先把我们想要传递的数据传入Bundle。
 

    public void sendValue(View view) {
        String info =   editText.getText().toString().trim();
     
        //创建Bundle对象   将需要传递的数据存储在Bundle中,然后调用Fragment的setArguments()方法传递Bundle
        ResultFragment rf = new   ResultFragment();
        Bundle bundle = new   Bundle();
          bundle.putString(info,info);
        rf.setArguments(bundle);
     
        manager =   getFragmentManager();
        transaction =   manager.beginTransaction();
          transaction.replace(R.id.contentlayout,rf);//替换原有的Fragment
        transaction.commit();
    }
    然后相应的我们就要在Fragment中去改变TextView中的值了。
   


    package com.gin.xjh.fragment;
     
    import android.app.Fragment;
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
     
    import com.gin.xjh.activitytofragment.R;
     
    /**
     * Created by Gin on 2018/1/24.
     */
     
    public class ResultFragment extends Fragment {
     
        private TextView tv_show;
     
        @Nullable
        @Override
        public View onCreateView(LayoutInflater   inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
            View view =   inflater.inflate(R.layout.fragment_result,null);
            tv_show=view.findViewById(R.id.tv_show);
     
              //先调用getArguments()方法获取Bundle
              //Bundle对象中根据key获取传递的数据,展示在TextView中
            Bundle bundle =   getArguments();
            if(bundle!=null){
                String info =   bundle.getString(info);
                  tv_show.setText(info);
            }
     
            return view;
        }
    }
    这样我们就达到了我们想要的效果(如下)
    这里写图片描述
   
    Fragment->Activity
    这个传值是通过接口的方式,步骤如下:
   
    Fragment中定义传值的回调接口,在生命周期的onAttach()或onCreate()方法中获取接口的实现 Fragment需要传值的位置调用接口回调方法传值   Activity实现回调接口重写回调方法获取传递的值
    我们通过一个小例子来了解怎么进行通信。
      和之前一样,只不过我们调换了顺序,对于消息的发送我们放在Fragment中,然后显示的TextView在Activity中,我们需要在Fragment中写一个接口,用来回调传值。
  

    package com.gin.xjh.fragment;
     
    import android.app.Fragment;
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
     
    import com.gin.xjh.activitytofragment.R;
     
    /**
     * Created by Gin on 2018/1/24.
     */
     
    public class ResourceFragment extends Fragment {
     
        private Button btn_pass;
        private EditText editText;
        MyListener listener;
     
        @Override
        public void onCreate(@Nullable   Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
            //创建接口的子类对象
            listener= (MyListener) getActivity();//获取当前Fragment所属的Activity,因为Activity实现了MyListener接口所以是MyListener的子类
        }
     
        @Nullable
        @Override
        public View   onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle   savedInstanceState) {
            View view =   inflater.inflate(R.layout.fragment_result,null);
              btn_pass=view.findViewById(R.id.btn_pass);
            editText=   view.findViewById(R.id.et_content);
              btn_pass.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View   v) {
                      //点击按钮时获取EditText中的值传递到Activity
                    String info =   editText.getText().toString().trim();
                      listener.sendMessage(info);
                }
            });
            return view;
        }
     
        public interface   MyListener{
            public abstract void   sendMessage(String str);
        }
     
    }
      然后我们在MainActivity中实现这个接口,然后重写sendMessage()方法,这样我们就可以把数据传过来了。效果就是下面这样的。
    这里写图片描述
    这里为什么在Fragment中实例化那个接口为什么我们可以直接用getActivity()方法获取呢,因为Activity实现了MyListener接口所以是MyListener的子类。
   
    Fragment->Fragment
      其实这个我们可以把他看成Fragment->Activity->Fragment,因为两个乃至多个Fragment是依附于同一个Activity,所以我们完全可以通过先把值传递到共同依附的Activity中,然后再通过Bundle传给另一个Fragment。这个实现起来比较容易,就是上面两个的结合,就不说了,我们来说说下面的其他方法(下面几种方法的区别就是在OnClick()方法中):
    方式一:
      先调用findFragmentById()方法根据id获得Fragment的对象,然后调用fragment中的方法进行赋值。(因为左右两侧的Fragment同属于一个Activity,并且使用唯一的Id进行标识,虽然不能调用另一个Fragment的控件,但是我们可以在自己的Fragment中定义一个方法,然后在本身调用控件,然后我们就能在另一个Fragment中修改本身的控件了)
    所以按照这个来看,我们需要在想要得到值的Fragment中定义一个方法给TextView控件赋值
   
 
    public void setTextView(String str){
        tv_show.setText(str);
    }
    这样我们在左侧的Fragment中的按钮的点击事件中获取到右侧的Fragment对象然后调用这个方法就好了。

    package com.gin.xjh.fragment;
     
    import android.app.Fragment;
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
     
    import com.gin.xjh.fragmenttofragment.R;
     
    /**
     * Created by Gin on 2018/1/24.
     */
     
    public class LeftFragment extends Fragment {
        private EditText   et_content;
        private Button btn_send;
     
     
        @Nullable
        @Override
        public View   onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle   savedInstanceState) {
            View view =   inflater.inflate(R.layout.fragment_left,null);
            et_content=view.findViewById(R.id.et_content);
              btn_send=view.findViewById(R.id.btn_send);
              btn_send.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View   v) {
                        

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程