如何在单个活动中使用片段中的主要活动浮动操作按钮?
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 替换了它。 首先您需要为您的 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以上是关于如何在单个活动中使用片段中的主要活动浮动操作按钮?的主要内容,如果未能解决你的问题,请参考以下文章