1

おそらく約7,8のチュートリアルを試し、ここで少なくとも30,40の回答を読みましたが、無駄でした...自分の携帯電話でウィジェットを動作させることができません。

すべてのウィジェットの実装は、ウィジェットのテキストを更新したり、クリック時にウィジェットを登録したりしません。

たとえば、このチュートリアル: http://blog.doityourselfandroid.com/2011/05/24/developing-android-home-screenwidgets/ コードをダウンロードできます。友人の電話 (Android 2.3) では正常に動作しますが、私の電話では問題なく動作します。 Log Cat で受信機が発砲しているのを確認できますが、何も更新されませんか?

これが私の現在の簡単なコードです:

1.マニフェスト

<receiver android:name=".TestWidgetProvider">
        <meta-data android:name="android.appwidget.provider"
            android:resource="@xml/testwidgetprovider"
            />
        <intent-filter >
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
        </intent-filter>

    </receiver>
    <receiver android:name=".TestReceiver"/>
  1. TestWidgetProvider

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds){
    
    
    Log.d("CSV", "Called on onUpdate");
    
    AlarmManager am=(AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Calendar cal=Calendar.getInstance();
    cal.add(Calendar.SECOND, 30);
    
    Intent intent=new Intent(context, TestReceiver.class);
    
    
    int N=appWidgetIds.length;
    for (int i=0; i<N; i++) {
    
        RemoteViews tt=new RemoteViews(context.getPackageName(), R.layout.testwidget);
    
        tt.setTextViewText(R.id.textView1,"UPDATED" +i);
    
        appWidgetManager.updateAppWidget(appWidgetIds[i], tt);
    
        Log.d("CSV", "Update widget, i = " +i + " widgetId=" + appWidgetIds[i] );
    
    }
    
    
    
    intent.putExtra("id", appWidgetIds);
    intent.putExtra("duz", appWidgetIds.length);
    
    PendingIntent p1=PendingIntent.getBroadcast(context, 1, intent, 0);
    am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 10000, p1);
    
    super.onUpdate(context, appWidgetManager, appWidgetIds);
    

    }

  2. テストレシーバー

    public class TestReceiver extends BroadcastReceiver {
    
    
    private static final String tag="TestReceiver";
    @Override
    public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
    
    
    int[] ID;
    Bundle extras=intent.getExtras();
    ID=extras.getIntArray("id");
    int duz=intent.getIntExtra("duz", 0);
    
    Log.d("CSV", "update widget id=" +ID);
    
    
    double b=Math.random();
    int i=(int) ((b*10+1)%10);
    
    RemoteViews rv=new RemoteViews(context.getApplicationContext().getPackageName(), R.layout.testwidget);
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context.getApplicationContext());
    
    
    for (int a=0; a<duz; i++) {
    
        rv.setTextViewText(R.id.textView1, "update random: " + a);
        appWidgetManager.updateAppWidget(ID[a], rv);
        Log.d("CSV", "Update widget, a = " +a + " widgetId=" + ID[a] );
    
    }
    
    
    /*
    ComponentName provider = new ComponentName(context, TestWidgetProvider.class);
    appWidgetManager.updateAppWidget ( provider, rv);
    */
    

    }

  3. ウィジェット xml

    <?xml version="1.0" encoding="utf-8"?>
       <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
        android:minWidth="200dp"
    android:minHeight="120dp"
    android:updatePeriodMillis="0"
    android:initialLayout="@layout/testwidget"
    android:resizeMode="horizontal|vertical"
    >
    </appwidget-provider>
    

私が何日も立ち往生しているのを助けてください...

編集1. 最初の回答で提案されたようにメインアクティビティを追加しましたが、変更はありません。

また、ウィジェットを最初に画面に設定したときはテキストが実用的に更新されませんが、ウィジェットを見つけることができないようですが、2回目にウィジェットを画面に配置すると、onEnableのコードに従ってテキストが変更されますか?

編集 2: 今のところ問題を解決する回答を投稿し、ウィジェットを更新しました

編集 3. Richard Le Mesurier の回答を正しいものとしてマークしました。これは、彼のデモ コードが、ネットワーク操作中にサービスを介してウィジェットを管理することについて非常に詳細に説明されているためです。私の問題だけでなく、私が尋ねようとしていた他の多くの問題もカバーしています。ウィジェットで本格的な作業を行う場合は、このデモを学習することをお勧めします。

4

2 に答える 2

1

回答 2 (動作中のデモへのリンクで更新)

@JanBoに約束したように、私がこの問題にどのように取り組んだかについての詳細(免責事項-これは単なる私の意見であり、改善方法に関する建設的なコメントを期待しています)。

JanBo には、1 つの更新方法が機能し、1 つの更新方法が失敗するという問題がありました。私は、両方のケースで呼び出すことができる単一のメソッドにそれらを結合することを彼に提案しました。

GitHub に StackFlairWidget という概念実証のデモ ウィジェット アプリがあります。ユーザーの Stack Overflow の「フレア」画像が表示されます。

(このプロジェクトは進行中です。POC Completeコミットを使用して、この問題に関連するコードを確認する方が簡単かもしれません。いくつかのバグがありますが、最初のリビジョンよりも理解しやすいです。)

複数のウィジェットを別々に設定できるようにするデモです。たとえば、プロジェクトで「appWidgetId」を検索して、さまざまなメソッドでウィジェット ID を渡す方法を表示し、ユーザーがウィジェットを正しく構成できるようにすることができます。

これは、ウィジェットの更新コードをサービス内のスレッドにオフロードするパターンを示していますBroadcastReceiver。これにより、プロジェクトが大きくなるにつれて、おそらく同様のことを行う必要があります。

これはデモ アプリにすぎないため、多くのコメント、過度に複雑なコード (製品アプリから借用したもの) が含まれていますが、いくつかの恐ろしいハック (申し訳ありません) も含まれています。

基本的に、あなたが述べているように、更新コードは正しいです。私のは、fwiw、FlairWidgetServiceクラスにいます。指定されたウィジェットを画像で更新します。

public void updateWidget(int appWidgetId, Bitmap flair)
{
    try
    {
        // set remote views
        RemoteViews widgetUi = new RemoteViews(getPackageName(), R.layout.widget);
        widgetUi.setImageViewBitmap(R.id.ivFlair, flair);

        // open Settings on click
        Intent flairSettings = new Intent(this, SettingsActivity.class);
        flairSettings.putExtra(IntentExtra.Key.APP_WIDGET_ID, appWidgetId);
        PendingIntent pendingIntentIp =
                PendingIntent.getActivity(this, appWidgetId, flairSettings,
                        PendingIntent.FLAG_UPDATE_CURRENT);
        widgetUi.setOnClickPendingIntent(R.id.ivFlair, pendingIntentIp);

        /* UPDATE THE WIDGET INSTANCE */
        try
        {
            AppWidgetManager widgetManager = AppWidgetManager.getInstance(this);
            widgetManager.updateAppWidget(appWidgetId, widgetUi);
        }
        catch (Exception e)
        {
            Dbug.log("Failed to update widget");
        }
    }
    catch (Exception e)
    {
        Dbug.log("Failed to update widget");
    }
    finally
    {
        // clean up
        FlairWidgetService.this.stopSelf();
    }
}

これが唯一の方法ではありませんが、私は何かを提供すると約束しました...頑張ってください。


回答1(編集1に従って、ポスターを助けませんでした)

HoneyComb で発生したと思われるセキュリティ アップグレードの影響を受けているようです。

基本的に、新しいバージョンの Android では、最初にActivity.

プロジェクトにアクティビティを追加して最初に実行すると、ウィジェットが更新されると思います。

良い例は、Settings スタイルのアクティビティ、またはおそらく About ボックス タイプのものを使用して、ウィジェットについてユーザーに少し伝えることです。(ウィジェットで設定を使用します)。


詳細については:

于 2013-07-16T10:37:43.597 に答える
0

TestReceiverでこのコードを使用すると機能します

    ComponentName thisAppWidget = new ComponentName(context.getPackageName(), TestWidgetProvider.class.getName());
     AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context.getApplicationContext());
     int ids[] = appWidgetManager.getAppWidgetIds(thisAppWidget);

     appWidgetManager.updateAppWidget(ids, tt);

および AppWidgetProvider の onUpdate で:

    ComponentName provider = new ComponentName(context, TestWidgetProvider.class);
    appWidgetManager.updateAppWidget ( provider, tt); //tt is RemoteViews tt=...

理由はわかりませんが、これが私の電話で機能する唯一の組み合わせですか?

更新などのアラームマネージャーと組み合わせた複雑なサービスを作成する必要があるため、誰かがこれについて詳しく知っている場合は説明してください....

@Richard Le Mesurierは、ウィジェットのアクティビティが必要なAndroid 4.0の情報に感謝しますが、どこにも見つかりませんでした。

于 2013-07-16T12:47:56.993 に答える