本人ViewModel用的始终比较奇妙,因此使用接口的方式进行数据传递.
fragment通过Viewpager嵌套在一个Activity内部的情况下,就不能直接通过接口传递数据,不然直接使用会出现实例没有正确创建的问题;
所以得稍微曲线一下得通过FragmentBaseActivity来接收另外一个从fragment中打开的Activity中传递的数据,之后再通过FragmentBaseActivity将数据传输给fragment,思路是这样的.
接下来是代码环节:
下面这是一个listView中点击一个小行获取数据后回传的操作
接口需要写在你在fragment中打开的那个Activity中
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String irrigatename = irrigateBeens.get(position).getIrrigation();
Intent intent = new Intent();
intent.putExtra("irrigatename",irrigatename);
setResult(RESULT_OK,intent);
finish();
}
});
}
public interface OnDataChangeListener{
void onDataChange(String data);
}
}
之后会用FragmentBaseActivity作为数据的监听者,同时实现一些方便fragment进行数据接收的操作,下面的代码是FragmentBaseActivity中需要添加的代码:
private final ActivityResultLauncher<Intent> resultLauncher =
registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if (result.getResultCode() == RESULT_OK) {
Intent data = result.getData();
if (data != null) {
String youdata = data.getStringExtra("key");
passDataToFragment(irrigatename);
}
}
}
}
);
//注意上面这个是创建在oncreat方法外面的
//getStringExtra需要传递的是键对象,别问我键是什么,不知道学javase去
public void startListActivity(){
Intent intent = new Intent(this,ListBaseActivity.class);
resultLauncher.launch(intent);
}
//这个暴露的方法是为了方便fragment调用和书写,在FragmentBaseActivity打开第二个activity
//这个方法是在fragment中调用的不是在FragmentBaseActivity中调用的
//这个方法就是单纯作为监听
public void passDataToFragment(String data) {
if (myhomeFragment != null) {
myhomeFragment.onDataChange(data);
}
}
最后一个就是需要在你的Fragment中写的代码:
public class MyhomeFragment extends Fragment implements ListBaseActivity.OnDataChangeListener {
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
iv_select = view.findViewById(R.id.iv_select);
ed_irrigate = view.findViewById(R.id.ed_irrigate);
iv_select.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (getActivity() instanceof FragmentBaseActivity) {
((FragmentBaseActivity)getActivity()).startListActivity();
//fragment本来就能够通过getActivity的方式去获取本身创建它的对象所以我们需要强转成FragmentBaseActivity的对象,这样才能使用FragmentBaseActivity内部的方法
}
}
});
}
//这个就没什么好说的了
@Override
public void onDataChange(String data) {
if (ed_irrigate != null) {
ed_irrigate.setText(data);
Log.d("MyhomeFragment", "Received data: " + data);
}
}
}
好像有点不适合刚开始敲代码的人看,但是还是比较好理解的,里面的代码都很简单.