如何从小部件启动配置活动?

3
在整个互联网上都没有关于这个问题的答案,我找不到。我在搜索中度过了一整天,所以我开始想,可能没有人知道。
我是stackoverflow的新手,英语不是我的母语。所以,请原谅我的糟糕英语。
好的,这里有一个问题。我正在创建一个带有2个按钮的简单小部件。其中一个按钮可以通过单击来启动config.activity。 我该怎么做呢? 我尝试使用Intent,就像这样:
 Intent i = new Intent(context, ConfigActivity.class);
 i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 context.startActivity(i);

但是当我接收到意图操作时,我看到下面的情况:config.activity 快速启动并关闭,因为 appWidgetId 无效。

如何从小部件启动配置活动?

2个回答

1
如果您正在从Provider类进行更新,则可以从onUpdate()方法中获取小部件ID,如下所示:
final int N = appWidgetIds.length;
for (int i=0; i<N; i++) {
   int appWidgetId = appWidgetIds[i];
}

如果你要从 ConfigurationActivity 更新小部件,可以在 onCreate 方法中获取小部件的 id,方法如下:
    Intent intent = getIntent();
    Bundle extras = intent.getExtras();
    if (extras != null) {
        mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
    }

让您的小部件从小部件布局中的按钮/图像视图启动ConfigurationActivity

    // Create intent pointing to ConfigurationActivity, in this example we are at ConfigurationActivity
    Intent configurationIntent = new Intent(WidgetBarConfiguration.this, WidgetBarConfiguration.class);
    // Create a extra giving the App Widget Id
    configurationIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
    // Create a pending intent giving configurationIntent as parameter
    PendingIntent configurationPendingIntent = PendingIntent.getActivity(WidgetBarConfiguration.this, 0, configurationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    // Here we fecth the layout item and give it a action
    RemoteViews views = new RemoteViews(WidgetBarConfiguration.this.getPackageName(), R.layout.widget_bar_layout);
    // Setting onClick event that will lauch ConfigurationActivity
    views.setOnClickPendingIntent(R.id.imageViewSettings, configurationPendingIntent);
    // Updating widget
    mWidgetManager.updateAppWidget(mAppWidgetId, views);
    Intent resultValue = new Intent();
    resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
    setResult(RESULT_OK, resultValue);
    finish();

AndroidManifest.xml

<activity
            android:name=".WidgetBarConfiguration"
            android:label="@string/title_activity_widget_configuration"
            android:launchMode="singleInstance"
            android:theme="@style/AppTheme.NoActionBar" >
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
            </intent-filter>
        </activity>

看到lauchMode = "singleInstance",可以确保只有ConfigurationActivity的布局在点击时出现,没有其他活动布局附加。

0

你可以使用这段代码

        RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
        Intent launchActivity = new Intent(context, ConfigActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, launchActivity, 0);
        titles.setOnClickPendingIntent(R.id.Button, pendingIntent);
        ComponentName thisWidget = new ComponentName(context, Widget.class);
        AppWidgetManager manager = AppWidgetManager.getInstance(context);
        manager.updateAppWidget(thisWidget, rv);

抱歉,我不明白它必须放在哪里?而且我认为您的代码有误或者代码不完整。还有一点需要注意:它必须将WidgetID发送到configurity activity中,因为配置活动只接收并检查其是否有效,之后返回结果OK或Canceled。 - Trancer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接