Android Studio中的ViewPager预览布局

52

AndroidStudio中,是否可以像ListView/RecyclerView/等控件那样展示ViewPager的预览布局呢?


我认为那是不可能的。 - DaveAAA
1
不是重复的,因为相同的解决方案不会起作用。 - Fabio
5个回答

7

简短回答:不行。

我认为你在谈论ViewPager 2的ViewPager。我的回答将假设使用ViewPager 2。请更新问题以澄清。

- 解决方法:隐藏包含

<include 
            android:visibility="gone"
            tools:visibility="visible"
            layout="@layout/item_that_shows_inside_viewholder"/>

我同意这是一种非常糟糕的做法。

如果在约束布局中,您可以宽松地匹配相同的约束条件,使其显示在顶部。是的,在生产代码中膨胀它可能会导致性能下降,具体取决于您那里的情况。

非常遗憾,tools:layout不存在或无法正常工作(是的,在尝试时我得到了不一致的结果)。

- 第二个较好的方法是在父类代码上使用isInEditMode

可以使用如下代码:

class CustomView ....
init {
    // inflate layout that contains ViewPager
    if ( isInEditMode() ) {
      //do something that replaces ViewPager with its inflated view holder
    } 
}

当我能使用它时,这对我非常有用。但是对于大多数场所来说,这并不适用。

- 如果ViewPager不是final的,我们可以扩展它并使用像上面那样的isInEditMode技巧。

- 您可以创建一个带有ViewPager内部字段的自定义类包装器。

确实有一种可行的方法是使您的自定义类扩展FrameLayout,并具有作为实际ViewPager的内部视图。但是然后您必须重新实现和委托其所有方法,这非常麻烦。也许Kotlin有一种方法可以做到这一点,但是到目前为止我还不知道怎么做。或者使用反射或Kotlin Poet可能是一种解决方法。但这对我来说太冒险了。

- 如果我们可以制作一个数据绑定适配器来执行像上面的isInEditMode,那么它将起作用。但数据绑定适配器不在预览中运行。

- 我倾向于认为这些工具属性由Android Studio处理,因此可能需要一个Android Studio插件来解决它。

这是当前的tools属性完整列表:https://developer.android.com/studio/write/tool-attributes.html#toolslistitem_toolslistheader_toolslistfooter

阅读这篇文章可能会有所帮助:Android XML Is there a way to use the tool namespace with custom attributes?

其中提到了一个用于读取具有工具的自定义属性的库。也许这个库有另一种选择,但我从未使用过,也不确定它如何工作:https://github.com/giljulio/sneakpeek

我很乐意被证明是错误的,但在我看来,所有选项都是死胡同或太费力。


0
在 Andriod studio 中,一些视图在运行时显示出来,但编译时却没有。把 Frame Layout 当作片段事务的 容器 来考虑。我们可以在运行时将任何类型的视图放置在该容器中。因此,在编码时不可能显示一个视图。在这里,viewpager 扮演了同样的角色。因此,在运行并实际放置片段/其他视图之前,我们无法在那里显示视图。
我希望现在你清楚了。 :)

0
这是可能的,当将 ViewPager 放入它自己的 XML 布局资源中时。
这样一来,就可以显示所需的 Fragment 而不是 ViewPager
<fragment
    android:id="@+id/fragment_viewpager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout="@layout/fragment_viewpager"
    tools:layout="@layout/fragment_preview" />

这还为navigation图形设计视图提供了XML预览。

tools:layout仅适用于fragment,而不适用于include


-1

我认为这不是问题...有些布局在编码或设计时没有预览...比如TabLayout


-5

虽然我不认为有这样的功能可以直接使用,但我使用以下解决方法来实现ViewPager的设计时预览:

  1. 在ViewPager本身之后添加一个<include>,其中包含您将在ViewPager中使用的视图作为布局
  2. 将tools:visibility="visible"和android:visibility="gone"设置为此<include>视图,以便在设计时可见但在运行时不可见。还将tools:visibility="gone"设置为ViewPager,以便在设计时不可见。

这个想法是在设计时隐藏ViewPager并显示其内容,而在运行时则相反。这对其他控件也适用。

举个例子:

<androidx.viewpager.widget.ViewPager
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layout_constraintTop_toBottomOf="@id/tabl1"
    tools:visibility="gone">
</androidx.viewpager.widget.ViewPager>

<include
    layout="@layout/fragment_example1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:visibility="gone"
    tools:visibility="visible"
    app:layout_constraintTop_toBottomOf="@id/tabl1" />

希望这能对你有所帮助


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接