Android Studio中的ViewPager预览布局

51 人关注

是否有可能在 ViewPager 中显示预览版面? 安卓工作室 like in ListView / RecyclerView /etc.?

3 个评论
我认为这是不可能的
不是重复的,因为同样的解决方案不会起作用。
android
android-layout
android-studio
android-viewpager
Daniel H.
Daniel H.
发布于 2015-10-27
5 个回答
Fabio
Fabio
发布于 2019-10-24
已采纳
0 人赞同

简短的回答。没有。

我想你说的是ViewPager 2中的ViewPager。我的答案将是假设ViewPager 2。请更新问题以澄清这一点。

- Workaround: a hidden include

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

而且我同意这是一个非常糟糕的方法。 如果在约束布局中,你可以松散地匹配相同的约束,使其显示在上面。是的,你会在生产代码中膨胀这个,所以你可能会招致性能下降,这取决于你有什么。

非常不幸的是,tools:layout不存在,也不能正常工作(是的,我在尝试时得到了不一致的结果)。

- 2nd less worst way is using isInEditMode on code on the parent class

时尚的东西

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

当我可以使用时,这对我来说很有帮助。然而,这对大多数地方来说是不合适的。

- If at least ViewPager were not final we could extend and do some tricks there using isInEditMode like above.

- You can make a custom class wrapper with internal field ViewPager

有一种方法确实可行,那就是让你的自定义类扩展FrameLayout,并有一个内部视图作为你真正的ViewPager。但是,你必须重新实现和委托它的所有方法,这是一个很大的痛苦。也许kotlin有办法做到这一点,但到目前为止我还不知道怎么做。或者,使用反射或kotlin poet也是一种方法。这对我来说太冒险了。

- If we could make a databinding adapter to do the isInEditMode like above it would work. But databinding adapters don't run in preview.

- I tend to think these tools attributes get processed by Android Studio, so it would take probably an android studio plugin to work around it.

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

阅读以下内容可能会有所帮助Android XML 是否有办法使用带有自定义属性的工具命名空间?

其中提到了一个可以用工具读取自定义属性的库。这个库可能有一个替代品,但我从来没有用过它,不知道它是如何工作的。 https://github.com/giljulio/sneakpeek

我很想证明自己是错的,但在我看来,所有的选择都是死胡同,或者太费劲了。

Arhan Ashik
Arhan Ashik
发布于 2019-10-24
0 人赞同

在Andriod studio中,有些视图在运行时显示,但在编译时不显示。思考一下 框架布局 作为一个 容器 for fragment transaction. We may place any kind of views on that 容器 in run time. So, it's not possible to show a view while coding. The 视图器 在这里扮演着同样的角色。所以,在运行和实际放置一个片段/其他视图之前,我们不能在那里显示一个视图。

我希望你现在明白了。)

Martin Zeitler
Martin Zeitler
发布于 2019-10-24
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:布局 only works with fragment, but not with include.

S.Aslpour
S.Aslpour
发布于 2019-10-24
0 人赞同

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

MelOS
MelOS
发布于 2019-10-24
0 人赞同

虽然我不认为开箱就有这样的功能,但我使用了以下工作方法来实现ViewPager的设计时间预览。

  • Add an <include> with the view that you will use in your ViewPager as a layout,just after the ViewPager itself
  • Set tools:visibility="visible" and android:visibility="gone" to this <include> view so that it will be visible at design time but not at runtime. Also set tools:visibility="gone" to the ViewPager so that it will be invisible at design time.
  • 我们的想法是在设计时隐藏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"