Я создал простой пример виджета и простую конфигурационную активность для него. Мне нужно вызвать активность конфигурации для каждого экземпляра виджета после того, как пользователь нажимает на widets. Каждый экземпляр должен иметь отдельные настройки, и после щелчка, активность конфигурации должна быть заполнена настройками, полученными из этого конкретного экземпляра, используемого для вызова диалогового окна конфигурации, что позволяет изменять настройки только для этого конкретного экземпляра (другой существующий виджет не должен оставаться нетронутым).Несколько экземпляров виджета - необходимо обновлять каждый экземпляр отдельно
Итак, мой код виджета:
package com.example.michal.widgettest2;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;
/**
* Implementation of App Widget functionality.
* App Widget Configuration implemented in {@link MyWidgetConfigureActivity MyWidgetConfigureActivity}
*/
public class MyWidget extends AppWidgetProvider
{
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
{
// There may be multiple widgets active, so update all of them
final int N = appWidgetIds.length;
for (int i = 0; i < N; i++)
{
int appWidgetId = appWidgetIds[i];
Intent intent = new Intent(context, MyWidgetConfigureActivity.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,appWidgetId);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.my_widget);
views.setOnClickPendingIntent(R.id.widget_container, pendingIntent);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
@Override
public void onDeleted(Context context, int[] appWidgetIds)
{
// When the user deletes the widget, delete the preference associated with it.
final int N = appWidgetIds.length;
for (int i = 0; i < N; i++)
{
MyWidgetConfigureActivity.deleteTitlePref(context, appWidgetIds[i]);
}
}
@Override
public void onEnabled(Context context)
{
// Enter relevant functionality for when the first widget is created
}
@Override
public void onDisabled(Context context)
{
// Enter relevant functionality for when the last widget is disabled
}
static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
int appWidgetId)
{
CharSequence widgetText = MyWidgetConfigureActivity.loadTitlePref(context, appWidgetId);
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.my_widget);
views.setTextViewText(R.id.appwidget_text, widgetText);
Intent intent = new Intent(context, MyWidgetConfigureActivity.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,appWidgetId);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
views.setOnClickPendingIntent(R.id.widget_container, pendingIntent);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
Мой конфиг код вида деятельности:
package com.example.michal.widgettest2;
import android.app.Activity;
import android.appwidget.AppWidgetManager;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
/**
* The configuration screen for the {@link MyWidget MyWidget} AppWidget.
*/
public class MyWidgetConfigureActivity extends Activity
{
int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
EditText mAppWidgetText;
private static final String PREFS_NAME = "com.example.michal.widgettest2.MyWidget";
private static final String PREF_PREFIX_KEY = "appwidget_";
public MyWidgetConfigureActivity()
{
super();
}
@Override
public void onCreate(Bundle icicle)
{
super.onCreate(icicle);
// Set the result to CANCELED. This will cause the widget host to cancel
// out of the widget placement if the user presses the back button.
setResult(RESULT_CANCELED);
setContentView(R.layout.my_widget_configure);
mAppWidgetText = (EditText) findViewById(R.id.appwidget_text);
findViewById(R.id.add_button).setOnClickListener(mOnClickListener);
// Find the widget id from the intent.
Intent intent = getIntent();
Bundle extras = intent.getExtras();
if (extras != null)
{
mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
}
// If this activity was started with an intent without an app widget ID, finish with an error.
if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID)
{
finish();
return;
}
mAppWidgetText.setText(loadTitlePref(MyWidgetConfigureActivity.this, mAppWidgetId));
}
View.OnClickListener mOnClickListener = new View.OnClickListener()
{
public void onClick(View v)
{
final Context context = MyWidgetConfigureActivity.this;
// When the button is clicked, store the string locally
String widgetText = mAppWidgetText.getText().toString();
saveTitlePref(context, mAppWidgetId, widgetText);
// It is the responsibility of the configuration activity to update the app widget
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
MyWidget.updateAppWidget(context, appWidgetManager, mAppWidgetId);
// Make sure we pass back the original appWidgetId
Intent resultValue = new Intent();
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
setResult(RESULT_OK, resultValue);
finish();
}
};
// Write the prefix to the SharedPreferences object for this widget
static void saveTitlePref(Context context, int appWidgetId, String text)
{
SharedPreferences.Editor prefs = context.getSharedPreferences(PREFS_NAME, 0).edit();
prefs.putString(PREF_PREFIX_KEY + appWidgetId, text);
prefs.commit();
}
// Read the prefix from the SharedPreferences object for this widget.
// If there is no preference saved, get the default from a resource
static String loadTitlePref(Context context, int appWidgetId)
{
SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, 0);
String titleValue = prefs.getString(PREF_PREFIX_KEY + appWidgetId, null);
if (titleValue != null)
{
return titleValue;
} else
{
return context.getString(R.string.appwidget_text);
}
}
static void deleteTitlePref(Context context, int appWidgetId)
{
SharedPreferences.Editor prefs = context.getSharedPreferences(PREFS_NAME, 0).edit();
prefs.remove(PREF_PREFIX_KEY + appWidgetId);
prefs.commit();
}
}
К сожалению, это не работает, как следует. Настройки, отображаемые в активности конфигурации, не относятся к виджету, который использовался для вызова активности конфигурации, а обновление относится к некорректному экземпляру виджета.
Возможно, я что-то пропустил, можете ли вы дать какие-либо советы, что не так?
[править] Обновленный код:
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
{
// There may be multiple widgets active, so update all of them
final int N = appWidgetIds.length;
for (int i = 0; i < N; i++)
{
int appWidgetId = appWidgetIds[i];
//Intent intent = new Intent(context, MyWidgetConfigureActivity.class);
//intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,appWidgetId);
//PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent pendingIntent = getUniquePI(context,null,appWidgetId);
RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.my_widget);
views.setOnClickPendingIntent(R.id.widget_container, pendingIntent);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
int appWidgetId)
{
CharSequence widgetText = MyWidgetConfigureActivity.loadTitlePref(context, appWidgetId);
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.my_widget);
views.setTextViewText(R.id.appwidget_text, widgetText);
//Intent intent = new Intent(context, MyWidgetConfigureActivity.class);
//intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,appWidgetId);
//PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
PendingIntent pendingIntent = getUniquePI(context,null,appWidgetId);
views.setOnClickPendingIntent(R.id.widget_container, pendingIntent);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
Теперь мой виджет не реагирует на события нажатия (конфиг активность не показывает). Что не так?
Я обновил мой вопрос – user1209216
вызова выше кода, как, Не Пропустите нуль в команде PendingIntent pendingIntent = getUniquePI (контекст, "cmdClick", appWidgetId); – IshRoid
Я не уверен, что мне следует назвать «действием»? Я попробовал «Intent.ACTION_VIEW», но это не помогает, все еще не реагирует на событие click – user1209216