在AndroidStudio中,是否可以像ListView
/RecyclerView
/等控件那样展示ViewPager
的预览布局呢?
在AndroidStudio中,是否可以像ListView
/RecyclerView
/等控件那样展示ViewPager
的预览布局呢?
简短回答:不行。
我认为你在谈论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
}
}
当我能使用它时,这对我非常有用。但是对于大多数场所来说,这并不适用。
isInEditMode
技巧。确实有一种可行的方法是使您的自定义类扩展FrameLayout,并具有作为实际ViewPager的内部视图。但是然后您必须重新实现和委托其所有方法,这非常麻烦。也许Kotlin有一种方法可以做到这一点,但是到目前为止我还不知道怎么做。或者使用反射或Kotlin Poet可能是一种解决方法。但这对我来说太冒险了。
isInEditMode
,那么它将起作用。但数据绑定适配器不在预览中运行。这是当前的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
我很乐意被证明是错误的,但在我看来,所有选项都是死胡同或太费力。
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
。
我认为这不是问题...有些布局在编码或设计时没有预览...比如TabLayout
虽然我不认为有这样的功能可以直接使用,但我使用以下解决方法来实现ViewPager的设计时预览:
<include>
,其中包含您将在ViewPager中使用的视图作为布局<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" />
希望这能对你有所帮助