14
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Support Library v23.2系へバージョンを上げた際に起きた不具合事例とその対策

Posted at

概要

Support Libraryのバージョンをv23.1からv23.2.1にバージョンを上げたところ、デザインが崩壊したためそれに対応した際のメモです。

バージョンを上げたことによって発生した問題

タブのセルが正しく描画されなくなった

RecyclerViewをベースに作成した無限(擬似)SlidingTabのレイアウトが以下のGifのように崩れました。

qiita1.gif

onConfigurationChanged時にタブのリサイズが上手く動作しない

AndroidManifestでActivityにandroid:configChanges="orientation|screenSize"を指定しています。これによって画面回転時にAcitvityが破棄されなくなります。画面の回転を検知するとonConfigurationChangedメソッドが呼ばれるので、onConfigurationChangedをオーバーライドしタブのセル幅をリサイズしています。

これはタブのセルが正しく描画されるよう修正した後に気づいたのですが、画面を回転させた際にタブのリサイズが上手くできていませんでした。

qiita2.png

原因と解決方法

タブのセルが正しく描画されない問題

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;

qiita3.png

portrait固定の画面であればDisplayMetricsをResourcesから取得してもWindowManagerから取得しても問題ないと思います。ただDisplayMetricsのドキュメントにもWindowManagerから取得する方法が載っていますし、displayMetricsを利用する時はWindowManagerを利用するようにしていこうと思います。ドキュメント読むの大切...

まとめ

Support Library v23.2系へバージョンを上げた場合

  • RecyclerViewを使用している箇所でレイアウトが崩れたなら寸法指定を確認しWRAP_CONTENTを試す
  • ResourcesからDisplayMetricsを取得している場合、onConfigurationChanged時等に正しい値が取れないのでWindowManagerからDisplayMetricsを取得する

参考

14
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?