小部件不更新?

时间:2012-03-03 05:14:57

标签: java android android-widget

这是我第二次使用小部件,并且第一次使用小部件...或者除了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 ......但那是因为我的小部件知识很少。

希望这是我看过的一个小错误。 谢谢大家, 布兰登

3 个答案:

答案 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()源代码中的AppWidgetProvideronUpdate()在内部调用。这就是为什么我们有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);
}