39
40

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.

appcompat-22 のバグを回避する

Last updated at Posted at 2015-03-30

appcompat-22

Android 5.1 (API Level 22) と同時に Android Support Library, revision 22 もリリースされましたが Android 4.4 以前に Material テーマを提供する appcompat-v7 も 22 になりました。

さっそく導入してみたところボタンのデザインがマテリアル化された感じでよりマテ度が上がっていていい感じです。

appcompat-21 appcompat-22
2015-03-16 13.05.05s.png 2015-03-16 13.05.17s.png

が、例によって バグもたくさん あるようで、今回は特に致命的だったいくつかのバグの回避方法をメモしておきます。

Fragment が切り替わらない

Issue 160714 - android - AppCompat 22.0.0 FragmentTransaction replace bug - Android Open Source Project - Issue Tracker - Google Project Hosting

レイアウトの XML に直接 Fragment 名を記述していると、下記のような切り替えコードを書いても切り替わらない不具合がありました。

getFragmentManager().beginTransaction()
                    .replace(some_id, some_fragment)
                    .addToBackStack(null)
                    .commit();
activity_gallery_image_picker.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="fill_parent" android:layout_height="fill_parent"
              android:orientation="vertical">

    <fragment
        android:name="com.twitpane.ui.GalleryFolderPickerFragment"
        android:id="@+id/fragment1"
        android:layout_width="wrap_content"
        android:layout_height="0dip"
        android:layout_weight="1"
        tools:layout="@layout/fragment_gallery_folder_picker" />

次のようにダミーのレイアウトを設定しておくことで切り替えできるようになりました。

activity_gallery_image_picker.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent" android:layout_height="fill_parent"
              android:orientation="vertical">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="0dip"
        android:layout_weight="1"
        android:id="@+id/mainContent"
        android:orientation="vertical"
        />
GalleryImagePicker.java
    @Override
    public void onCreate(Bundle savedInstanceState) {
...
        //---------------------------------------
        // 初期Fragment(フォルダ一覧)表示
        //---------------------------------------
        final Fragment f = new GalleryFolderPickerFragment();
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.mainContent, f)
                .commit();
    }

そもそもXMLに直接fragment書いてたのに切り替えできていたappcompat-21までがおかしいのかも。

DarkActionBarテーマで ActionMode の ActionBar の背景がおかしい

Issue 160033 - android - Wrong background in Action Mode for DarkActionBar. - Android Open Source Project - Issue Tracker - Google Project Hosting

事象は下記のスクリーンショットの通りです。

Light テーマ(Theme.AppCompat.Light) Dark テーマ(Theme.AppCompat)
2015-03-17 01.50.01s.png 2015-03-17 01.44.34s.png

回避方法は上記Issueにある通り、actionModeBackground を任意のカラーに設定するだけです。

styles.xml

    <style name="MyAppTheme.Black" parent="Theme.AppCompat">
        <item name="actionModeBackground">@android:color/black</item>
    </style>

下記のほうがより自然かも。

values/styles.xml
    <style name="MyAppTheme.Black" parent="Theme.AppCompat">
        <item name="actionModeBackground">@drawable/cab_background_top_material</item>
    </style>
drawable/cab_background_top_material.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
            android:paddingMode="stack">
    <item android:drawable="@drawable/theme_accent_background" />
    <item android:bottom="2px" android:drawable="@drawable/theme_dark_background" />
</layer-list>
values/colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <drawable name="theme_dark_background">@color/primary_material_dark</drawable>
    <drawable name="theme_accent_background">@color/accent_material_dark</drawable>
</resources>
@android:color/black cab_background_top_material
2015-04-05 15.17.12s.png 2015-04-05 15.16.28s.png

物理MENUキーが効かない (2015/4/2追加)

onKeyUponKeyDownに書いていた KEYCODE_MENU 判定処理が動作しなくなりました。

Issue159795の#5のコードにあるように ActionBarActivityDelegateBase が奪ってしまってるようです。

onKeyUp がダメなら dispatchKeyEvent を使えばいいじゃない。

MainActivity.java
    @Override
    public boolean onKeyUp(int keyCode, @SuppressWarnings("NullableProblems") KeyEvent event) {
        
        if (keyCode == KeyEvent.KEYCODE_MENU) {
            // メニューボタン
            showMyOptionsMenu(findViewById(R.id.menu_button));
            return true;
        }

        ...
    }

MainActivity.java
    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {

        final int keyCode = event.getKeyCode();
        if (event.getAction() == KeyEvent.ACTION_UP) {

            if (keyCode == KeyEvent.KEYCODE_MENU) {
                // メニューボタン
                showMyOptionsMenu(findViewById(R.id.menu_button));
                return true;
            }
        }

        return super.dispatchKeyEvent(event);
    }

レイアウトXMLに記述したボタンのpaddingが適用されない

Issue 161359 - android - appcompat-v7 v22 XML button padding ignored - Android Open Source Project - Issue Tracker - Google Project Hosting

これは appcompat-21 から継続しているようですね。

上記 Issue にも書いてあるとおり、inflate 後に setPadding() して回避しましょう。

39
40
2

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
39
40

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?