私は、ユーザーが設定画面の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内でこの定義を作成する方法を知っていますか?
このセグメントを使用して、プログラムで画像ビューのスケールタイプを設定できます。
imgview.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
それが役に立てば幸い...
ImageView
のソースコードを見ると、setScaleType
メソッドに@Android.view.RemotableViewMethod
注釈。したがって、RemoteViews
インターフェイスから呼び出すことはできません。
この制限には回避策がありますが、それは見栄えがよくありません。必要なScaleTypeごとに異なるレイアウトXMLを定義し、RemoteViews
を作成する直前にそれらの中から選択します。レイアウトが複雑な場合、またはこの回避策を適用するビューが複数ある場合は、 RemoteViews.addView
は、特定のImageView
レイアウトをメインレイアウト内に追加します。
私はアプリのアプリウィジェットにこの回避策(addView
を使用)を使用しています Showr 。このメソッドの問題は、ストックランチャーにバグがあることです。新しいRemoteViews
を作成してaddView
を呼び出して、既存のappwidgetのスケールタイプをchange別のImageView
レイアウトを追加します。レイアウトが変更されたことを常に認識しているわけではありません。
削除ビューで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);
}