web-dev-qa-db-ja.com

Android RemoteViews、ウィジェット内でImageViewのScaleTypeを設定する方法は?

私は、ユーザーが設定画面の1つで選択できる、右側に画像を持つウィジェットを開発しています。その後、画像はImageView.setScaleType( "CENTER")を使用してユーザーから設定できます。動作します。その後、画像のURLはURLとして、またビットマップのBase64エンコード文字列として設定に保存されます(画像を縮小したいので、ユーザーは設定で回転させることができます)

ウィジェットで、画像をロードします。それはうまくいきます。 URIとビットマップも使用します。 ImageViewのScaleTypeもレイアウトで固定値に設定されますが、これも機能します。

ただし、プログラムでウィジェットのImageViewのScaleTypeを定義するにはどうすればよいですか?原因は、ScaleTypeを値に設定したいため、ユーザーが設定で選択しました。RemoteViewsでは、ImageViewを取得できません...

私は試した:


myRemoteViews.setString(R.id.myImage、 "setScaleType"、 "CENTER");


ログファイルには次のように書かれています:関数setScaleTypeはImageViewでは使用できません。

誰かがAppWidget内でこの定義を作成する方法を知っていますか?

38
user1013443

このセグメントを使用して、プログラムで画像ビューのスケールタイプを設定できます。

 imgview.setScaleType(ImageView.ScaleType.CENTER_INSIDE);

それが役に立てば幸い...

52
ShivRaj

ImageViewのソースコードを見ると、setScaleTypeメソッドに@Android.view.RemotableViewMethod注釈。したがって、RemoteViewsインターフェイスから呼び出すことはできません。

この制限には回避策がありますが、それは見栄えがよくありません。必要なScaleTypeごとに異なるレイアウトXMLを定義し、RemoteViewsを作成する直前にそれらの中から選択します。レイアウトが複雑な場合、またはこの回避策を適用するビューが複数ある場合は、 RemoteViews.addView は、特定のImageViewレイアウトをメインレイアウト内に追加します。

私はアプリのアプリウィジェットにこの回避策(addViewを使用)を使用しています Showr 。このメソッドの問題は、ストックランチャーにバグがあることです。新しいRemoteViewsを作成してaddViewを呼び出して、既存のappwidgetのスケールタイプをchange別のImageViewレイアウトを追加します。レイアウトが変更されたことを常に認識しているわけではありません。

9
Dan Hulme

削除ビューでsetScaleTypeを呼び出す簡単な方法ではないため、私が思いついた回避策は、レイアウトで3つのimageViewを作成し、スケールタイプが選択されていないものの可視性を変更することでしたユーザー:

    // first I declared a map to associate preference values with imageView ids

    private static final HashMap<Integer,Integer> widgetImageViewIds;

    static {
        widgetImageViewIds = new HashMap<Integer, Integer>();
        widgetImageViewIds.put(MyAppPreferences.PREF_ALIGN_START, R.id.imageViewStart);
        widgetImageViewIds.put(MyAppPreferences.PREF_ALIGN_CENTER, R.id.imageViewCenter);
        widgetImageViewIds.put(MyAppPreferences.PREF_ALIGN_END, R.id.imageViewEnd);
    }

    ...

    // then when I update my widget show/hide the widgets based on the preference

    for (HashMap.Entry<Integer, Integer> entry : widgetImageViewIds.entrySet()) {
        Integer imageViewAlignment = entry.getKey();
        Integer imageViewId = entry.getValue();
        views.setViewVisibility(imageViewId, imageViewAlignment.intValue() != imageAlignmentPreferenceValue ? View.GONE : View.VISIBLE);
    }
1
Code Commander