【问题标题】:Correctly styling Android Home Widget size正确设置 Android Home Widget 大小的样式
【发布时间】:2021-05-14 08:45:26
【问题描述】:

我尝试根据用户将小部件扩展到多少行,在我的主页小部件中显示最多三个元素。

所以每个元素的高度应该是一行的高度。主要目标是让它在每台设备上看起来都正确。

这是我的布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@drawable/shape_roundedcorners_white">

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/article1"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:orientation="horizontal"
        android:layout_margin="@dimen/widget_margin"
        android:background="#0000ff">

        <ImageView
            android:id="@+id/article1img"
            android:layout_width="35dp"
            android:layout_height="35dp"
            android:gravity="center"
            android:layout_gravity="center"
            android:layout_marginRight="15dp"
            android:layout_marginLeft="10dp"
            android:src="@drawable/ic_notifications" />

        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:layout_margin="@dimen/inner_widget_margin">

            <TextView
                android:id="@+id/article1Title"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:contentDescription="@string/appwidget_text"
                android:gravity="left"
                android:text="@string/appwidget_title"
                android:textColor="#000000"
                android:textSize="14sp"
                android:textStyle="bold"/>
            <TextView
                android:id="@+id/article1Text"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:contentDescription="@string/appwidget_text"
                android:gravity="left"
                android:text="@string/appwidget_text"
                android:textColor="#000000"
                android:textSize="12sp"/>
        </LinearLayout>

    </LinearLayout>


    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/divider"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:orientation="vertical"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        style="@style/Divider">
        <!--<View style="@style/Divider"/>-->
    </LinearLayout>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/article2"
        android:layout_width="match_parent"
        android:layout_height="85dp"
        android:orientation="horizontal"
        android:layout_margin="@dimen/widget_margin"
        android:background="#ffffff">

        <ImageView
            android:id="@+id/article2img"
            android:layout_width="40dp"
            android:layout_height="35dp"
            android:gravity="center"
            android:layout_gravity="center"
            android:layout_marginRight="15dp"
            android:layout_marginLeft="10dp"
            android:src="@drawable/ic_notifications" />

        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="35pt"
            android:orientation="vertical"
            android:layout_margin="@dimen/inner_widget_margin"
            android:background="#ffffff">
            <TextView
                android:id="@+id/article2Title"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:contentDescription="@string/appwidget_text"
                android:gravity="left"
                android:text="@string/appwidget_title"
                android:textColor="#000000"
                android:textSize="14sp"
                android:textStyle="bold"/>
            <TextView
                android:id="@+id/article2Text"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:contentDescription="@string/appwidget_text"
                android:gravity="left"
                android:text="@string/appwidget_text"
                android:textColor="#000000"
                android:textSize="12sp"/>
        </LinearLayout>
    </LinearLayout>


    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/divider"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:orientation="vertical"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        style="@style/Divider">
        <!--<View style="@style/Divider"/>-->
    </LinearLayout>


    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/article3"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:orientation="horizontal"
        android:layout_margin="@dimen/widget_margin"
        android:background="#ffffff">

        <ImageView
            android:id="@+id/article3img"
            android:layout_width="35dp"
            android:layout_height="35dp"
            android:gravity="center"
            android:layout_gravity="center"
            android:layout_marginRight="15dp"
            android:layout_marginLeft="10dp"
            android:src="@drawable/ic_notifications" />

        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="35pt"
            android:orientation="vertical"
            android:layout_margin="@dimen/inner_widget_margin"
            android:background="#ffffff">
            <TextView
                android:id="@+id/article3Title"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:contentDescription="@string/appwidget_text"
                android:gravity="left"
                android:text="@string/appwidget_title"
                android:textColor="#000000"
                android:textSize="14sp"
                android:textStyle="bold"/>
            <TextView
                android:id="@+id/article3Text"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:contentDescription="@string/appwidget_text"
                android:gravity="left"
                android:text="@string/appwidget_text"
                android:textColor="#000000"
                android:textSize="12sp"/>
        </LinearLayout>
    </LinearLayout>
</LinearLayout>

<dimen name="widget_margin">8dp</dimen>
<dimen name="inner_widget_margin">2dp</dimen>

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid
        android:color="#ffffff"/>
    <corners
        android:radius="12dp"/>
</shape>

我读到here 说一行的高度应该是40dp 这就是为什么我将我的article1 - 布局设置为 40dp 并将我的信息设置为

<appwidget-provider
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialKeyguardLayout="@layout/news_widget"
    android:initialLayout="@layout/news_widget"
    android:minHeight="40dp"
    android:minWidth="300dp"
    android:previewImage="@android:drawable/ic_menu_add"
    android:resizeMode="horizontal|vertical"
    android:updatePeriodMillis="2700000"
    android:widgetCategory="home_screen">
</appwidget-provider>

但是我得到的结果是这样的,在 minHeight 上有小部件:

很明显,我的布局中一个元素的高度与屏幕上一个网格行的高度有很大不同。

我做错了什么或者解决我的问题的规范方法是什么?

【问题讨论】:

    标签: android android-widget


    【解决方案1】:

    minHeightminWidth 是提示和建议,而不是要求。有数百个带有主屏幕的启动器,不需要任何一个来实现您想要的值或支持那么小的高度。您要求的尺寸大约为 8:1 纵横比;你得到的实际尺寸接近 3:1。

    您的AppWidgetProvider 子类可以覆盖onAppWidgetOptionsChanged() 并检查提供的Bundle 以了解应用小部件的实际大小。不能保证每个主屏幕都会调用它,但这是您最好的选择。 AppWidgetManager 上有 OPTION_APPWIDGET_ 键,可以在 Bundle 中。对于一个名为newOptionsBundle参数,可以尝试访问:

    • newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH)
    • newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH)
    • newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT)
    • newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT)

    这些将是dp 中的值。

    从那里,您可以使用AppWidgetManager 发送一个新的RemoteViews,该RemoteViews 可能更适合主屏幕上显示的应用小部件的大小。

    This old sample project 演示了这一点,应用小部件显示了自己的大小范围。

    【讨论】:

    • 谢谢!究竟是什么意思最小/最大值。这真的可以帮助我将小部件内容调整为正确的大小吗?我如何知道我应该将内容调整为最小还是最大?
    • 我也不确定如何更改我的 LinearLayouts 的高度。文档说在 Android 12 之前使用LayoutParams.height,但我不知道如何使用。
    • @progNewbie:“最小/最大值到底是什么意思”——这意味着您的应用小部件的实际大小在由宽度和高度的最小值和最大值指定的范围内。 “我怎么知道我应该将内容调整为最小还是最大?” -- 这将是你的平面设计师的问题。
    • 好的,所以不能真正知道确切的大小:/ 你知道我可以如何设置 RemoteViews 的大小吗?
    • @progNewbie: AFAIK,实际上,RemoteViews 本身类似于设置为match_parent/match_parent 大小的父容器,以填充RemoteViews 应用于的任何空间(应用小部件、自定义Notification 等)。
    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    相关资源
    最近更新 更多