1

ImageViewユーザーのデバイス上の画像への URI を使用してソースを設定しているのウィジェットがあります。ウィジェットのプロバイダーの で設定しRemoteViews.setImageViewUri()ました。onUpdate最も奇妙なことが起こっています: ウィジェットがホーム画面に静止している間はウィジェットや画像を見ることができませんが、ウィジェットを持ち上げて動かし始めると画像が表示されます!

これを説明するスクリーンショットを次に示します。

ここに画像の説明を入力 ここに画像の説明を入力

ウィジェットのレイアウトは次のとおりです。

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

    <ImageView
        android:id="@+id/the_picture"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:contentDescription="@string/image_content_description"
        android:scaleType="centerCrop" />

</RelativeLayout>

そして、ここに私の AppWidgetProvider があります:

public class WidgetProvider extends AppWidgetProvider {

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

        updateAllWidgets(context, appWidgetManager, appWidgetIds);
    }

    private void updateAllWidgets(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        PuppyFramePersistenceManager persistenceManager = new PuppyFramePersistenceManager(context);

        for(int i = 0; i < appWidgetIds.length; i++) {
            int appWidgetId = appWidgetIds[i];

            RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.puppyframe_widget);
            Intent configIntent = new Intent(context, AlbumsActivity.class);

            Uri.withAppendedPath(Uri.parse("pw" + i + "://widget/id/"), String.valueOf(appWidgetId));
            configIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);

            PendingIntent configPendingIntent = PendingIntent.getActivity(context, 0, configIntent, 0);
            remoteViews.setOnClickPendingIntent(R.id.picture_widget_parent, configPendingIntent);

            String currentAlbumId = persistenceManager.getCurrentAlbumIdForAppWidgetId(appWidgetId);
            if(currentAlbumId != null) {
                Uri imageUri = Uri.parse(persistenceManager.getAlbumWithId(currentAlbumId).getImagePaths().get(0));
                remoteViews.setImageViewUri(R.id.the_picture, imageUri);
            }

            appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
        }
    }
}

これは私の AndroidManifest.xml です:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.boztalay.puppyframe"
    android:versionCode="1"
    android:versionName="1.0" >

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

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <activity android:name="com.boztalay.puppyframe.configuration.albums.AlbumsActivity" >
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
            </intent-filter>
        </activity>

        <activity android:name="com.boztalay.puppyframe.configuration.editalbum.EditAlbumActivity" />

        <receiver android:name="com.boztalay.puppyframe.widget.PuppyFrameWidgetProvider" >
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>

            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/puppyframe_info" />
        </receiver>

        <service android:name="com.boztalay.puppyframe.widget.ScreenOnService"></service>
    </application>

</manifest>

最後に、これは私のウィジェット プロバイダー情報です。

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="40dp"
    android:minHeight="40dp"
    android:minResizeWidth="40dp"
    android:minResizeHeight="40dp"
    android:updatePeriodMillis="21600000"
    android:initialLayout="@layout/puppyframe_widget"
    android:configure="com.boztalay.puppyframe.configuration.albums.AlbumsActivity"
    android:resizeMode="horizontal|vertical"
    android:widgetCategory="home_screen">
</appwidget-provider>

ありがとう!

4

2 に答える 2

1

AppWidgetManagerがあなたと対話する方法はAppWidgetProvider、文書化されていません。onUpdateドキュメントは、構成アクティビティがある場合は呼び出されないと主張しています。

実際にonUpdateは、configure アクティビティが開始する前に呼び出されます。アクティビティが終了しても呼び出されません。あなたonUpdateの を見ると、appwidget がまだ構成されていない場合、ImageView空白のままになっているようです。構成アクティビティが表示されていなくても、何が起こっているのかは次のとおりだと思います。

  • AppWidgetManager新しいウィジェットを作成し、 を呼び出しますonUpdate。新しいウィジェットはまだ構成されていないImageViewため、 を画像に設定しません。
  • configure アクティビティが実行され、設定されますRESULT_OK。ウィジェットが構成されましたが、再度更新されていないため、ImageViewはまだ空白です。
  • ウィジェットのサイズを変更または移動すると、再びAppWidgetManager呼び出さonUpdateれます。今回は、コードでウィジェット構成を読み取り、ImageView. これで、ウィジェットに選択した画像が表示されます。

答えは、configure アクティビティが終了したら、AppWidgetProvider再度更新するようにインテントを送信する必要があるということです。ただし、これは万能薬ではなく、他のバグもありAppWidgetProviderます。たとえば、configure アクティビティの実行中に向きを変更して再起動すると、AppWidgetProvider終了して に戻った後でも、画面から appwidget が非表示になりますRESULT_OK。ランチャーが表示されている間 (configure アクティビティが終了した後) に方向を再度変更すると、appwidget が表示されます。

私がこれをすべて知っている理由は、同様のアプリを作成する際に同じ問題が発生したためです。これは、この機能に苦労している場合に役立つ可能性があります. Showrは、ホーム画面またはロック画面に画像を表示します。画像は、デバイス上の他のアプリ (ギャラリーなど) から選択したり、URL からダウンロードしたり、RSS または Atom フィードから更新したりできます。画像を適切なサイズにスケーリングし、appwidget に合わせてトリミングすることもできます。Google Play から無料でダウンロードできます

于 2013-06-01T12:52:46.930 に答える
0

問題は最終的に画像のサイズに関係しています。携帯電話のカメラが撮影する非常に大きな画像では、このバグが発生します。しかし、電話の小さいものでは、問題なく表示されました。私がしなければならなかったのは、実際には大きすぎる画像のサイズを変更してキャッシュすることでした。これは、電話の画面の解像度の 75% であると見なされました。

于 2013-06-23T07:21:03.120 に答える