2012-03-30 14 views
5

私は本当にシンプルなappwidget(2つのテキストビューとボタン)を持っています。私はTouchpad、Droid 1、Droid Razrでテストしました。それはRazr以外のすべてに作用します。ウィジェットをホームスクリーンに追加すると、ウィジェットは表示されません。それはちょうど目に見えない。私はそれがある場所を押さえているとウィジェットを選択し、私がそれを周りに移動すると、他のウィジェットが途中で移動するのを見るが、それは完全に見えない。Android AppWidgetが特定の電話機に表示されない

私はいくつかのトーストをonReceiveonEnabledの方法で入れて、Toastはすべての正しい情報(すなわち、インテントのアクションとエキストラ)を表示します。

誰もがこれに関する経験がありますか?

はEDIT:これは単なるデバッグ用であり、ベストプラクティス

public class GoogleTalkWidget extends AppWidgetProvider { 

    Button sendMessage; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context, "Received Intent Action = " + 
       intent.getAction(), Toast.LENGTH_SHORT).show(); 

     if(intent.getAction().equals(Utils.RECEIVED_MESSAGE_WIDGET)){ 
      RemoteViews views = new RemoteViews(context.getPackageName(), 
       R.layout.main_widget); 

      views.setTextViewText(R.id.widget_message, 
       (CharSequence)intent.getStringExtra("MESSAGE")); 

      views.setTextViewText(R.id.widget_sender, 
       (CharSequence)intent.getStringExtra("SENDER")); 

      Toast.makeText(context, "Received " + 
       intent.getStringExtra("MESSAGE") + " FROM " + 
       intent.getStringExtra("SENDER"), Toast.LENGTH_SHORT).show(); 

      ComponentName cn = new ComponentName(context, 
       GoogleTalkWidget.class); 

      AppWidgetManager.getInstance(context).updateAppWidget(cn, views); 

     } 
     super.onReceive(context, intent); 
    } 

    @Override 
    public void onEnabled(final Context context){ 
     super.onEnabled(context); 

     Toast.makeText(context, "Enabled", Toast.LENGTH_SHORT).show(); 
    } 

} 
+0

'onReceive()'? 'AppWidgetProvider'の' onUpdate() 'を意味しますか? – CommonsWare

+0

appwidgetの 'onReceive()'メソッドをオーバーライドすることもできます...以前のバージョンのAndroidに 'onDelete'の問題があったので残したと思います。 – Eliezer

+0

私はそれを理解しています。しかし、 'onUpdate()'は一般的に 'RemoteViews'を提供してアプリケーションウィジェットに何を入れるべきかを宣言します。 'onUpdate()'が呼び出されていて、 'RemoteViews'を正常に供給していますか? LogCatに関連する可能性のあるものはありますか(例えば、トレースをスタックする)か? – CommonsWare

答えて

1

私は考えることができる最善のことに従っていませんのでご注意下さい(バグやその他の問題はないはずRazrのランチャー)は、あなたのリソースが正しく設定されていないということです。 Razrのdpi密度が異なる場合があり、その密度のリソースがプロジェクトにないことがあります。

例えば、あなたのウィジェットを構成するすべてのドロアブルをres \ drawable-nodpiというフォルダに移動して、どのように動いているかを見てみてください。

EDIT:私はあなたのGoogleTalkWidgetクラスonReceive方法では、あなたのコード

で奇妙なものを見たメッセージUtils.RECEIVED_MESSAGE_WIDGETを受信したときに、自分のウィジェットのみが更新されます。私はこのメッセージが何であるかは分かりませんが、アプリケーションウィジェットはホームスクリーンに初めて追加され、android.appwidget.action.APPWIDGET_UPDATEを受け取り、その他のインテントフィルタはマニフェストファイルに登録されています。その時点でシステムによってブロードキャストされています(もちろん、スティッキーなブロードキャストは意図しています)。

@Override 
public void onReceive(Context context, Intent intent) { 
    Toast.makeText(context, "Received Intent Action = " + 
      intent.getAction(), Toast.LENGTH_SHORT).show(); 
    super.onReceive(context, intent); 

    String msg = "No messages yet"; 

    RemoteViews views = new RemoteViews(context.getPackageName(), 
      R.layout.main_widget); 

    if(intent.getAction().equals(Utils.RECEIVED_MESSAGE_WIDGET)){ 
     msg = intent.getStringExtra("MESSAGE"); 

     views.setTextViewText(R.id.widget_sender, 
      (CharSequence)intent.getStringExtra("SENDER")); 

     Toast.makeText(context, "Received " + 
      intent.getStringExtra("MESSAGE") + " FROM " + 
      intent.getStringExtra("SENDER"), Toast.LENGTH_SHORT).show(); 

     ComponentName cn = new ComponentName(context, 
      GoogleTalkWidget.class); 
    } 

    views.setTextViewText(R.id.widget_message, msg); 

    AppWidgetManager.getInstance(context).updateAppWidget(cn, views); 
} 

をし、何が起こるかを参照してください。私はあなたの位置にあった場合

私は次のようにonReceive方法を変更します。

あなたのウィジェットが表示されない場合は、Razrに問題があるかもしれませんが、これは、他のウィジェットのすべてがうまく動作すると思われるためです。

さらに、コードはデバッグ専用ですが、あなたのアプローチは少し問題があります。ウィジェットビューを更新する最も良い場所は、onReceiveではなくAppWidgetProviderのonUpdateメソッドです。 Androidはその目的のためにonUpdateメソッドを提供し、onReceiveは登録されたブロードキャストが到着したことを通知します。基本的な違いは、onUpdateメソッドでは、Androidが受け取ったIntentエクストラから必要なすべてのパラメータを抽出したことです。ウィジェットの更新に関するもう1つの点は、ウィジェットの定期的な更新を望まない場合でも、ウィジェットXMLファイルに0以外のupdatePeriodMillis値(2100000は良い値)を指定する必要があるということです。この値が0の場合、onReceiveメソッドが呼び出されないことがありました。

ブロードキャストレシーバとしてのAppWidgetProviderは、onReceiveメソッドがそのジョブを実行している間だけ存続することに注意してください。 UIリスナーなどのような "インタラクティブ"なコードのための良い場所ではありません.GoogleTalkWidgetクラスの上部にButton宣言(Button sendMessage;)があるので、これをお伝えしています。このことができます

希望...

+0

今、私はそれを非常に裸の骨で動作させようとしています。 。drawablesやそのようなものはありません....テキストビューとボタンだけです。 – Eliezer

+0

@Eliezer私の編集された答えを参照してください... – Christos

+0

'onReceive'の内容については、私はそれを忘れてしまったのでこの投稿を更新していません私はまだ問題を解決することができませんでした。私は質問を投稿して以来、私は 'super'と呼ばれる' onUpdate'しかなくなるまでコードの一部を取り出してみました。まだ動作しませんでした。 'onUpdate'と' onReceive'に関しては、このプロジェクトがRazrのこの問題のためにバックバーナーになって以来、私は本当に多くのことを考えていませんでした。 – Eliezer

関連する問題