摘要:本文将带你了解Android应用开发Android:Fragment通信的实现,希望本文对大家学Android有所帮助。
本文将带你了解Android应用开发Android:Fragment通信的实现,希望本文对大家学Android有所帮助。
两个事物直接要有相互联系的话就必须要具备通信交流的功能,在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频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号