Fragment与Activity之间的传值

一、Activity传值给Fragment

1.方法一:(Fragment是动态加载的)在activity中建一个bundle,把要传的值存入bundle,然后通过fragment的setArguments(bundle)传到fragment,在fragment中,用getArguments接收

activity :

	MyFragment fragment = new MyFragment();
	Bundle bundle=new Bundle();
    bundle.putString("one","要传的值");
    fragment.setArguments(bundle);
    FragmentManager fm = getFragmentManager();
	FragmentTransaction ft=fm.beginTransaction();
	ft.add(R.id.frame,myFragment,"myFragment");
    ft.commit();

Fragment:

    Bundle bundle=getArguments();
    String s=bundle.getString("one");

2.方法二:(Fragment是静态加载的)在Fragment中设置set,get方法,在activity中获取Fragment对象,fragment.setValue(),Fragment中getValue()
注:静态加载Fragment的时候,一定要给Fragment设置一个唯一标识,id/tag

activity:

FragmentManager fm = getFragmentManager();
MyFragment myFragment = (MyFragment)fm.findFragmentById(R.id.fragment);
myFragment.setValue("传值");

Fragment:

	private String value;

	private void setValue(String value){
		this.value = value;
	}

	private String getValue(){
		return this.value;
	}

//在需要获取的地方调用getValue()
	@Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v=inflater.inflate(R.layout.fragment,null);
        // 给fragment上的按钮添加点击事件
        text = v.findViewById(R.id.tv_show);
        btn = v.findViewById(R.id.btn_get);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
				 text.setText(getValue());
            }
        });
        return v;
    }

3.方法三:利用Fragment的生命周期onAttach()方法,获取宿主activity

activity中:

 public  String toValue(){
        return  "传值";
    }

Fragment中:

   @Override
    public void onAttach(Context context) {
       super.onAttach(context);
       String value = ((MainActivity)context).toValue();
    }

二、Fragment 向Activity传值(接口回调)

1.fragment中准备回调接口 接口中声明传值的回调方法
2.在fragment中定义变量 private MyListener myListener
3.重写fragment中的onAttach()方法:listener = (MyLisener)getActivity();
4.fragment触发事件时回传值
5.Activity中实现回调接口 重写回调方法获取回传的值并显示

Fragment:

public class MyFragment extends Fragment {

    private Button btn;
    private TextView text;
    private String str;
   
	//定义回调接口
	public interface MyListener{
        public void sendValue(String value);
    }
    
 	private MyListener myListener;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v=inflater.inflate(R.layout.fragment,null);
        // 给fragment上的按钮添加点击事件
        text = v.findViewById(R.id.tv_value);
        btn = v.findViewById(R.id.btn_send);
		btn.setOnClickListener(new View.OnClickListener() {
		    @Override
		    public void onClick(View v) {
		        //通过调用在activity中实现的接口方法,把数据传给Mainactivity
		       myListener.sendValue("传值");
		    }
	});
        return v;
    }

	//activity和fragment联系时候调用,fragment必须依赖activty
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
		//获取实现接口的activity
     	myListener = (MyListener) getActivity();//或者myListener=(MainActivity) context;

    }
}

Activity:

public class MainActivity extends BaseActivity implements MyListener{
//myFragment中的接口实现
    public void sendValue(String value) {
       Log.e(TAG,value);
    }
}

三、Fragment与Fragment之间的传值

1.方法一:我们可以通过宿主Activity拿到FragmentManager,进而再通过id或者tag拿到别的Fragment的实例,然后调用相应的方法

public class Fragment1 extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v=inflater.inflate(R.layout.fragment1,null);
        // 给fragment上的按钮添加点击事件  
        v.findViewById(R.id.btn_change).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
				//拿到frgment---fragment之间的通信  
                Fragment2 f2= (Fragment2) getActivity().getFragmentManager().findFragmentByTag("two");
                //two是fragment2的tag, 切换fragment
                beginTracsaction.replace(R.id.lltwo,new Fragment2(),"two");中two是tag 
                f2.setValue("fragment1传值");
            }
        });
        return v;
    }
}

2.方法二:实现接口

AFragment要调用BFragment的方法,在BFragment中建立接口callback 让宿主activity中实现该接口
在AFragment中的onAttach方法中 调用宿主的callback方法  在宿主activity callback 的方法中再调用BFragment想对应的方法

四、EventBus

EventBus是一款Android下的发布/订阅事件总线机制。可以代替Intent、Handler、Broadcast等在Fragment、Activity之间传递消息。
优点:开销小,代码优雅。将发送者和接受者解耦。

具体使用请参考另一篇文章:https://blog.csdn.net/Silence_Sep/article/details/81221466

参考:https://blog.csdn.net/u011146511/article/details/80485362

发布了62 篇原创文章 · 获赞 33 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/Silence_Sep/article/details/86572297
今日推荐