2012-04-21 86 views
1

我正在制作一个有2个小部件的android应用程序。我有1个小部件设置和工作,第二个小部件在小部件列表&中正确加载,但是:Android appwidget将其他小部件变成添加的小部件&第二个小部件不会工作?

如果我在添加小部件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> 

wi dgetstuff.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> 

任何人都可以告诉我问题是什么吗?我通过这个做我的螺母在试图弄明白:(

回答

2

您还没有利用了onUpdate PARAM int[] appWidgetIds的。

你应该循环,任何代码适用于每个人。此刻的你是不告诉它更新哪个小部件,也不尝试和更新超过一个小部件

下面的例子,注意N上的循环。子方法也使用小部件的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); 
    }