概要
Support Libraryのバージョンをv23.1からv23.2.1にバージョンを上げたところ、デザインが崩壊したためそれに対応した際のメモです。
バージョンを上げたことによって発生した問題
タブのセルが正しく描画されなくなった
RecyclerViewをベースに作成した無限(擬似)SlidingTabのレイアウトが以下のGifのように崩れました。
onConfigurationChanged時にタブのリサイズが上手く動作しない
AndroidManifestでActivityにandroid:configChanges="orientation|screenSize"
を指定しています。これによって画面回転時にAcitvityが破棄されなくなります。画面の回転を検知するとonConfigurationChanged
メソッドが呼ばれるので、onConfigurationChangedをオーバーライドしタブのセル幅をリサイズしています。
これはタブのセルが正しく描画されるよう修正した後に気づいたのですが、画面を回転させた際にタブのリサイズが上手くできていませんでした。
原因と解決方法
タブのセルが正しく描画されない問題
v23.2系でRecyclerviewにサイズの自動調整機能が実装されたのが原因でした。したがって、タブのセルに利用してたレイアウトの寸法値の指定をMATCH_PARENT
からWRAP_CONTENT
に変更することでレイアウトの崩れを解消することができました。
onConfigurationChanged時にタブのリサイズが上手く動作しない問題
タブをリサイズする際に以下のコードで画面幅を取得し、タブのリサイズに使用していました。
@Override
protected void onConfigurationChanged(final Configuration newConfig) {
super.onConfigurationChanged(newConfig);
int displayWidth = getResources().getDisplayMetrics().widthPixels;
// タブのリサイズ処理
}
タブのリサイズに失敗する原因を調べたところSupport Libraryをv23.2.1にバージョンを上げた場合、getResources().getDisplayMetrics().widthPixels
で取得するwidthPixelsが、portrait時の画面幅のまま更新されていませんでした。
このため、画面幅の取得方法をWindowManagerから取得する方法に変更したところ、画面の回転に応じた画面幅を取得でき、タブのリサイズも問題なく動作するようになりました。
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics displayMetrics = new DisplayMetrics();
windowManager.getDefaultDisplay().getMetrics(displayMetrics);
int displayWidth = displayMetrics.widthPixels;
portrait固定の画面であればDisplayMetricsをResourcesから取得してもWindowManagerから取得しても問題ないと思います。ただDisplayMetricsのドキュメントにもWindowManagerから取得する方法が載っていますし、displayMetricsを利用する時はWindowManagerを利用するようにしていこうと思います。ドキュメント読むの大切...
まとめ
Support Library v23.2系へバージョンを上げた場合
- RecyclerViewを使用している箇所でレイアウトが崩れたなら寸法指定を確認し
WRAP_CONTENT
を試す - ResourcesからDisplayMetricsを取得している場合、onConfigurationChanged時等に正しい値が取れないのでWindowManagerからDisplayMetricsを取得する
参考
-
http://developer.android.com/intl/ja/tools/support-library/index.html
- Support Libraryの変更点についての概要
-
https://speakerdeck.com/androhi/support-library-v23-dot-2-overview
- 情報がまとまっていてとても参考になりました。