这是我第二次使用小部件,并且第一次使用小部件...或者除了TextViews之外的其他任何东西。
所以基本上我只有一个小部件......当我点击它时它没有做任何事情,它永远不会更新。为什么?困惑......:P
所以,这是我的WidgetAct onUpdate代码:
@Override
public void onUpdate(Context c, AppWidgetManager awm, int[] appWidgetIds){
Log.i("IN","onUpdate");
RemoteViews rv = new RemoteViews(c.getPackageName(),R.layout.widget);
Intent twitter_intent = new Intent(c,TwitterUpdate.class);
twitter_intent.setAction(ACTION_WIDGET_TWITTER);
Intent fb_intent = new Intent(c,FBUpdate.class);
fb_intent.setAction(ACTION_WIDGET_FB);
//Intent curr = new Intent(c,WidgetAct.class);
//curr.setAction(ACTION_WIDGET_WA);
PendingIntent twitter_pi = PendingIntent.getActivity(c, 0, twitter_intent, 0);
PendingIntent fb_pi = PendingIntent.getActivity(c,0,fb_intent,0);
rv.setOnClickPendingIntent(R.id.tweet, twitter_pi);
rv.setOnClickPendingIntent(R.id.fb, fb_pi);
awm.updateAppWidget(appWidgetIds, rv);
}
现在这是我的清单(或重要部分):
<receiver android:name="WidgetAct">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="com.laytproducts.IN.WidgetAct.ACTION_WIDGET_FB" />
<action android:name="com.laytproducts.IN.WidgetAct.ACTION_WIDGET_TWITTER" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/winfo"/>
</receiver>
这是我的小部件提供程序的xml:
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth = "220dp"
android:minHeight = "72dp"
android:updatePeriodMillis="0"
android:initialLayout="@layout/widget">
这是我的布局:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linearLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<FrameLayout android:background="@drawable/inwidget" android:id="@+id/frameLayout1" android:layout_width="wrap_content" android:layout_height="wrap_content">
<RelativeLayout android:id="@+id/relativeLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent">
<ImageButton android:scaleType="fitXY" android:src="@drawable/twitterlogo" android:layout_marginTop="17dp" android:id="@+id/tweet" android:layout_marginLeft="20dp" android:layout_width="40dp" android:layout_height="40dp"></ImageButton>
<ImageButton android:scaleType="fitXY" android:src="@drawable/facebooklogo" android:layout_marginLeft="5dp" android:id="@+id/fb" android:layout_toRightOf="@+id/tweet" android:layout_alignTop="@+id/tweet" android:layout_alignBottom="@+id/tweet" android:layout_width="40dp" android:layout_height="40dp"></ImageButton>
</RelativeLayout>
</FrameLayout>
有很多代码...但我确实没有理由相信我破坏了XD ......但那是因为我的小部件知识很少。
希望这是我看过的一个小错误。 谢谢大家, 布兰登
答案 0 :(得分:2)
如果您希望更新窗口小部件,则必须在XML文件的“updatePeriodMillis”字段中设置时间间隔。但请记住,使用此方法更新的最短时间间隔为30分钟。
答案 1 :(得分:1)
根据SDK document中的说明,onUpdate()
方法旨在响应ACTION_APPWIDGET_UPDATE
广播,该广播将在以下条件下发送:
在更新AppWidget时发送。 这可以响应于已经实例化该AppWidget提供者的新实例,所请求的更新间隔已经过去或者系统引导而被发送。
在您的代码中,您设置了操作com.laytproducts.IN.WidgetAct.ACTION_WIDGET_FB
,因此不会调用onUpdate()
。我没有在小部件中使用getActivity
,但我使用了getBroadcast
并且效果很好。
PendingIntent fb_pi = PendingIntent.getBroadcast(c,0,fb_intent,0);
我认为您应该使用onReceive()
方法处理点击事件。请注意,AppWidgetProvider
来自BroadcastReceiver
,因此只会调用onReceive()
(位于onReceive()
源代码中的AppWidgetProvider
,onUpdate()
在内部调用。这就是为什么我们有onUpdate()
)。你应该做点什么:
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
String action = intent.getAction();
if (action.equals("com.laytproducts.IN.WidgetAct.ACTION_WIDGET_FB")) {
//handle your click event here
}
}
这就是我在我的小部件中所做的。希望它有所帮助。
答案 2 :(得分:0)
你可以试试这个..
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget);
Intent one = new Intent(context, TwitterUpdate.class);
Intent two = new Intent(context, FBUpdate.class);
PendingIntent p1 = PendingIntent.getActivity(context, 0, one, 0);
PendingIntent p2 = PendingIntent.getActivity(context, 0, two, 0);
remoteViews.setOnClickPendingIntent(R.id.twitter_pi, p1);
remoteViews.setOnClickPendingIntent(R.id.fb_pi, p2);
appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
}