问:如何实现通过接口,将接口赋值给fragment

答:1.定义一个接口,2.在fragment内定义这个接口的函数,3.在mainactivity内通过匿名内部类实现这个接口内的所有方法

如图:

27.Fragment与activity通信的接口方案 - 图1

一、压缩包

fragmentManagers.zip

二、Activity与Fragment通信

1.原生方案:Bundle

2.java语言中类与类自己通信常用方案:接口

3.其它方案:eventBus,LiveData…(设计模式:观察者,发布订阅)

三、通过接口的实现步骤

1.定义接口,实现接口传值的两个方法

image.png

2.定义Callback函数,方便在mainactivity内创建匿名内部类,实现接口的函数

image.png

3.实现接口内的所有方法

image.png

4.在片段添加一个按钮,进行传值

image.png

5.实现fragment与activity之间的传值

image.png

6.在activity内进行接收fragment传过来的信息

image.png

7.在fragment内进行接收,activity传过来的信息

image.png

四、整体代码

1.布局fragment_blank_fragment1.xml文件

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. tools:context=".fragment.BlankFragment1">
  7. <!-- TODO: Update blank fragment layout -->
  8. <TextView
  9. android:layout_width="match_parent"
  10. android:layout_height="match_parent"
  11. android:text="@string/hello_blank_fragment" />
  12. <Button
  13. android:layout_width="match_parent"
  14. android:layout_height="wrap_content"
  15. android:id="@+id/btn_three"
  16. android:text="数据传递"
  17. android:layout_marginTop="30dp"
  18. />
  19. </FrameLayout>

2.IFragmentCallback文件代码

  1. package com.example.fragmentmanagers;
  2. public interface IFragmentCallback {
  3. //1.定义两个接口,第一个用于fragment去发信息给activity,第二个用于activity发信息给fragment
  4. void sendMsgToActivity(String msg);
  5. String getMsgFromActivity(String msg);
  6. }

3.BlankFragment1文件代码

  1. package com.example.fragmentmanagers.fragment;
  2. import android.os.Bundle;
  3. import androidx.fragment.app.Fragment;
  4. import android.util.Log;
  5. import android.view.LayoutInflater;
  6. import android.view.View;
  7. import android.view.ViewGroup;
  8. import android.widget.Button;
  9. import android.widget.Toast;
  10. import com.example.fragmentmanagers.IFragmentCallback;
  11. import com.example.fragmentmanagers.R;
  12. public class BlankFragment1 extends Fragment {
  13. //2.定义Callback变量
  14. private IFragmentCallback fragmentCallback;
  15. private View rootview;
  16. //3.定义Callback函数,方便给接口定义的两个函数赋值
  17. public void setFragmentCallback(IFragmentCallback callback){
  18. fragmentCallback=callback;
  19. }
  20. private static final String TAG = "BlankFragment1";
  21. @Override
  22. public void onCreate(Bundle savedInstanceState) {
  23. super.onCreate(savedInstanceState);
  24. Bundle bundle = getArguments();
  25. String message = bundle.getString("message");
  26. Log.e("he",""+message);
  27. }
  28. @Override
  29. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  30. Bundle savedInstanceState) {
  31. //5.绘制布局,将控件绑定,点击之后,发送消息
  32. if (rootview==null) {
  33. rootview=inflater.inflate(R.layout.fragment_blank_fragment1, container, false);
  34. }
  35. Button btn_three = rootview.findViewById(R.id.btn_three);
  36. btn_three.setOnClickListener(new View.OnClickListener() {
  37. @Override
  38. public void onClick(View v) {
  39. // fragmentCallback.sendMsgToActivity("hello,I am from fragment");
  40. String msg = fragmentCallback.getMsgFromActivity("null");
  41. Toast.makeText(BlankFragment1.this.getContext(), ""+msg, Toast.LENGTH_SHORT).show();
  42. }
  43. });
  44. return rootview;
  45. }
  46. @Override
  47. public void onResume() {
  48. super.onResume();
  49. }
  50. }

4.MainActivity文件代码

  1. package com.example.fragmentmanagers;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import androidx.fragment.app.Fragment;
  4. import androidx.fragment.app.FragmentManager;
  5. import androidx.fragment.app.FragmentTransaction;
  6. import android.os.Bundle;
  7. import android.view.View;
  8. import android.widget.Button;
  9. import android.widget.Toast;
  10. import com.example.fragmentmanagers.fragment.BlankFragment1;
  11. import com.example.fragmentmanagers.fragment.BlankFragment2;
  12. public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  13. @Override
  14. protected void onCreate(Bundle savedInstanceState) {
  15. super.onCreate(savedInstanceState);
  16. setContentView(R.layout.activity_main);
  17. Button btn_one = findViewById(R.id.btn_one);
  18. btn_one.setOnClickListener(this);
  19. Button btn_two = findViewById(R.id.btn_two);
  20. btn_two.setOnClickListener(this);
  21. }
  22. @Override
  23. public void onClick(View v) {
  24. switch (v.getId()) {
  25. case R.id.btn_one:
  26. Bundle bundle = new Bundle();
  27. bundle.putString("message","我很喜欢享学课堂");
  28. BlankFragment1 blankFragment1 = new BlankFragment1();
  29. blankFragment1.setArguments(bundle);
  30. //4.在主活动内实现fragment这个对象内接口的所有方法
  31. blankFragment1.setFragmentCallback(new IFragmentCallback() {
  32. @Override
  33. public void sendMsgToActivity(String msg) {
  34. Toast.makeText(MainActivity.this," "+msg, Toast.LENGTH_SHORT).show();
  35. }
  36. @Override
  37. public String getMsgFromActivity(String string) {
  38. return "hello,I am from activity";
  39. }
  40. });
  41. replaceFragment(blankFragment1);
  42. break;
  43. case R.id.btn_two:
  44. replaceFragment(new BlankFragment2());
  45. }
  46. }
  47. //动态切换fragment
  48. private void replaceFragment(Fragment fragment) {
  49. FragmentManager fragmentManager = getSupportFragmentManager();
  50. FragmentTransaction transaction = fragmentManager.beginTransaction();
  51. transaction.replace(R.id.fl_item,fragment);
  52. transaction.addToBackStack(null);
  53. transaction.commit();
  54. }
  55. }

5.效果图:

  1. 1)从fragmentactivity<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/1574587/1623655104766-f39134a6-2328-4cb9-a7ba-81e294359752.png#clientId=u5a661da3-61a6-4&from=paste&height=544&id=u06522b8c&margin=%5Bobject%20Object%5D&name=image.png&originHeight=544&originWidth=763&originalType=binary&ratio=1&size=80919&status=done&style=none&taskId=u70aedf2e-306e-4a3a-949b-5dcac811f3f&width=763)<br /> (2)从activity到fragment<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/1574587/1623655036301-e540b442-0363-4c45-9128-3b173e248d03.png#clientId=u5a661da3-61a6-4&from=paste&height=546&id=ud121ca61&margin=%5Bobject%20Object%5D&name=image.png&originHeight=546&originWidth=759&originalType=binary&ratio=1&size=83921&status=done&style=none&taskId=ua70fa9bf-3ccf-45fe-8744-e62e72429b4&width=759)