如何处理 Snackbar 中的配置更改?

How to handle configuration change in Snackbar?

我遇到了一个问题,希望您能帮我解决。在我的 Android 应用程序中,我使用通常的方式 (Snackbar.make().show()) 显示 Snackbar。但是,我还必须处理配置更改(例如方向从纵向更改为横向)。

现在,如果配置发生变化,Snackbar 就会消失,这是我没有预料到的。我在 ProgressDialog 和 AlertDialog 中遇到了同样的问题,我通过使用 DialogFragment 的自定义子类解决了这个问题。

我的 AsyncTasks 也有这个问题,我通过使用我保留的 Fragment 的自定义子类解决了这个问题(setRetainInstance(true)onCreate() 的 Fragment 中)并保留对我的 AsyncTask 的引用.在这两种情况下,每个片段都有一个 Activity 必须实现的回调接口,我 set/unset 在 onAttach()/onDetach() 期间的回调。

但是,Snackbar 似乎有所不同,因为它附加到视图而不是上下文,例如 ProgressDialog(在我的 DialogFragment 的 getDialog() 中,我可以使用新的 ProgressDialog(getActivity()))。

那么什么时候以及如何在配置更改后显示 Snackbar?是使用 Fragment 还是我应该尝试通过在我的 Activity 上设置一些私有变量来解决这个问题,我通过 savedInstanceState?

save/restore

由于没有提供合适的答案并且我必须在截止日期前完成,我现在采用以下解决方案:

  • 创建一个扩展 AppCompatAcitity 的活动基础 class,我的所有活动都从中继承
  • 在activity基础class中,创建一堆实例变量来存储有关Snackbar的信息(isShowing、标识符、消息、动作、参数)
  • 在 activity 基础 class 中,创建一个显示快餐栏的方法,为其提供前面提到的所有变量
  • 在activity基础class中,使用onSaveInstanceState和onRestoreInstanceState来save/restore前面提到的变量
  • 如果 Snackbar 在配置更改之前显示,布尔值将被保存和恢复,我可以使用它在我的 activity 基础 [= 的 onRestore() 中创建一个具有相同配置的新 Snackbar 34=]
  • 创建快餐栏时,我使用 snackbar.setCallback() 设置回调,检查快餐栏是否被关闭,如果是,我将 isShowing 更改为 false
  • 设置快餐栏时,我设置了调用活动库中的方法的操作class,使用我之前提供的标识符作为参数来检查单击了哪个快餐栏