2018年6月16日土曜日

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

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



となるところが、



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

Android StudioのLogcatを確認すると、
  1. 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に変更して解決しました。
  1. AppWidgetHostView hostView;  
  2. RemoteViews rv;  
  3. rv.apply(getApplicationContext(), mPreviewWidget);  
  4.   
  5. hostView.removeAllViews();  
  6. //View view = rv.apply(this, hostView);  
  7. View view = rv.apply(getApplicationContext(), hostView);  
  8. hostView.addView(view);  

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

1 件のコメント:

atushi さんのコメント...

有益な情報をありがとうございます。
ウィジェットのプレビューについてもうちょっと考え方を教えて頂けますか?コードでも結構ですので。
RemoteViews.apply を直接hostViewにできるんですか?

コメントを投稿