从“底部工作表”对话框片段中获取价值

Abd*_*man 8 android fragment dialogfragment bottom-sheet

我从片段A开始bottomSheetDialogFragment。我想从该bottomSheetDialogFragment中选择日期,然后将其设置在片段A中。

选择日期已经完成,我只想将其放在片段A中以在某些字段中进行设置。

我如何获得价值?有什么建议怎么做吗?

Yog*_*til 9

Android导航架构组件

例如:

假设您使用 navController 从片段 A 打开片段 B。

并且您需要从片段 B 到片段 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()

        }
}
Run Code Online (Sandbox Code Playgroud)

在你的片段A中:

findNavController().currentBackStackEntry?.savedStateHandle?.getLiveData<String>("your_key")
                ?.observe(viewLifecycleOwner) {
    
                    if (it == "your_value") {
                        //your code
    
                    }
    
                }
Run Code Online (Sandbox Code Playgroud)


Abh*_*hra 8

创建一个这样的接口类

public interface CustomInterface {

    public void callbackMethod(String date);
}
Run Code Online (Sandbox Code Playgroud)

Activity或中实现此接口Fragment。并使其成为此接口的对象。

private CustomInterface callback;
Run Code Online (Sandbox Code Playgroud)

onCreate或中初始化onCreateView

callback=this;
Run Code Online (Sandbox Code Playgroud)

现在在BottomSheetDialogFragment调用它时在构造函数中传递此回调。

yourBottomSheetObject = new YourBottomSheet(callback);
yourBottomSheetObject.show(getSupportFragmentManager()," string");
Run Code Online (Sandbox Code Playgroud)

现在在您的BottomSheetFragment的构造函数中

私人CustomInterface回调;

public SelectStartTimeSheet(CustomInterface callback){

this.callback=callback;

}
Run Code Online (Sandbox Code Playgroud)

最后使用此回调对象设置您的日期

callback.callbackMethod("your date");
Run Code Online (Sandbox Code Playgroud)

并且您将在“片段”或“活动中”中收到该日期callbackMethod

  • 不要抑制,您可以执行以下操作:fragment.setCallbackListener(listener)。但是,如果从片段或活动中调用,这仍然不是首选方法。您可以在片段的情况下使用getTargetFragment()例如 (3认同)
  • 这对我不起作用。当我在bottomsheetfragment 中创建一个带参数的构造函数时,它会抛出一个警告说“避免在片段中使用非默认构造函数”……有什么解决方法吗?谢谢 (2认同)

小智 7

正如文档所说,覆盖片段的构造函数是一种不好的做法:

每个片段必须有一个 * 空的构造函数,因此它可以在恢复其活动的状态时被实例化。

如果您使用另一个将回调作为参数传递的构造函数,则当框架恢复片段时,您的应用程序会崩溃

推荐的方法是使用 viewModel 和 livedata。