【问题标题】:How to use main actvitiy floating action button from fragments in single activity?如何在单个活动中使用片段中的主要活动浮动操作按钮?
【发布时间】:2021-12-15 18:57:17
【问题描述】:

我在单个活动中使用带有浮动操作按钮的 BottomAppbar。Fab 在不同的片段中具有不同的职责。

  • HomeFragment -> 添加新项目
  • AddProblemFragment ->保存项目(图标也更改)
  • DetailsFragment -> 将项目添加到选定的集合(图标也更改)

我尝试在活动和片段之间使用监听器。图标和位置变化完美,但我无法处理单击时片段中的调用方法。

为了解决点击问题,我从活动中获得了工厂参考

fab = requireActivity().findViewById(R.id.fab)每个片段中(在 onViewCreated 中)。

所以,问题是在方向改变之后 java.lang.NullPointerException: requireActivity().findViewById(R.id.fab) must not be null

有没有办法在方向改变后避免出现这个错误?或者应该选择哪个生命周期来初始化fab?

是否可以在BaseFragment中初始化fab并使用它,因为几乎每个Fragment都有fab?

代码片段:

//Each fragment same approach

private lateinit var fab:FloatingActionButton

override fun onViewCreated(view:View,savedInstanceState:Bundle?){

fab = requireActivity().findViewById(R.id.fab_btn_add)
fab.setImageResource(R.drawable.ic_related_icon)
fab.setOnClickListener {
    //calls method
        }

【问题讨论】:

  • 听起来您在活动的布局 XML 中使用了已弃用的 <fragment> 标记。您是否有没有使用FragmentContainerView 的原因,它不会遇到这个问题?
  • 成功了。我用 FragmentContainerView 替换了它。 导致了这个问题。非常感谢。

标签: android kotlin android-fragments floating-action-button


【解决方案1】:

首先您需要为您的 fab 点击监听器创建一个接口,例如:

interface FabClickCallback {
    
   void onFabClick()

}

关于你的活动,

你需要从这个回调创建一个实例

private FabClickCallback fabCallback;

并且你想在你的 Activity 中创建新方法,例如:

public void handleFabClickListener(FabClickCallback callback){
   // TODO Here put callback
   this.fabCallback = callback;
}

当用户点击这样的 Fab 按钮时,您希望触发此回调:

fab.setOnClickListener ( view -> {
  if (this.fabCallback != null ) {
     this.fabCallback.onFabClick();
   }
});

最后,在您想要处理 Fab Click 的每个 Fragment 上调用此函数并传递您实际的 fab 点击代码:

 ((YourActivity) requireActivity()).handleFabClickListener(this);

并且您的片段必须实现 FabClickCallback 接口

【讨论】:

  • 我不建议这样做,因为它 1) 基本上将您置于循环循环中,并且 2) 在每个 Fragment 中明确依赖父 Activity。为了保持解耦和可重用,Fragment 不应该知道它们拥有的 Activity。参考:developer.android.com/guide/fragments/communicate
  • 我同意你的观点。但是这个解决方案是作为简单的解决方案工作的,这个工作即使他没有使用fragment-ktx也可以工作,所以为了优化这个解决方案,他可以在片段内设置 FabCallback = null onStop
猜你喜欢
  • 1970-01-01
  • 2016-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多