【问题标题】:How can I resize a widget on an android application by using AppWidgetHostView?如何使用 AppWidgetHostView 在 android 应用程序上调整小部件的大小?
【发布时间】:2018-11-14 15:21:30
【问题描述】:

我创建了一个具有小部件的应用程序。我想调整小部件的大小,但它不起作用。 小部件大小在 w/ 和 w/o 之间不会改变 widgetView.updateAppWidgetSize(options, 100, 100, 200, 200)。为什么 updateAppWidgetSize 不起作用?如何更改小部件大小?

主活动:

class MainActivity : AppCompatActivity() {

    private lateinit var appWidgetManager: AppWidgetManager
    private lateinit var appWidegetHost: AppWidgetHost

    private val REQUEST_BIND_APPWIDGET = 1

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        appWidgetManager = AppWidgetManager.getInstance(this)
        appWidegetHost = AppWidgetHost(this, 12345).apply {
            startListening()
        }

        val appWidgetId = appWidegetHost.allocateAppWidgetId()
        val appWidgetInfo = appWidgetManager.installedProviders.get(5)

        if (appWidgetManager.bindAppWidgetIdIfAllowed(appWidgetId, appWidgetInfo.provider)) {
            addAppWidget(appWidgetId, appWidgetInfo)
        } else {
            val intent = Intent(AppWidgetManager.ACTION_APPWIDGET_BIND)
            intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
            intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, appWidgetInfo.provider);
            startActivityForResult(intent, REQUEST_BIND_APPWIDGET)
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (resultCode == RESULT_OK) {
            if (requestCode == REQUEST_BIND_APPWIDGET) {
                val appWidgetId = data!!.getIntExtra(
                    AppWidgetManager.EXTRA_APPWIDGET_ID,
                    AppWidgetManager.INVALID_APPWIDGET_ID
                )
                if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {
                    val appWidgetInfo = appWidgetManager.getAppWidgetInfo(appWidgetId)
                    addAppWidget(appWidgetId, appWidgetInfo)
                }
            }
        } else { }
    }

    override fun onStop() {
        super.onStop()
        appWidegetHost.stopListening()
    }

    private fun addAppWidget(appWidgetId: Int, appWidgetInfo: AppWidgetProviderInfo) {
        val widgetView = appWidegetHost.createView(this, appWidgetId, appWidgetInfo)
        val options = appWidgetManager.getAppWidgetOptions(appWidgetId)
        widgetView.updateAppWidgetSize(options, 100, 100, 200, 200)
        widgetView.setAppWidget(appWidgetId, appWidgetInfo)
        widgets.addView(widgetView)
    }
}

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/black"
        tools:context=".MainActivity" android:orientation="vertical">

        <LinearLayout
                android:orientation="horizontal"
                android:layout_width="match_parent"
                android:layout_height="match_parent"     
                android:id="@+id/widgets">
        </LinearLayout>

 </LinearLayout>

【问题讨论】:

    标签: android android-appwidget android-appwidget-list


    【解决方案1】:

    updateAppWidgetSize() 方法只影响最小和最大维度,不影响当前维度。

    要更改小部件的大小,请通过修改 LayoutParams 来像任何其他视图一样进行操作:

    widgetView.layoutParams = widgetView.layoutParams.apply {
        width = /* your width */
        height = /* your height */
    }
    

    【讨论】:

    • @kenjn04;它也发生在你身上,当你插入小部件时,它会占用高度和宽度的所有空间吗?你是怎么解决的?你要多大码的?我试过这样: ViewGroup.LayoutParams lp = widgetLayout.getLayoutParams (); lp.height = newAppWidgetProviderInfo.minHeight; lp.width = newAppWidgetProviderInfo.minWidth; hostView.requestLayout();但它似乎无法正常工作。
    • @Paul:目前我正在这样做。cellX 和 cellY 是根据developer.android.com/guide/practices/ui_guidelines/… val cellX = ((appWidgetInfo.minWidth / density + 30 ) / 70).toInt() val cellY = ((appWidgetInfo.minHeight / density + 30) / 70).toInt() val width= (cellX * CELL_SIZE_PX * density).toInt() val height = (cellY * CELL_SIZE_PX * density).toInt() hostView.layoutParams = ViewGroup.LayoutParams(width, height) hostView.requestLayout()
    猜你喜欢
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 2012-10-04
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2021-04-30
    相关资源
    最近更新 更多