2018年6月16日土曜日

[Android SDK] targetSdkVersion 26に変更したらRemoteViewsで例外が発生して対処

メモガキのtargetSdkVersionを24から26に変更する作業を進めていたら、ウィジェット設定画面でウィジェットのプレビューが表示され無い問題に気づきました。



となるところが、



上部のプレビューが消えてしまいました。
このウィジェットのプレビューは、AppWidgetHostViewを利用してActivity中にAppWidgetを表示するビューを作成しています。

Android StudioのLogcatを確認すると、
android.widget.RemoteViews$ActionException: view: android.support.v7.widget.AppCompatImageView can't use method with RemoteViews: setImageBitmap(class android.graphics.Bitmap)

と出力されているため、AppCompatImageViewがAppWidgetで使えないことが原因であることはすぐに気づきました。
どこかの処理で、ImageViewがAppCompatImageViewに置き換えられてしまったようです(レイアウトファイルは変更していないから)。

試行錯誤していたら、rv.applyに対してContextを指定している箇所を、Activity(AppCompatActivity)からApplicationContextに変更して解決しました。
AppWidgetHostView hostView;
RemoteViews rv;
rv.apply(getApplicationContext(), mPreviewWidget);

hostView.removeAllViews();
//View view = rv.apply(this, hostView);
View view = rv.apply(getApplicationContext(), hostView);
hostView.addView(view);

targetSdkVersionを変えた際にsupport.v4のバージョンも変更したから、AppCompatActivityの挙動が変わったようですね。