appcompat-22
Android 5.1 (API Level 22) と同時に Android Support Library, revision 22 もリリースされましたが Android 4.4 以前に Material テーマを提供する appcompat-v7 も 22 になりました。
さっそく導入してみたところボタンのデザインがマテリアル化された感じでよりマテ度が上がっていていい感じです。
appcompat-21 | appcompat-22 |
---|---|
が、例によって バグもたくさん あるようで、今回は特に致命的だったいくつかのバグの回避方法をメモしておきます。
Fragment が切り替わらない
レイアウトの XML に直接 Fragment 名を記述していると、下記のような切り替えコードを書いても切り替わらない不具合がありました。
getFragmentManager().beginTransaction()
.replace(some_id, some_fragment)
.addToBackStack(null)
.commit();
<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" />
次のようにダミーのレイアウトを設定しておくことで切り替えできるようになりました。
<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"
/>
@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 の背景がおかしい
事象は下記のスクリーンショットの通りです。
Light テーマ(Theme.AppCompat.Light) | Dark テーマ(Theme.AppCompat) |
---|---|
回避方法は上記Issueにある通り、actionModeBackground
を任意のカラーに設定するだけです。
<style name="MyAppTheme.Black" parent="Theme.AppCompat">
<item name="actionModeBackground">@android:color/black</item>
</style>
下記のほうがより自然かも。
<style name="MyAppTheme.Black" parent="Theme.AppCompat">
<item name="actionModeBackground">@drawable/cab_background_top_material</item>
</style>
<?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>
<?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 |
---|---|
物理MENUキーが効かない (2015/4/2追加)
- Issue 159795 - android - KEYCODE_MENU is broken on appcompat 22.0.0 - Android Open Source Project - Issue Tracker - Google Project Hosting
- Issue 159703 - android - No KeyEvent.Callback.onKeyDown called, when menu key pressed after updating to support library v22.0.0 - Android Open Source Project - Issue Tracker - Google Project Hosting
onKeyUp
やonKeyDown
に書いていた KEYCODE_MENU
判定処理が動作しなくなりました。
Issue159795の#5のコードにあるように ActionBarActivityDelegateBase
が奪ってしまってるようです。
onKeyUp
がダメなら dispatchKeyEvent
を使えばいいじゃない。
@Override
public boolean onKeyUp(int keyCode, @SuppressWarnings("NullableProblems") KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_MENU) {
// メニューボタン
showMyOptionsMenu(findViewById(R.id.menu_button));
return true;
}
...
}
↓
@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が適用されない
これは appcompat-21 から継続しているようですね。
上記 Issue にも書いてあるとおり、inflate
後に setPadding()
して回避しましょう。