2011-07-30 67 views
0

我的應用程序每10秒刷新一次。如果我更改手機的語言,則該小部件將停止工作。我的意思是,textviews在刷新之前不會加載文本(所以在10秒後)。我添加了一個功能,用戶可以通過點擊小部件(一個ImageView)來打開應用程序。這個問題依然存在。Android:無法點擊小工具

當我重新啓動手機時,也會出現整個問題。我必須等待10秒才能加載文字,但我無法點擊小部件。我可能會將此間隔更改爲1秒,解決此問題的方法(使用戶幾乎看不到)。但就像我說的,我仍然無法點擊小部件。

以下是完整的的AppWidgetProvider類:

public class HelloWidget extends AppWidgetProvider { 

    public static String ACTION_WIDGET_CONFIGURE = "ConfigureWidget"; 
    public static String ACTION_WIDGET_RECEIVER = "ActionReceiverWidget"; 
    private static final int REQUEST_CODE_ONE = 10; 
    String elso; 
    public static String MY_WIDGET_UPDATE = "MY_OWN_WIDGET_UPDATE"; 

    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
     super.onUpdate(context, appWidgetManager, appWidgetIds); 

     final int N = appWidgetIds.length; 
       for (int i=0; i<N; i++) { 
        int appWidgetId = appWidgetIds[i]; 
        updateAppWidget(context, appWidgetManager, appWidgetId); 
        Toast.makeText(context, "onUpdate(): " + String.valueOf(i) + " : " + String.valueOf(appWidgetId), Toast.LENGTH_SHORT).show(); 
       } 

     Intent intent = new Intent(context, UpdateService.class); 
     context.startService(intent); 
     RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.main); 
     Intent configIntent = new Intent(context, MainActivity.class); 
     configIntent.setAction(ACTION_WIDGET_CONFIGURE); 
     PendingIntent configPendingIntent = PendingIntent.getActivity(context, REQUEST_CODE_ONE, configIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
     remoteViews.setOnClickPendingIntent(R.id.ImageView01, configPendingIntent); 
     appWidgetManager.updateAppWidget(appWidgetIds, remoteViews); 

     Calendar calendar = Calendar.getInstance(); 
     calendar.setTimeInMillis(System.currentTimeMillis()); 

     Intent myIntent = new Intent(context, UpdateService.class); 
     PendingIntent pendingIntent = PendingIntent.getService(context, 0, myIntent, 0); 

     AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
     Calendar calendar2 = Calendar.getInstance(); 
     calendar2.setTimeInMillis(System.currentTimeMillis()); 
     calendar2.add(Calendar.SECOND, 1); 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar2.getTimeInMillis(), 50*1000, pendingIntent); 

    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     super.onReceive(context, intent); 

     if(MY_WIDGET_UPDATE.equals(intent.getAction())){ 

      Bundle extras = intent.getExtras(); 
      if(extras!=null) { 
      AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
      ComponentName thisAppWidget = new ComponentName(context.getPackageName(), HelloWidget.class.getName()); 
      int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisAppWidget); 
      if (appWidgetIds.length > 0) { 

       new HelloWidget().onUpdate(context, appWidgetManager, appWidgetIds); 
      } 

      } 

     } 
    } 

    public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, 
       int appWidgetId){ 

      } 
} 

從這個代碼這是用來打開該應用程序的MainActivity.class部分,當用戶點擊該小部件:

RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.main); 
Intent configIntent = new Intent(context, MainActivity.class); 
configIntent.setAction(ACTION_WIDGET_CONFIGURE); 
PendingIntent configPendingIntent = PendingIntent.getActivity(context, REQUEST_CODE_ONE, configIntent, 0); 
remoteViews.setOnClickPendingIntent(R.id.ImageView01, configPendingIntent); 
appWidgetManager.updateAppWidget(appWidgetIds, remoteViews); 

這是Manfiest部分:

<receiver android:name=".HelloWidget" android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
      </intent-filter> 
      <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_provider" /> 
     </receiver> 

這是widget_provider.xml:

<?xml version="1.0" encoding="utf-8"?> 
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
android:minWidth="146dip" 
android:minHeight="72dip" 
android:updatePeriodMillis="86400000" 
android:initialLayout="@layout/main" 
/> 

回答

0

我有一個插件到我的應用程序,它被刷新每10秒[...]

我可以此時間間隔變更爲1秒[...]

總之:這是非常糟糕的做法。您應該(最多)每30分鐘更新一次。

通過每隔10秒刷新一次Widget,您會快速殺死電池,以至於沒有人會使用它。相反,你可以添加一個「刷新」按鈕,然後手動刷新Widget。

此外,在onUpdate-方法中,您不需要調用超級方法。

onReceive-方法不需要被覆蓋!當您使用AppWidgetProvider時(如果使用正常BroadcastReceiver,則不會自動調用onUpdate-方法)。見here

最後但並非最不重要的一點,您應該檢查您的「call-Activity」-code是否已達到,並嘗試使用Log-class進行調試。 LogCat-Output也可能有助於解決這個問題。

+0

我檢查了你建議的鏈接,刪除了Override和超級方法,但是我仍然無法在重新啓動或語言更改後單擊該小部件。 – erdomester

+0

文檔說,AppWidgetProvider是一個廣播接收器,但使用getBroadcast方法時,窗口部件點擊從不起作用。 – erdomester

+0

您能否爲您的Widget和Provider提供完整的和最新的代碼,以便我可以隨時使用它。 –

0

您可以添加此標誌

PendingIntent configPendingIntent = PendingIntent.getActivity(context, REQUEST_CODE_ONE, configIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

還要檢查logcat的任何異常,當你點擊窗口小部件,它拋出。

+0

我點擊了widget.Logcat說:開始活動....確定。我在模擬器中改變了語言。然後我點擊了小部件,沒有任何反應(就像在我的手機中一樣)。這次單擊widget時,Logcat不會說任何東西。 – erdomester