- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在制作一个包含 2 个小部件的 Android 应用程序。我有 1 个小部件设置和工作,第二个小部件在小部件列表中被识别并正确加载,但是:
如果我在添加小部件2时屏幕上已经有小部件1,则两个小部件都变为小部件2。如果我有一个小部件2和一个小部件1,并添加一个小部件2,它们都变为小部件2。如果我添加小部件 1,也会发生同样的情况 - 它们都会更改为小部件 1。
此外,点击小部件 2 时没有任何反应,即使我使用了与小部件 1 几乎相同的代码。
相关文件如下:
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.liamwli.reboot_widget"
android:installLocation="internalOnly"
android:versionCode="3"
android:versionName="1.1" >
<uses-sdk
android:minSdkVersion="7"
android:targetSdkVersion="15" />
<uses-permission android:name="android.permission.REBOOT" />
<uses-permission android:name="com.android.vending.CHECK_LICENSE" />
<application
android:allowClearUserData="false"
android:icon="@drawable/icon"
android:label="@string/app_name" >
<activity
android:name=".reboot_widget_activeity"
android:excludeFromRecents="true"
android:icon="@drawable/icon"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name=".Reboot_rec"
android:icon="@drawable/icon"
android:label="Reboot Recovery Widget" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="com.liamwli.reboot_widget.Reboot_rec.ACTION_WIDGET_CLICK_RECEIVER" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/rebr_widget" />
</receiver>
<service android:name=".Reboot_rec$ToggleService" />
<receiver
android:name=".Widget"
android:icon="@drawable/icon"
android:label="Reboot Widget" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="com.liamwli.reboot_widget.Widget.ACTION_WIDGET_CLICK_RECEIVER" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widgetstuff" />
</receiver>
<service android:name=".Widget$ToggleService" />
<activity
android:name=".Reboot"
android:excludeFromRecents="true"
android:icon="@drawable/icon"
android:label="@string/app_name" >
<intent-filter>
<action android:name="com.liamwli.reboot_widget.REBOOT" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".Reboot_rec"
android:excludeFromRecents="true"
android:icon="@drawable/icon"
android:label="@string/app_name" >
<intent-filter>
<action android:name="com.liamwli.reboot_widget.REBOOT_REC" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".hidprefs"
android:excludeFromRecents="true"
android:icon="@drawable/icon"
android:label="@string/app_name" >
<intent-filter>
<action android:name="com.liamwli.reboot_widget.HIDPREFS" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
</manifest>
Widget.java(对于小部件 1):
package com.liamwli.reboot_widget;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;
public class Widget extends AppWidgetProvider {
public static String ACTION_WIDGET_CLICK_RECEIVER = "ActionReceiverWidget";
public static int appid[];
public static RemoteViews rview;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
updateWidgetState(context, "");
}
@Override
public void onReceive(Context paramContext, Intent paramIntent) {
String str = paramIntent.getAction();
if (paramIntent.getAction().equals(ACTION_WIDGET_CLICK_RECEIVER)) {
updateWidgetState(paramContext, str);
} else {
if ("android.appwidget.action.APPWIDGET_DELETED".equals(str)) {
int i = paramIntent.getExtras().getInt("appWidgetId", 0);
if (i == 0) {
} else {
int[] arrayOfInt = new int[1];
arrayOfInt[0] = i;
onDeleted(paramContext, arrayOfInt);
}
}
super.onReceive(paramContext, paramIntent);
}
}
static void updateWidgetState(Context paramContext, String paramString) {
RemoteViews localRemoteViews = buildUpdate(paramContext, paramString);
ComponentName localComponentName = new ComponentName(paramContext,
Widget.class);
AppWidgetManager.getInstance(paramContext).updateAppWidget(
localComponentName, localRemoteViews);
}
private static RemoteViews buildUpdate(Context paramContext, String paramString)
{
// Toast.makeText(paramContext, "buildUpdate() ::"+paramString, Toast.LENGTH_SHORT).show();
rview = new RemoteViews(paramContext.getPackageName(), R.layout.widget_layout);
Intent active = new Intent(paramContext, Widget.class);
active.setAction(ACTION_WIDGET_CLICK_RECEIVER);
PendingIntent configPendingIntent = PendingIntent.getActivity(paramContext, 0, active, 0);
// upadte this R.id.buttonus1 with your layout or image id on which click you want to start Activity
Intent configIntent = new Intent(paramContext, Reboot.class);
configIntent.setAction((ACTION_WIDGET_CLICK_RECEIVER));
PendingIntent configPendingIntent1 = PendingIntent.getActivity(paramContext, 0, configIntent, 0);
rview.setOnClickPendingIntent(R.id.bRB, configPendingIntent1);
if(paramString.equals(ACTION_WIDGET_CLICK_RECEIVER))
{
}
return rview;
}
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
// Toast.makeText(context, "onEnabled() ", Toast.LENGTH_SHORT).show();
}
// Called each time an instance of the App Widget is removed from the host
@Override
public void onDeleted(Context context, int[] appWidgetId) {
super.onDeleted(context, appWidgetId);
// Toast.makeText(context, "onDeleted() ", Toast.LENGTH_SHORT).show();
}
// Called when last instance of App Widget is deleted from the App Widget
// host.
@Override
public void onDisabled(Context context) {
super.onDisabled(context);
// Toast.makeText(context, "onDisabled() ", Toast.LENGTH_SHORT).show();
}
}
Reboot_rec.java(用于小部件 2):
package com.liamwli.reboot_widget;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;
public class Reboot_rec extends AppWidgetProvider {
public static String ACTION_WIDGET_CLICK_RECEIVER = "ActionReceiverWidget";
public static int appid[];
public static RemoteViews rview;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
updateWidgetState(context, "");
}
@Override
public void onReceive(Context paramContext, Intent paramIntent) {
String str = paramIntent.getAction();
if (paramIntent.getAction().equals(ACTION_WIDGET_CLICK_RECEIVER)) {
updateWidgetState(paramContext, str);
} else {
if ("android.appwidget.action.APPWIDGET_DELETED".equals(str)) {
int i = paramIntent.getExtras().getInt("appWidgetId", 0);
if (i == 0) {
} else {
int[] arrayOfInt = new int[1];
arrayOfInt[0] = i;
onDeleted(paramContext, arrayOfInt);
}
}
super.onReceive(paramContext, paramIntent);
}
}
static void updateWidgetState(Context paramContext, String paramString) {
RemoteViews localRemoteViews = buildUpdate(paramContext, paramString);
ComponentName localComponentName = new ComponentName(paramContext,
Widget.class);
AppWidgetManager.getInstance(paramContext).updateAppWidget(
localComponentName, localRemoteViews);
}
private static RemoteViews buildUpdate(Context paramContext, String paramString)
{
// Toast.makeText(paramContext, "buildUpdate() ::"+paramString, Toast.LENGTH_SHORT).show();
rview = new RemoteViews(paramContext.getPackageName(), R.layout.widget_layout_rec);
Intent active = new Intent(paramContext, Reboot_rec.class);
active.setAction(ACTION_WIDGET_CLICK_RECEIVER);
PendingIntent configPendingIntent = PendingIntent.getActivity(paramContext, 0, active, 0);
// upadte this R.id.buttonus1 with your layout or image id on which click you want to start Activity
Intent configIntent = new Intent(paramContext, Reboot_rec_ac.class);
configIntent.setAction((ACTION_WIDGET_CLICK_RECEIVER));
PendingIntent configPendingIntent1 = PendingIntent.getActivity(paramContext, 0, configIntent, 0);
rview.setOnClickPendingIntent(R.id.bRBR, configPendingIntent1);
if(paramString.equals(ACTION_WIDGET_CLICK_RECEIVER))
{
}
return rview;
}
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
// Toast.makeText(context, "onEnabled() ", Toast.LENGTH_SHORT).show();
}
// Called each time an instance of the App Widget is removed from the host
@Override
public void onDeleted(Context context, int[] appWidgetId) {
super.onDeleted(context, appWidgetId);
// Toast.makeText(context, "onDeleted() ", Toast.LENGTH_SHORT).show();
}
// Called when last instance of App Widget is deleted from the App Widget
// host.
@Override
public void onDisabled(Context context) {
super.onDisabled(context);
// Toast.makeText(context, "onDisabled() ", Toast.LENGTH_SHORT).show();
}
}
Rebr_widget.xml(用于小部件 2):
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minHeight="40dp" android:minWidth="40dp" android:initialLayout="@layout/widget_layout_rec">
</appwidget-provider>
widgetstuff.xml(对于小部件 1):
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minHeight="40dp" android:minWidth="40dp" android:initialLayout="@layout/widget_layout">
</appwidget-provider>
谁能告诉我问题出在哪里?我正在竭尽全力想弄清楚:(
最佳答案
您还没有使用 onUpdate
参数 int[] appWidgetIds
。
你应该遍历它,并对每个应用任何代码。目前您没有告诉它要更新哪个小部件。您也不会尝试更新多个小部件。
下面的示例,注意 N 上的循环。并且 sub 方法还使用小部件的 id,它是从 onUpdate
上的循环传递的。
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
final int N = appWidgetIds.length;
Log.d(LOG_TAG, "Updating Example Widgets.");
// Perform this loop procedure for each App Widget that belongs to this
// provider
for (int i = 0; i < N; i++) {
int appWidgetId = appWidgetIds[i];
// Create an Intent to launch ExampleActivity
Intent intent = new Intent(context, WidgetExampleActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
// Get the layout for the App Widget and attach an on-click listener
// to the button
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget1);
views.setOnClickPendingIntent(R.id.button, pendingIntent);
// Tell the AppWidgetManager to perform an update on the current app
// widget
appWidgetManager.updateAppWidget(appWidgetId, views);
// Update The clock label using a shared method
updateAppWidget(context, appWidgetManager, appWidgetId);
}
}
public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {
String currentTime = df.format(new Date());
RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.widget1);
updateViews.setTextViewText(R.id.widget1label, currentTime);
appWidgetManager.updateAppWidget(appWidgetId, updateViews);
}
关于Android appwidget 将其他小部件变成添加的小部件,而第二个小部件不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10261065/
我正在使用一个服务来更新我的 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 出现,当小部件被添加到屏幕时//到目前为止一切顺利 保存配置后,启动更新小部件的服务//目前为止一切正常 定期安排警报以运行更
我是一名优秀的程序员,十分优秀!