【问题标题】:Code duplication due to view binding migration由于视图绑定迁移导致的代码重复
【发布时间】:2021-09-10 01:22:41
【问题描述】:

我正在尝试从 kotlin 合成迁移到推荐的视图绑定模式。为了减少锅炉代码,我选择使用来自here 的委托方法。

现在我面临一个问题,我不知道如何以优雅的方式解决它。我有两个相似的布局,它们仅与几个视图不同。例如,假设layout_alayout_b

    <!-- This is just an example (layout_a) ! -->
    <LinearLayout>
        <TextView
            android:id="@+id/commonView1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

        <TextView
            android:id="@+id/commonView2"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </LinearLayout>
    <!-- This is just an example (layout_b) ! -->
    <LinearLayout>

        <TextView
            android:id="@+id/commonView1"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

        <TextView
            android:id="@+id/commonView2"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

        <TextView
            android:id="@+id/specialView1"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>

由于我不想在我的应用程序中为这些TextViews 编写文本设置器逻辑两次,因此我创建了一个额外的单例类,它通过view 对象精确映射这些常见视图。多亏了 kotlin 合成,当我使用相同的 id(如 commonView1commonView2)时,我能够引用这些视图。因为现在我必须使用绑定对象(在这种情况下是 LayoutABinding 和 LayoutBBinding)我不能这样做。

当然,我可以通过编程方式更改specialView1 的可见性并将这两种布局合并为一个,但这种重复的原因是性能和内存效率。当然以上只是一个例子,在我的原始应用程序中,我有更多的视图会被不必要地渲染并浪费内存空间。

一种可能的解决方法是在这些特殊情况下使用 findViewById,这有点 IMO。

有没有办法抽象出这些绑定?

【问题讨论】:

  • 你能分享你额外的单例类来展示你试图用数据绑定重新创建什么吗?

标签: android kotlin android-layout android-view android-viewbinding


【解决方案1】:

您可以创建一个包含通用视图的自定义视图,这样您将拥有一个绑定类。

另一种方法是使用&lt;include&gt; 将公共视图包含到两种布局中。

【讨论】:

  • 这仍然会渲染/填充不必要的视图并影响堆使用。 include 标签还会在顶部添加一个额外的容器布局,这不是我想要的。
  • 您可以使用merge 标签来使用单独的布局,而不需要新的容器。虽然我不知道视图绑定是否知道如何处理。
  • @ShlomiKatriel 是对的。为避免出现其他级别的嵌套,您可以将merge 标记用于共享布局。要使合并布局中的编辑更容易,请参阅tools:parentTag。在包含标签中,您可以仅使用合并布局的变量名称来传递绑定值,例如binding:myBindingVar="@{...}"
【解决方案2】:

对于这种情况,您可以使用 ViewStubViewStub 在你调用它之前不会膨胀视图。这将解决您的性能问题。

有两个 ViewStub 并在运行时扩充存根。您可以绑定膨胀视图Like this。拥有 Binding 对象后,您可以直接访问视图。只需将数据对象传递给 Binding 即可在文本视图上显示数据。您在该单例中的任何逻辑都可以与 DataBinding 一起使用。

【讨论】:

    猜你喜欢
    • 2011-09-04
    • 2020-12-10
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 2015-01-25
    • 1970-01-01
    相关资源
    最近更新 更多