2011-07-30 14 views
0

私のアプリケーションには10秒ごとに更新されるウィジェットがあります。私が電話の言語を変更した場合、ウィジェットは機能しなくなります。つまり、テキストビューでは、テキストがリフレッシュされるまで(10秒後に)読み込まれません。ウィジェット(ImageView)をクリックすることで、ユーザーがアプリを開くことができる機能を追加しました。この問題は依然として存在します。Android:ウィジェットをクリックすることはできません

この全体の問題は、電話機を再起動しても表示されます。私はtextviewsがテキストを読み込むために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

私は

[...]私は1秒に、この間隔を変更することがあり

10秒毎に更新されます私のアプリケーションにウィジェットを[...]持っています要するに、それは非常に悪い習慣です。 (最大で)30分ごとに更新する必要があります。

あなたのウィジェットを10秒ごとにリフレッシュすることで、誰もそれを使用しないようにすばやくバッテリーを消すことができます。代わりに、 "リフレッシュ"ボタンを追加して、手動でウィジェットをリフレッシュすることができます。

また、onUpdateメソッドでは、スーパーメソッドを呼び出す必要はありません。

onReceive-メソッドをオーバーライドする必要はありません。 AppWidgetProvider(通常のBroadcastReceiverを使用していない場合)を使用すると、onUpdateメソッドが自動的に呼び出されます。 hereを参照してください。

「コールアクティビティ」コードに達したかどうかを確認して、Log-classでデバッグしようとする必要があります。 LogCat-Outputはこれを解決するのに役立つかもしれません。

+0

あなたが提案したリンクをチェックして、上書きとスーパーメソッドを削除しましたが、再起動や言語の変更後でもウィジェットをクリックできません。 – erdomester

+0

Docsでは、AppWidgetProviderはブロードキャスト受信者ですが、getBroadcastメソッドを使用すると、ウィジェットのクリックはうまく動作しません。 – erdomester

+0

あなたのウィジェットとプロバイダの完全な最新コードを提供してください。私はそれを使いこなすことができます。 –

0

あなたは

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

をこのフラグを追加できます。また、あなたがウィジェットをクリックしたときにスロー例外のためLogcatをご確認ください。

+0

私はウィジェットをクリックしました。私はエミュレータで言語を変更しました。それから私はウィジェットをクリックして何も起こらない(私の電話のように)。今回、ウィジェットをクリックすると、Logcatは何も言わない。 – erdomester

関連する問題