如何在单个活动中使用片段中的主要活动浮动操作按钮?

Posted

技术标签:

【中文标题】如何在单个活动中使用片段中的主要活动浮动操作按钮?【英文标题】: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 替换了它。 导致了这个问题。非常感谢。 【参考方案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

以上是关于如何在单个活动中使用片段中的主要活动浮动操作按钮?的主要内容,如果未能解决你的问题,请参考以下文章

从单个按钮从多个片段中提取数据

Android:单击片段中的按钮时如何通知活动? [复制]

如何在 FAB 按钮单击时将数据从多个片段发送到单个活动

如何使用 android 活动转换为浮动操作按钮设置动画?

如何在片段中使用与活动中不同的菜单?

如何删除片段布局中的任何位置单击该单击的主活动按钮