【问题标题】:How to catch widget size changes on devices where onAppWidgetOptionsChanged not getting called?如何在未调用 onAppWidgetOptionsChanged 的​​设备上捕获小部件大小变化?
【发布时间】:2013-07-01 00:20:01
【问题描述】:

使用 Android 4.1.2 的三星 Galaxy S3 等设备存在一个错误,该错误会阻止调用 onAppWidgetOptionsChanged。

那么,我们如何才能获得与尺寸变化相关的信息?

【问题讨论】:

    标签: android android-widget


    【解决方案1】:

    我在 Frankish 的回答中添加了我如何处理接收此广播:

    @Override
    public void onReceive(Context context, Intent intent) {
        // Handle TouchWiz
        if(intent.getAction().contentEquals("com.sec.android.widgetapp.APPWIDGET_RESIZE")) {
            handleTouchWiz(context, intent);
        }
        super.onReceive(context, intent);
    }
    
    private void handleTouchWiz(Context context, Intent intent) {
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    
        int appWidgetId = intent.getIntExtra("widgetId", 0);
        int widgetSpanX = intent.getIntExtra("widgetspanx", 0);
        int widgetSpanY = intent.getIntExtra("widgetspany", 0);
    
        if(appWidgetId > 0 && widgetSpanX > 0 && widgetSpanY > 0) {
            Bundle newOptions = new Bundle();
            // We have to convert these numbers for future use
            newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT, widgetSpanY * 74);
            newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH, widgetSpanX * 74);
    
            onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions);
        }
    }
    

    如果您使用的是 MAX_HEIGHT 或 MAX_WIDTH 而我不是,您可能需要更改处理该捆绑包的方式。

    【讨论】:

    • 既然你是处理动作的人,在这种情况下你不应该避免调用“super.onReceive”吗?
    • 有人知道这是否仍然相关吗?它与哪个 API 级别相关?
    【解决方案2】:

    我发现你可以在 onReceive 函数中捕捉 RESIZE 动作。

    if(intent.getAction().contentEquals("com.sec.android.widgetapp.APPWIDGET_RESIZE"))
    

    您将从这个意图的 getExtras() 包中获得以下值:

    int appWidgetId = bundle.getInt("widgetId"); // bundle.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
    
    
    int widgetSpanX = bundle.getInt("widgetspanx", 4);
    int widgetSpanY = bundle.getInt("widgetspany", 1);
    

    现在您可以使用这些值来更新视图或将它们存储在静态整数映射变量中以在下一次 onUpdate 中使用。

    【讨论】:

    • “或将它们存储在静态整数映射变量中”——这将是不可靠的,因为您的进程可以在 com.sec.android.widgetapp.APPWIDGET_RESIZE 广播和任何后续的 onUpdate() 调用之间终止。现在,三星修改后的代码可能会在com.sec.android.widgetapp.APPWIDGET_RESIZE 之后不久触发onUpdate(),在这种情况下静态数据成员可能在实践中起作用。
    • @CommonsWare 谢谢你,你可能是对的。它不会自动触发 onUpdate,因此如果新大小与我存储在静态变量中的大小不同,我会广播更新。对于静态变量:App 会自动启动调用 onReceive,所以它会一直设置那个静态变量。如果它在那一点被杀死,它可能是由崩溃引起的,无论如何它不应该崩溃..否则我们可能不会更新小部件。我错过了什么吗? :|顺便说一句,如果我们不在乎大小是否相同,我们总是可以从 onreceive 函数直接更新。
    猜你喜欢
    • 2013-09-02
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多