无法在 Activity 中获取小部件 ID

Posted

技术标签:

【中文标题】无法在 Activity 中获取小部件 ID【英文标题】:Cannot get Widget ID in Activity 【发布时间】:2013-03-21 10:10:43 【问题描述】:

我是新手,这让我很头疼。我有一个带有提供程序、配置和额外活动的小部件,当您单击小部件时会调用该小部件。我需要确定活动中的小部件 ID。

在提供程序中,我将其设置为使用 .setOnClickPendingIntent 从 onUpdate 调用活动,并在意图中添加小部件 ID。当我尝试从活动中的意图获取小部件 ID 时,它始终为 0(但活动被称为正常)。我可以在配置中检索 ID,但不能在 Activity 中使用相同的代码检索。

我确信这将是一些基本的/业余的错误。感谢您的帮助!

截断代码:

提供者:

public static String ACTION_WIDGET_CLICK = "ClickWidget";


    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 
        ComponentName thisWidget = new ComponentName(context,
        HelloWidgetProvider.class);
        int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
        for (int widgetId : allWidgetIds) 
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
            Intent clickIntent = new Intent(context, test.class);
            clickIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
            clickIntent.setAction(ACTION_WIDGET_CLICK);
            PendingIntent clickPendingIntent = PendingIntent.getActivity(context, 0, clickIntent, 0);
            views.setOnClickPendingIntent(R.id.update, clickPendingIntent);
            appWidgetManager.updateAppWidget(widgetId, views);
        
    

所以在点击时,它会调用pendingIntent,它会调用由ACTION_WIDGET_CLICK定义的活动。 清单:

<activity android:name=".test">
<intent-filter>
<action
android:name="com.example.widget_create.HelloWidgetProvider.ACTION_WIDGET_CLICK"/>
</intent-filter>
</activity>

所以这称为测试活动:

public class test extends Activity 

    int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        Intent clickIntent = getIntent();
        Bundle extras = intent.getExtras();
        if (extras != null)          
            mAppWidgetId = extras.getInt(
            AppWidgetManager.EXTRA_APPWIDGET_ID,
            AppWidgetManager.INVALID_APPWIDGET_ID);
        
    

它没有收到额外信息,然后小部件 ID 被设置为 0

【问题讨论】:

看看我的回答***.com/questions/15551679/… 【参考方案1】:

你能复制/粘贴你得到的内容到控制台日志吗?

检查您的清单文件中的 android:name 标签,它必须是带有大写字母的 android:name=".Test"。

【讨论】:

它运行没有错误,它调用测试活动很好......只是我无法从该活动中获取小部件 ID【参考方案2】:

onUpdate你正在传递 IDS(ID 数组)

clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);

在您的活动中,您会询问 por ID(只有一个 ID)

mAppWidgetId = extras.getInt(
    AppWidgetManager.EXTRA_APPWIDGET_ID,
    AppWidgetManager.INVALID_APPWIDGET_ID);

当您在 for 循环遍历每个小部件 ID 时,您应该在提供者处更改意图:

clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);

注意EXTRA_APPWIDGET_IDwidgetId 值,而不是旧的appWidgetIds

【讨论】:

【参考方案3】:

如果在(例如)activity中getExtras给出了相同的值,你必须改变requestCode(可能是widgetid)

Intent clickIntent = new Intent(context,ActivityName.class);
clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,myWidgetId);
PendingIntent pendingIntent = PendingIntent.getActivity(context, myWidgetId, clickIntent,
                        PendingIntent.FLAG_UPDATE_CURRENT);
remoteViews.setOnClickPendingIntent(R.id.layout,pendingIntent);

【讨论】:

以上是关于无法在 Activity 中获取小部件 ID的主要内容,如果未能解决你的问题,请参考以下文章

从 Activity 更新 Android 小部件

Okta登录小部件获取名称和头像

在 TabbedPanel 中获取小部件/项目 ID [关闭]

将应用小部件放置在 Activity 之外的主屏幕上

Kivy:获取小部件 ID 并通过唯一属性访问小部件

无法获取小部件的高度/宽度 - gtkmm