AndroidのBottomNavigationViewをデフォルトで使っていると、アイテムが4つ以上の場合アイコンの下にテキストが表示されたり、アニメーション機能が有効になったりと、困る場合が多いため、
「BottomNavigationViewHelper.disableShiftMode」にて独自にカスタマイズされている方もいるかと思います。
ここまでは問題ないのですが、releaseビルド時だけ、カスタマイズした機能が無効になり、以下のように崩れる現象が発生.
debugビルド時は崩れが発生せず、releaseビルドの際だけ崩れが発生したので、build.gradle内のbuildTypesの指定が怪しいと思い確認。
buildTypes {
//略
release {
//略
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//略
}
}
試しに「minifyEnabled true」を削除すると画面崩れなくビルドすることができたが、この設定を削除せずになんとかしたい。
BottomNavigationViewをカスタマイズしているソースを追っていた所、リフレクションを使っている箇所を発見
menuView.getClass().getDeclaredField("mShiftingMode");
ソース的には以下。
コレのせいだ。
import java.lang.reflect.Field;
public class BottomNavigationViewHelper {
public static void disableShiftMode(BottomNavigationView view) {
BottomNavigationMenuView hogeView = (BottomNavigationMenuView) view.getChildAt(0);
try {
Field shiftingMode = hogeView.getClass().getDeclaredField("mShiftingMode");
//〜略〜
リフレクションを使ってしまっていると、難読化した際に、メソッド名やクラス名も別の文字列に変換されてしまうため、proguard-rules.proファイルに、以下を追加し、難読化の対象から除外してやる必要がある。
-keepclassmembers class android.support.design.internal.BottomNavigationMenuView {
boolean mShiftingMode;
}
同様の現象が発生した方はぜひ試してみてください