BottomSheetDialogFragment 如何与其宿主片段通信?
How can a BottomSheetDialogFragment communicate with its host fragment?
我的片段中有一个按钮可以打开 BottomSheetDialogFragment。如果用户在 BottomSheetDialogFragment 上选择了一个项目,我想通知主机片段。为了实现这一点,我在我的 BottomSheetDialogFragment 中制作了一个界面。但是,该接口仅与主机 activity 通信,而不与片段通信。如何将对话框中的信息发送到片段?
这是我的界面:
public interface BottomSheetListener {
void onButtonClicked(int index);
}
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
try {
mListener = (BottomSheetListener) context;
} catch (ClassCastException e) {
throw new ClassCastException(context.toString() + " must implement BottomSheetListener");
}
}
getParentFragment
将 return 父片段,如果当前片段附加到一个片段,否则它将 return null 如果它直接附加到 Activity
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
try {
mListener = (BottomSheetListener) getParentFragment();
} catch (ClassCastException e) {
throw new ClassCastException(context.toString() + " must implement BottomSheetListener");
}
}
当您使用大量片段、嵌套片段或对话片段时,它们之间的通信会变得混乱。我建议使用 ViewModel 和 LiveData 来传递和更新数据。
首先将其添加到构建 gradle :
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
然后创建 ViewModel class :
public class YourViewModel 扩展了 AndroidViewModel {
private MutableLiveData<Integer> yourMutableLiveData=new MutableLiveData<>();
public YourViewModel(@NonNull Application application) {
super(application);
}
public MutableLiveData<Integer> getYourMutableLiveData() {
return yourMutableLiveData;
}
}
这是您要设置值的片段:
public class FragmentA extends Fragment{
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
YourViewModel yourViewModel =new ViewModelProvider(getActivity()).get(YourViewModel.class);
yourViewModel.getYourMutableLiveData().setValue(0);
}
}
这是您希望在更新时获得价值的片段:
public class FragmentB extends Fragment{
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
YourViewModel yourViewModel =new ViewModelProvider(getActivity()).get(YourViewModel.class);
yourViewModel.getYourMutableLiveData().observe(getViewLifecycleOwner(), new Observer<Integer>() {
@Override
public void onChanged(Integer integer) {
}
});
}
}
它可以像我测试的那样在对话片段上工作。
注意事项:
- 不要将上下文或任何视图传递到视图模型中。
-记住 onActivityCreated 在 onCreateView 之后。
-不要将此键设置为
YourViewModel yourViewModel =new ViewModelProvider(this).get(YourViewModel.class);
in fragment 如果你想将数据片段传递给fragment但是你可以传入activity.
-您可以为数据设置多个观察者。
我的片段中有一个按钮可以打开 BottomSheetDialogFragment。如果用户在 BottomSheetDialogFragment 上选择了一个项目,我想通知主机片段。为了实现这一点,我在我的 BottomSheetDialogFragment 中制作了一个界面。但是,该接口仅与主机 activity 通信,而不与片段通信。如何将对话框中的信息发送到片段?
这是我的界面:
public interface BottomSheetListener {
void onButtonClicked(int index);
}
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
try {
mListener = (BottomSheetListener) context;
} catch (ClassCastException e) {
throw new ClassCastException(context.toString() + " must implement BottomSheetListener");
}
}
getParentFragment
将 return 父片段,如果当前片段附加到一个片段,否则它将 return null 如果它直接附加到 Activity
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
try {
mListener = (BottomSheetListener) getParentFragment();
} catch (ClassCastException e) {
throw new ClassCastException(context.toString() + " must implement BottomSheetListener");
}
}
当您使用大量片段、嵌套片段或对话片段时,它们之间的通信会变得混乱。我建议使用 ViewModel 和 LiveData 来传递和更新数据。
首先将其添加到构建 gradle :
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
然后创建 ViewModel class :
public class YourViewModel 扩展了 AndroidViewModel {
private MutableLiveData<Integer> yourMutableLiveData=new MutableLiveData<>();
public YourViewModel(@NonNull Application application) {
super(application);
}
public MutableLiveData<Integer> getYourMutableLiveData() {
return yourMutableLiveData;
}
}
这是您要设置值的片段:
public class FragmentA extends Fragment{
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
YourViewModel yourViewModel =new ViewModelProvider(getActivity()).get(YourViewModel.class);
yourViewModel.getYourMutableLiveData().setValue(0);
}
}
这是您希望在更新时获得价值的片段:
public class FragmentB extends Fragment{
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
YourViewModel yourViewModel =new ViewModelProvider(getActivity()).get(YourViewModel.class);
yourViewModel.getYourMutableLiveData().observe(getViewLifecycleOwner(), new Observer<Integer>() {
@Override
public void onChanged(Integer integer) {
}
});
}
}
它可以像我测试的那样在对话片段上工作。
注意事项: - 不要将上下文或任何视图传递到视图模型中。
-记住 onActivityCreated 在 onCreateView 之后。
-不要将此键设置为
YourViewModel yourViewModel =new ViewModelProvider(this).get(YourViewModel.class);
in fragment 如果你想将数据片段传递给fragment但是你可以传入activity.
-您可以为数据设置多个观察者。