我从A fragment启动了bottomSheetDialogFragment。
我想从该bottomSheetDialogFragment中选择日期,然后将其设置在fragment A中。
日期已经选择好了,我只是想要在fragment A中获取它并设置在一些字段中。
如何获取该值呢? 有什么建议吗?
我从A fragment启动了bottomSheetDialogFragment。
我想从该bottomSheetDialogFragment中选择日期,然后将其设置在fragment A中。
日期已经选择好了,我只是想要在fragment A中获取它并设置在一些字段中。
如何获取该值呢? 有什么建议吗?
创建一个像这样的接口类
public interface CustomInterface {
public void callbackMethod(String date);
}
在您的Activity
或Fragment
中实现此接口,并创建该接口的对象。
private CustomInterface callback;
在onCreate
或onCreateView
中初始化它。
callback=this;
现在,当您调用BottomSheetDialogFragment
时,请将此回调函数传递给构造函数。
yourBottomSheetObject = new YourBottomSheet(callback);
yourBottomSheetObject.show(getSupportFragmentManager()," string");
现在在你的BottomSheetFragment的构造函数中:
private CustomInterface callback;
public SelectStartTimeSheet(CustomInterface callback){
this.callback=callback;
}
最后,使用这个回调对象来设置您的日期。
callback.callbackMethod("your date");
你将在callbackMethod
函数中收到这个数据,可以在Fragment或Activity中接收。
覆盖片段的构造函数是一种不良实践,因为文档中说:
每个片段都必须有一个空构造函数,这样当恢复其活动状态时可以实例化它。
如果您使用传递回调作为参数的另一个构造函数,则当框架恢复片段时,您的应用程序将崩溃。
推荐的方法是使用viewModel和livedata。
Android导航架构组件
例如:
假设您使用navController从Fragment A打开Fragment B。
并且您想要从Fragment B向Fragment A获取一些数据。
class B :BottomSheetDialogFragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val root = inflater.inflate(R.layout.your_layout, container, false)
root.sampleButton.setOnClickListener {
val navController = findNavController()
navController.previousBackStackEntry?.savedStateHandle?.set("your_key", "your_value")
dismiss()
}
}
并且在您的 Fragment A 中:
findNavController().currentBackStackEntry?.savedStateHandle?.getLiveData<String>("your_key")
?.observe(viewLifecycleOwner) {
if (it == "your_value") {
//your code
}
}
选择账号片段代码
class SelectAccountFragment(val clickListener: OnOptionCLickListener) : BottomSheetDialogFragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.bottom_fragment_accounts, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val list = DataProcessorApp(context).allUsers
val rvAccounts = view.findViewById<RecyclerView>(R.id.rvAccounts)
rvAccounts.layoutManager = LinearLayoutManager(context)
rvAccounts.adapter = AccountsAdapter(context, list)
Log.e(tag,"Accounts "+list.size);
tvAccountAdd.setOnClickListener {
val intent = Intent(context,LoginActivity::class.java)
startActivity(intent)
}
tvManageAccounts.setOnClickListener {
Log.e(tag,"Manage Click")
clickListener.onManageClick()
}
}
interface OnOptionCLickListener{
fun onManageClick()
}
}
SelectAccountFragment accountFragment = new SelectAccountFragment(() -> {
//get fragment by tag and dismiss it
BottomSheetDialogFragment fragment = (BottomSheetDialogFragment) getChildFragmentManager().findFragmentByTag(SelectAccountFragment.class.getSimpleName();
if (fragment!=null){
fragment.dismiss();
}
});
accountFragment.show(getChildFragmentManager(),SelectAccountFragment.class.getSimpleName());
您可以使用Navigation
库的优势:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val navController = findNavController();
// After a configuration change or process death, the currentBackStackEntry
// points to the dialog destination, so you must use getBackStackEntry()
// with the specific ID of your destination to ensure we always
// get the right NavBackStackEntry
val navBackStackEntry = navController.getBackStackEntry(R.id.your_fragment)
// Create our observer and add it to the NavBackStackEntry's lifecycle
val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME
&& navBackStackEntry.savedStateHandle.contains("key")) {
val result = navBackStackEntry.savedStateHandle.get<String>("key");
// Do something with the result
}
}
navBackStackEntry.lifecycle.addObserver(observer)
// As addObserver() does not automatically remove the observer, we
// call removeObserver() manually when the view lifecycle is destroyed
viewLifecycleOwner.lifecycle.addObserver(LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_DESTROY) {
navBackStackEntry.lifecycle.removeObserver(observer)
}
})
}
欲知详情,请阅读文档。
你也可以使用LocalBroadcastManager。正如hglf所说,最好保留片段的空构造函数,并使用newInstance(Type value)来实例化片段,如果你仍然想使用接口回调方式。
被接受的答案是错误的。
你可以做的就是在调用show()时使用Fragment A的childFragmentManager。
像这样:
val childFragmentManager = fragmentA.childFragmentManager
bottomSheetDialogFragment.show(childFragmentManager, "dialog")