如何构建一个在拉伸时显示更多按钮的 android 小部件?
Posted
技术标签:
【中文标题】如何构建一个在拉伸时显示更多按钮的 android 小部件?【英文标题】:How to build a single android widget that when stretched, it reveals more buttons? 【发布时间】:2021-03-18 03:24:09 【问题描述】:我需要启动一个按钮小部件。一旦启动,当我拉伸宽度时,我希望能够再显示两个按钮。类似于下图。我将从小部件 [A] 开始。一旦我伸展,我希望能够看到 [B] 和 [C]。当我调整大小时,我只想显示单个小部件。我想避免构建两个不同的小部件。我尝试根据小部件宽度何时调整大小来更改其他两个按钮的可见性。
布局大小为 1 * 3 网格。当我隐藏这 2 个按钮时,我在该布局中留下了 2 个网格的空白空间。
感谢您的帮助!
覆盖 fun onAppWidgetOptionsChanged(context: Context?, appWidgetManager: AppWidgetManager?, appWidgetId: Int, newOptions: Bundle?) val remoteViews = RemoteViews(context?.packageName, R.layout.coffee_logger_widget)
val minWidth = newOptions?.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH)
val maxWidth = newOptions?.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH)
val minHeight = newOptions?.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT)
val maxHeight = newOptions?.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT)
if (minWidth != null)
if (minWidth > 100)
remoteViews.setViewVisibility(R.id.espresso_button, View.VISIBLE)
remoteViews.setViewVisibility(R.id.long_button, View.VISIBLE)
else
remoteViews.setViewVisibility(R.id.espresso_button, View.GONE)
remoteViews.setViewVisibility(R.id.long_button, View.GONE)
appWidgetManager?.updateAppWidget(appWidgetId, remoteViews)
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/widget_layout"
android:orientation="vertical"
android:gravity="center"
android:animateLayoutChanges="true"
android:layout_
android:layout_
android:background="@drawable/background"
android:padding="@dimen/widget_margin">
<TextView style="@style/WidgetButtonVerticalSpace" />
<TextView
android:id="@+id/appwidget_text"
style="@style/WidgetTextView.Big" />
<TextView
style="@style/WidgetTextView"
android:text="@string/grams" />
<TextView style="@style/WidgetButtonVerticalSpace" />
<LinearLayout
android:layout_
android:layout_
android:orientation="horizontal">
<TextView style="@style/WidgetButtonHorizontalSpace" />
<LinearLayout
android:id="@+id/ristretto_button"
style="@style/WidgetBeverageButton" >
<ImageView
style="@style/WidgetButtonImage"
android:src="@drawable/ic_ristretto" />
<TextView
style="@style/WidgetButtonText"
android:text="@string/ristretto_short" />
</LinearLayout>
<TextView style="@style/WidgetButtonHorizontalSpace" />
<LinearLayout
android:id="@+id/espresso_button"
android:visibility="gone"
style="@style/WidgetBeverageButton"
tools:visibility="visible">
<ImageView
style="@style/WidgetButtonImage"
android:src="@drawable/ic_espresso" />
<TextView
style="@style/WidgetButtonText"
android:text="@string/espresso_short" />
</LinearLayout>
<TextView style="@style/WidgetButtonHorizontalSpace" />
<LinearLayout
android:id="@+id/long_button"
android:visibility="gone"
style="@style/WidgetBeverageButton"
tools:visibility="visible">
<ImageView
style="@style/WidgetButtonImage"
android:src="@drawable/ic_long_coffee" />
<TextView
style="@style/WidgetButtonText"
android:text="@string/long_coffee_short" />
</LinearLayout>
<TextView style="@style/WidgetButtonHorizontalSpace" />
<!-- Buttons go here -->
</LinearLayout>
<TextView style="@style/WidgetButtonVerticalSpace" />
<TextView
android:id="@+id/coffee_quote"
style="@style/WidgetQuote" />
【问题讨论】:
【参考方案1】:您需要将 B 和 C 的 visibility
设置为 GONE
,这将使它们从布局中“消失”,因此它可以缩小到仅包含 A
。
顺便说一句,如果您将 animateLayoutChanges = "true"
添加到该布局的 XML 中,按钮将很好地淡入和淡出,并且布局将拉伸和收缩。您可能需要更改您制作 B
和 C
VISIBLE
或 GONE
的顺序以使其看起来正确,具体取决于您在做什么
哦,这也取决于你的布局——它需要是layout_width = "wrap_content"
,这样它就可以缩小到只包裹剩余的A
。如果您使用具有固定大小的GridLayout
,则需要在代码中更改该宽度,或使用LinearLayout
或ConstraintLayout
复制其外观。这取决于你实际在做什么!
【讨论】:
嗯,它没用。我用我正在测试的代码更新了我的原始帖子。谢谢! 您没有发布RemoteViews
的代码,所以我不得不猜测,但您正在向它传递一个布局资源 - 您是在膨胀该布局,然后在其中查找视图并设置他们在remoteViews.setVisibility
上的知名度?这与您的活动/片段显示的视图集不同,当您扩展布局时,您会创建一组全新的视图对象。如果您想影响正在显示的内容,您需要将活动/片段的view
传递给您的助手类。 animateLayoutChanges
也需要在我认为会增长/缩小的布局上!以上是关于如何构建一个在拉伸时显示更多按钮的 android 小部件?的主要内容,如果未能解决你的问题,请参考以下文章
Android sqlite数据库-如何在滚动结束时显示列表视图添加 "加载更多项目"。
Cloudinary:如何在按钮单击时显示最高分辨率的图像?
更改在 Android 中按下概览按钮时显示的 Flutter 图标