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

一、压缩包
fragmentManagers.zip
二、Activity与Fragment通信
1.原生方案:Bundle
2.java语言中类与类自己通信常用方案:接口
3.其它方案:eventBus,LiveData…(设计模式:观察者,发布订阅)
三、通过接口的实现步骤
1.定义接口,实现接口传值的两个方法
2.定义Callback函数,方便在mainactivity内创建匿名内部类,实现接口的函数
3.实现接口内的所有方法
4.在片段添加一个按钮,进行传值
5.实现fragment与activity之间的传值
6.在activity内进行接收fragment传过来的信息
7.在fragment内进行接收,activity传过来的信息
四、整体代码
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".fragment.BlankFragment1"> <!-- TODO: Update blank fragment layout --> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:text="@string/hello_blank_fragment" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/btn_three" android:text="数据传递" android:layout_marginTop="30dp" /></FrameLayout>
2.IFragmentCallback文件代码
package com.example.fragmentmanagers;public interface IFragmentCallback { //1.定义两个接口,第一个用于fragment去发信息给activity,第二个用于activity发信息给fragment void sendMsgToActivity(String msg); String getMsgFromActivity(String msg);}
3.BlankFragment1文件代码
package com.example.fragmentmanagers.fragment;import android.os.Bundle;import androidx.fragment.app.Fragment;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.Button;import android.widget.Toast;import com.example.fragmentmanagers.IFragmentCallback;import com.example.fragmentmanagers.R;public class BlankFragment1 extends Fragment { //2.定义Callback变量 private IFragmentCallback fragmentCallback; private View rootview; //3.定义Callback函数,方便给接口定义的两个函数赋值 public void setFragmentCallback(IFragmentCallback callback){ fragmentCallback=callback; } private static final String TAG = "BlankFragment1"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle bundle = getArguments(); String message = bundle.getString("message"); Log.e("he",""+message); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //5.绘制布局,将控件绑定,点击之后,发送消息 if (rootview==null) { rootview=inflater.inflate(R.layout.fragment_blank_fragment1, container, false); } Button btn_three = rootview.findViewById(R.id.btn_three); btn_three.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) {// fragmentCallback.sendMsgToActivity("hello,I am from fragment"); String msg = fragmentCallback.getMsgFromActivity("null"); Toast.makeText(BlankFragment1.this.getContext(), ""+msg, Toast.LENGTH_SHORT).show(); } }); return rootview; } @Override public void onResume() { super.onResume(); }}
4.MainActivity文件代码
package com.example.fragmentmanagers;import androidx.appcompat.app.AppCompatActivity;import androidx.fragment.app.Fragment;import androidx.fragment.app.FragmentManager;import androidx.fragment.app.FragmentTransaction;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.Toast;import com.example.fragmentmanagers.fragment.BlankFragment1;import com.example.fragmentmanagers.fragment.BlankFragment2;public class MainActivity extends AppCompatActivity implements View.OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btn_one = findViewById(R.id.btn_one); btn_one.setOnClickListener(this); Button btn_two = findViewById(R.id.btn_two); btn_two.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_one: Bundle bundle = new Bundle(); bundle.putString("message","我很喜欢享学课堂"); BlankFragment1 blankFragment1 = new BlankFragment1(); blankFragment1.setArguments(bundle); //4.在主活动内实现fragment这个对象内接口的所有方法 blankFragment1.setFragmentCallback(new IFragmentCallback() { @Override public void sendMsgToActivity(String msg) { Toast.makeText(MainActivity.this," "+msg, Toast.LENGTH_SHORT).show(); } @Override public String getMsgFromActivity(String string) { return "hello,I am from activity"; } }); replaceFragment(blankFragment1); break; case R.id.btn_two: replaceFragment(new BlankFragment2()); } } //动态切换fragment private void replaceFragment(Fragment fragment) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.replace(R.id.fl_item,fragment); transaction.addToBackStack(null); transaction.commit(); }}
5.效果图:
(1)从fragment到activity<br /><br /> (2)从activity到fragment<br />