如何构建一个在拉伸时显示更多按钮的 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 中,按钮将很好地淡入和淡出,并且布局将拉伸和收缩。您可能需要更改您制作 BC VISIBLEGONE 的顺序以使其看起来正确,具体取决于您在做什么

哦,这也取决于你的布局——它需要是layout_width = "wrap_content",这样它就可以缩小到只包裹剩余的A。如果您使用具有固定大小的GridLayout,则需要在代码中更改该宽度,或使用LinearLayoutConstraintLayout 复制其外观。这取决于你实际在做什么!

【讨论】:

嗯,它没用。我用我正在测试的代码更新了我的原始帖子。谢谢! 您没有发布RemoteViews 的代码,所以我不得不猜测,但您正在向它传递一个布局资源 - 您是在膨胀该布局,然后在其中查找视图并设置他们在remoteViews.setVisibility 上的知名度?这与您的活动/片段显示的视图集不同,当您扩展布局时,您会创建一组全新的视图对象。如果您想影响正在显示的内容,您需要将活动/片段的view 传递给您的助手类。 animateLayoutChanges 也需要在我认为会增长/缩小的布局上!

以上是关于如何构建一个在拉伸时显示更多按钮的 android 小部件?的主要内容,如果未能解决你的问题,请参考以下文章

Android sqlite数据库-如何在滚动结束时显示列表视图添加 "加载更多项目"。

Cloudinary:如何在按钮单击时显示最高分辨率的图像?

引导按钮单击时显示蓝色轮廓

更改在 Android 中按下概览按钮时显示的 Flutter 图标

Android - 按下时显示上次查看的活动(主页按钮 - >应用程序快捷方式)

如何制作点击按钮时显示的加载动画?它应该占据全屏并且应该从右到左并消失