0

保留中のインテントで AppWidget から MainActivity を起動しようとしていますが、インテントを起動しない理由がわかりません。ウィジェットには、RemoteViewsService にバインドされた最大 3 つの項目を持つ ListView があります。いずれかの行がクリックされたときに MainActivity を開始したいと考えています。誰かが私が間違ったことを教えてもらえますか?

Launching an activity from an AppWidget のようないくつかの関連記事を既に確認しており、ここからサンプルを実行しようとしましたhttps://github.com/commonsguy/cw-advandroid/tree/master/AppWidget、サンプルが機能している間、私が違うことをしたことはまだわかりません。

関連する私のコードの一部を次に示します。さらに投稿する必要がある場合はお知らせください。また、これが私の最初の質問であるため、投稿が正しく表示されない場合は事前に謝罪してください。

ウィジェットのレイアウト:

<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/stocks"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
/>

AppWidgetProvider クラス:

@Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        Log.d(LOGTAG, "onUpdate");
        Log.d(LOGTAG, "appWidgetIds.length="+appWidgetIds.length);
        for (int i = 0; i < appWidgetIds.length; ++i) {
            Log.d(LOGTAG, "appWidgetIds[i]="+appWidgetIds[i]);
        }
        // update each of the app widgets with the remote adapter
        for (int i = 0; i < appWidgetIds.length; ++i) {
            updateWidget(context, appWidgetManager, appWidgetIds[i]);
        }
        super.onUpdate(context, appWidgetManager, appWidgetIds);
    }

    public void updateWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {
        Log.d(LOGTAG, "updateWidget id="+appWidgetId);

        // Sets up the intent that points to the StackViewService that will
        // provide the views for this collection.
        Intent intent = new Intent(context, StockAppWidgetService.class);
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
        // When intents are compared, the extras are ignored, so we need to embed the extras
        // into the data so that the extras will not be ignored.
        intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
        RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.stock_appwidget);
        rv.setRemoteAdapter(R.id.stocks, intent);

        Intent contentIntent = new Intent(context, MainActivity.class);
        //contentIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
        PendingIntent startAppPendingIntent = 
                PendingIntent.getActivity(context, 0, contentIntent, 0);
        rv.setPendingIntentTemplate(R.id.stocks, startAppPendingIntent);

        appWidgetManager.updateAppWidget(appWidgetId, rv);
    }

マニフェスト:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="x40241.chris.yuan.a4.app"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="16" />

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.Holo.Light.DarkActionBar" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".SearchableActivity" >
            <intent-filter>
                <action android:name="x40241.chris.yuan.a4.app.SEARCH" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
        <service android:name=".StockServiceImpl" />
        <service android:name=".StockAppWidgetService"
                 android:permission="android.permission.BIND_REMOTEVIEWS" />
        <receiver android:name=".ServiceLauncher">  
            <intent-filter>  
                <action android:name="android.intent.action.BOOT_COMPLETED" />  
            </intent-filter>  
        </receiver>
        <receiver android:name=".StockAppWidgetProvider" >
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>
            <meta-data android:name="android.appwidget.provider"
                       android:resource="@xml/stock_appwidget_info" />
        </receiver>
    </application>

</manifest>
4

1 に答える 1

1

関連する投稿で答え、または少なくとも実行可能な解決策を見つけたと思います:

アプリ ウィジェットの AdapterViewFlipper: setPendingIntentTemplate() および setOnClickFillInIntent() が機能しない

FillInIntent を適切に設定していなかったことがわかりました。リスト自体ではなく、リスト項目の最上位ビューで setOnClickFillInIntent を呼び出す必要があります。これを RemoteViewsFactory で機能させるためのコード変更は次のとおりです。

    public RemoteViews getViewAt(int position) {
        if (DEBUG) Log.d(LOGTAG, "StockRemoteViewsFactory getViewAt position="+position);

        RemoteViews rv = new RemoteViews(mContext.getPackageName(), R.layout.widget_item);
        rv.setTextViewText(R.id.text_symbol, mStockItems.get(position).getSymbol());
        rv.setTextViewText(R.id.text_price, String.format("$%.2f", mStockItems.get(position).getPrice()));

        Intent fillInIntent = new Intent(Intent.ACTION_MAIN);
        fillInIntent.putExtra(StockAppWidgetProvider.ITEM_NUM, position);

        // set on the top level view of the list item, instead of the list view itself
        //rv.setOnClickFillInIntent(R.id.stocks, fillInIntent);
        rv.setOnClickFillInIntent(R.id.general_layout, fillInIntent);    

        return rv;
    }
于 2012-12-12T06:59:57.883 に答える