- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在创建带有可点击按钮的 Android 主屏幕小部件。单击按钮后,我将使用来自 SharedPreferences 的数据更新 TextView。我不知道我做错了什么,但是单击按钮后,每个小部件实例都会更新。如何只更新点击的小部件?
测试小部件配置:
public class TestWidgetConfiguration extends Activity {
Button confirm;
EditText edit;
int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setResult(RESULT_CANCELED);
setContentView(R.layout.testwidgetconfiguration);
confirm = (Button)findViewById(R.id.button1);
confirm.setOnClickListener(confirmListener);
edit = (EditText)findViewById(R.id.editText1);
Intent intent = getIntent();
Bundle extras = intent.getExtras();
if(extras != null) {
mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
}
if(mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
finish();
}
}
private Button.OnClickListener confirmListener = new Button.OnClickListener() {
@Override
public void onClick(View v) {
Intent resultValue = new Intent();
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
SharedPreferences prefs = getSharedPreferences("prefs", 0);
SharedPreferences.Editor editor = prefs.edit();
editor.putInt("id:"+mAppWidgetId, Integer.parseInt(edit.getText().toString()));
editor.commit();
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(TestWidgetConfiguration.this);
TestWidget.updateAppWidget(TestWidgetConfiguration.this, appWidgetManager, mAppWidgetId);
setResult(RESULT_OK, resultValue);
finish();
}
};
}
测试小部件:
public class TestWidget extends AppWidgetProvider {
public static String ACTION = "TestAction";
public static String URI_SCHEME ="ASD";
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
Toast.makeText(context, "onUpdate()", Toast.LENGTH_SHORT).show();
}
public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {
SharedPreferences prefs = context.getSharedPreferences("prefs", 0);
int id = prefs.getInt("id:"+appWidgetId, 0);
RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.testwidget);
updateViews.setTextViewText(R.id.textView2, "[" + String.valueOf(appWidgetId) + "]" + id);
Intent intent = new Intent(context, TestWidget.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
intent.setAction(ACTION);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, appWidgetId, intent, 0);
//Uri data = Uri.withAppendedPath(
// Uri.parse(URI_SCHEME + "://widget/id/")
// ,String.valueOf(appWidgetId));
//intent.setData(data);
updateViews.setOnClickPendingIntent(R.id.button1, pendingIntent);
appWidgetManager.updateAppWidget(appWidgetId, updateViews);
Toast.makeText(context, "updateAppWidget(): " + String.valueOf(appWidgetId) + "\n", Toast.LENGTH_LONG).show();
}
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
Toast.makeText(context, "onReceive()", Toast.LENGTH_SHORT).show();
if (ACTION.equals(intent.getAction())) {
int idd = 0;
Bundle extras = intent.getExtras();
if(extras != null) {
idd = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);
}
Toast.makeText(context, "id: " + idd, Toast.LENGTH_SHORT).show();
SharedPreferences prefs = context.getSharedPreferences("prefs", 0);
int id = prefs.getInt("id:"+idd, 0);
RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.testwidget);
rv.setTextViewText(R.id.textView1, "lala" + id);
ComponentName testWidget = new ComponentName(context, TestWidget.class);
AppWidgetManager manager = AppWidgetManager.getInstance(context);
manager.updateAppWidget(testWidget, rv);
}
}
}
最佳答案
在 TestWidget#onReceive
中更改以下行:
manager.updateAppWidget(testWidget, rv);
到
manager.updateAppWidget(idd, rv);
它是 idd 而不是 Ziem 在评论中写的 id。
关于android - 只更新一个 AppWidget 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10162086/
我正在使用一个服务来更新我的 AppWidgets,该服务监听发布/订阅 channel 并且基本上永远在后台运行,每当收到更新时更新 AppWidgets。 我不担心电池生命周期,因为设备始终处于接
我想获取与应用小部件 ID 关联的应用小部件布局。 在 appwidget 的 Widget provider 类中,android 文档提供了一种获取 appwidget id 的简单方法... p
我在 eclipse 中有 2 个 android 项目,一个是主应用程序,另一个是主屏幕的小部件。我想在用户单击小部件时打开主应用程序。但是,当我使用来自主应用程序的 Activity 创建 Int
我在 Android 市场上发布了几个应用程序小部件,它们大部分都运行良好。但是我注意到使用共享首选项保存的首选项有时会重置为默认值。这种情况下的默认值是硬编码变量。保存在 xml 中的共享首选项与用
假设我有一个 android 项目,它有可以添加到应用程序启动器的可用 appWidget。该项目还有一个显示我创建的 appWidget 的 Activity 。 问题:对于启动器,appWidge
我创建了一个显示数字时钟的简单应用程序小部件,并为该时钟设置了一个 PendingIntent。(即)当用户点击 TextView 时,一个拨号盘被打开。它工作得很好。但是,当我打开一些应用程序(如
我有一个小部件,可以让您从 2 种尺寸中进行选择,它还有一个配置。由于某种原因,一段时间后,我的小部件上的按钮将解除绑定(bind),您将无法单击任何内容。我不知道为什么会这样。难道是我的 OnRec
我遇到的问题是,当我调试我的小部件时,它会更改布局,但当我只是运行它时,它不起作用。根据我的调试消息,它设置了 setOnClickPendingIntent 但它没有启动我的服务。 简而言之,我的小
从主屏幕删除我的最后一个 appWidget 实例后,onDisabled、onEnabled 不工作。 我将我的小部件注册为广播接收器,主屏幕上没有实例但广播接收,而且我看到我的日志写在我的 app
我有一个 appwidget,我想在整个 appwidget 布局上添加一个点击监听器,而不仅仅是在 TextView ecc 上。这是行不通的 remoteViews.setOnClickPendi
我一直致力于实现一个可以手动更新的 AppWidget。但是,出于某种原因,Widget 除了第一次显示时不会更新,并且该更新是通过 Configuration Activity 进行的,它与代码几乎
当我的主要 Activity 暂停时,我需要更新我的 AppWidget。我尝试在主要 Activity 的 onPause() 中使用以下代码: super.onPause(); AppWidget
编辑:我安装了我的应用程序 4.x 设备,没有问题。问题仅存在于 3.x 设备。 我正在尝试在用户设置时手动更新 AppWidget设备上的更改。为此,我使用与此类似的代码: ComponentNam
我正在 android 上创建一些应用程序小部件。我还想重新使用 appwidgets 的布局,这样我就可以在我的 Activity 中进行控制,使其看起来一样。 为了工作正常,我遇到的问题是我希望得
我在编写启动器时遇到了 appwidgets 的问题。只有 Clock widget 正常工作,其他不正常: 部分代码: final AppWidgetHostView hostView = mApp
当我在 Debug模式下运行时,我似乎无法到达服务内部的任何断点,这是为什么? @Override public void onUpdate(Context context, AppWidge
我创建了一个显示简单 TextView 的小部件,它可以在配置 Activity 中作为 Edittext 进行编辑。我使用共享首选项保存输入的文本,因此用户可以点击小部件来编辑文本,并且已经输入的文
我有一个应用程序小部件的问题。它没有配置 Activity 。当我在模拟器中设置 android:updatePeriodMillis="10000" (知道不应该这样做,但它只是为了测试)时 onU
您好,我的 Android 小部件出现了一个非常奇怪的问题,我仔细查看了很多地方,但我似乎无法弄清楚哪里出了问题。基本上我在我的小部件中调用了一个 pendingintent 广播,并在 onreci
这就是我想从我的 AppWidget 中得到的: 配置 Activity 出现,当小部件被添加到屏幕时//到目前为止一切顺利 保存配置后,启动更新小部件的服务//目前为止一切正常 定期安排警报以运行更
我是一名优秀的程序员,十分优秀!