private String year="";
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getParentFragmentManager().setFragmentResultListener("requestKey", this, new FragmentResultListener() {
@Override
public void onFragmentResult(@NonNull String requestKey, @NonNull Bundle bundle) {
// We use a String here, but any type that can be put in a Bundle is supported
year = bundle.getString("year_select");
// Do something with the result
Log.d("内部监听 income year 获取:",year);
}
});
}
如上代码,year正确拿到了,但是我在onCreateView里使用还是个空字符串
针对你的问题结合chatgpt知识库请参考以下内容:
在onCreateView
中获取到的year
是空字符串,这是因为onCreate
和onCreateView
生命周期不同步,即onCreate
执行时获取到的year
值还没有被设置。可以将获取到的year
保存在状态变量中(比如ViewModel
或者LiveData
),从而能够在onCreateView
中使用。举个例子:
定义一个ViewModel
类,用于保存状态变量
public class MyViewModel extends ViewModel {
private String year;
public void setYear(String year) {
this.year = year;
}
public String getYear() {
return year;
}
}
在Fragment
中初始化ViewModel
实例并设置year
值
private MyViewModel mViewModel;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mViewModel = new ViewModelProvider(this).get(MyViewModel.class);
getParentFragmentManager().setFragmentResultListener("requestKey", this, new FragmentResultListener() {
@Override
public void onFragmentResult(@NonNull String requestKey, @NonNull Bundle bundle) {
String year = bundle.getString("year_select");
// save year to ViewModel
mViewModel.setYear(year);
}
});
}
在onCreateView
中获取year
值
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_my_fragment, container, false);
// get year from ViewModel
String year = mViewModel.getYear();
// Use year here...
return view;
}
除了使用ViewModel
方案,还有其他方式可以将获取到的值传递给onCreateView
方法。这里介绍一种常用的通知机制:使用回调接口。
新建回调接口OnYearSelectListener
public interface OnYearSelectListener {
void onYearSelected(String year);
}
在Fragment
中定义一个OnYearSelectListener
类型的成员变量和一个设置回调的方法
private OnYearSelectListener mListener;
public void setOnYearSelectListener(OnYearSelectListener listener) {
mListener = listener;
}
当收到来自getParentFragmentManager().setFragmentResultListener
回调时,调用OnYearSelectListener
完成回调
getParentFragmentManager().setFragmentResultListener("requestKey", this, new FragmentResultListener() {
@Override
public void onFragmentResult(@NonNull String requestKey, @NonNull Bundle bundle) {
String year = bundle.getString("year_select");
// invoke callback with the selected year
if (mListener != null) {
mListener.onYearSelected(year);
}
}
});
在onCreateView
里实现回调
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_my_fragment, container, false);
// set listener for year selection
setOnYearSelectListener(new OnYearSelectListener() {
@Override
public void onYearSelected(String year) {
Log.d("外部** income year 获取:",year);
// Do something with the selected year here...
}
});
return view;
}
以上是通过回调接口的方式将获取到的值传递给onCreateView
方法。具体实现方案,可以根据实际情况进行选择。