我开始使用 ViewBinding。在搜索了一些示例或建议后,如何将 ViewBinding 与抽象基类一起使用,该抽象基类应该处理预期出现在每个孩子的布局中的视图的相同逻辑,我最终在这里发布了这个问题。
场景:
我有一个基类public abstract class BaseFragment。有多个 Fragment 扩展了这个基类。这些 Fragment 具有从基类实现(使用 "old" findViewById())处理的公共视图。例如,每个片段的布局都应该包含一个 ID 为 text_title 的 TextView。这是从BaseFragment's处理它的方式onViewCreated():
TextView title = view.findViewById(R.id.text_title);
// Do something with the view from the base class
Run Code Online (Sandbox Code Playgroud)
现在 ViewBinding-API 为每个子片段生成绑定类。我可以使用绑定引用视图。但是我不能使用基类中的具体绑定。即使在基类中引入泛型,也有太多类型的片段绑定,我现在放弃了这个解决方案。
从抽象基类处理绑定视图的推荐方法是什么?是否有最佳实践?没有在 API 中找到内置机制来优雅地处理这种情况。
当期望子片段包含公共视图时,我可以提供抽象方法,这些方法从片段的具体绑定中返回视图,并使它们可以从基类访问。(例如protected abstract TextView getTitleView();)。但这是一个优势而不是使用findViewById()吗?你怎么认为?任何其他(更好的)解决方案?请让我们开始一些讨论。
从Android支持库升级23.1.1到最新后,我们的应用程序中25.1.0的行为popBackStack()发生了变化.
例如,我FragmentTransactions在BackStack上有三个.现在第四个FragmentTrsansaction被添加到BackStack.FragmentTransactions是这样的:
FragmentTransaction transaction = fragmentManager.beginTransaction()
.replace(R.id.fragment_container_single, target, CoreActivity.FRAGMENT_TAG_LEFT)
.addToBackStack(<CONCRETE_TRANSACTION_NAME>)
.commit();
Run Code Online (Sandbox Code Playgroud)
片段#4具有逻辑,它onViewCreated()自动路由到片段#5 (我知道,它很难看,我必须改变它).无论如何,当我想要离开片段#5时,我想恢复到片段#4之前显示的片段.我按事务名称执行此操作:
getFragmentManager().popBackStack(“<CONCRETE_TRANSACTION_NAME_4>”, FragmentManager.POP_BACK_STACK_INCLUSIVE);
Run Code Online (Sandbox Code Playgroud)
或这个:
getFragmentManager().popBackStack(“<CONCRETE_TRANSACTION_NAME_3>”, 0);
Run Code Online (Sandbox Code Playgroud)
但与此调用onCreateView()和onViewCreated()碎片#4将被调用和片段#5将被立即添加到堆栈中.即使我恢复到片段#1 onViewCreated()为BackStack上的每个片段调用 - 对于片段#2,片段#3和片段#4,即使它们对我想要返回的FragmentTransaction无关紧要.
在支持库下,23.1.1我成功地跳回到片段#3.片段#4弹出包含而不调用onViewCreated().这似乎更直观,对我来说,因为onViewCreated()在FragmentTransaction"外部" 调用Fragments似乎没有必要吗?
我知道,addToBackStack()只保存事务状态而不是片段本身,并且可能必须重新创建片段.
有相似的帖子,但我想了解为什么它在支持库更新后中断.我无法在任何地方找到变化.这是一个Bug还是现在的Bug?
我正在改变我的代码.
感谢帮助!
更新 升级到support-library 25.1.0后,我有更多生命周期问题/更改.还有一个谷歌问题我另外评论了我的问题.目前我不得不回到最新的24.2.1并密切关注这个话题.这只是我的临时解决方案.这些问题始于support-library 25.0.0.
android android-fragments back-stack android-support-library