スポンサーリンク

2016年9月30日金曜日

Android AppCompatActivity で openOptionsMenu() が機能しない

AppCompatActivity を使っていて openOptionsMenu() が機能しないことに気づきました。普通の Activity であれば以下のコードでメオプションニューを起動できます。

    View button = findViewById(R.id.menu_button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            openOptionsMenu();
        }
    });

これが AppCompatActivity では機能しません。Google はどうもアクションバー以外からオプションメニューを起動させたくないようです。アクションバーを使用しない NoActionBar という選択肢もあるのに、それでも openOptionsMenu() は機能しません。

Activity や Fragment 上に配置したボタンからオプションメニューを起動したい場合もある筈です。なのでその方法を探してみました。

2016年9月22日木曜日

Android アプリの後方互換性と前方互換性

Android アプリの互換性

Android アプリには後方互換性(backward compatibility)と前方互換性(forward compatibility)が保証されています。

これらの互換性は build.gradle の中の以下のパラメータで制御されます。

  • compileSdkVersion
  • minSdkVersion
  • targetSdkVersion

これらは使用可能な API レベルや互換性をコントロールする重要なパラメータですが、意外にも正確なところがあまり理解されていないようです。 なのでこれらのパラメータを整理してみました。

2016年9月21日水曜日

Windows10 Anniversary Update で Genymotion が起動せず

自動更新で Windows10 Anniversary Update (Version 1607)がなかなか降ってこないので、手動で更新チェックを行なったらあっさりとダウンロードが開始されました。

更新してみて、少し触ってみた限りでは、ここ何年も迷走しているスタートメニューが少し変わったくらいで、どこが使い易くなったのかさっぱり分かりません。Edge や Cortana がアップデートされたようですが、最初から使っていないし、事前のアナウンスの割にはどうでもいい更新でした。

まあそれはそれとして、困ったことに Genymotion がまったく起動しなくなってしまいました。起動しないだけならまだいいのですが、Windows そのものがクラッシュしてしまいます。久し振りに見ました、ブルースクリーン。今こんなんなってんのね。



何か情報を収集いていますが、こんなもので物事が解決した事はありません。

2016年9月10日土曜日

Android AppCompat の闇 - カスタムスタイルの落とし穴

テーマ、スタイル、アトリビュート...

Android のテーマとスタイルは謎に包まれています。Android の闇と言っていいかも知れません。

スタイルは個々の View に適用するもので、スタイルを集めたものがテーマです。テーマは Application や Activity に適用するものです。ここまでの考え方は非常にシンプルです。
しかしソースコードの中に入るとシンプルとは程遠いものです。まずややこしいのが、このテーマとスタイル、XML 的にはどちらも同じ <style> タグで定義していること。そしてシステムの themes.xml や styles.xml、attrs.xml あたりをトレースしたことがある人なら分かると思いますが、これらのファイル、定義が定義を呼びあって、肥大化し、依存関係がスパゲッティの様に絡まりあっています。悪いデザインの見本みたいなものです。まあよくこれで秩序を保っていられるなあと逆に感心してしまいます。

ここに AppCompat 系のテーマが入ってくると更に話はややこしくなります。この AppCompat が引き起こす問題について説明したいと思います。

2016年9月5日月曜日

helm のアップデートで Emacs の起動エラーが


helm は Anything の時代から、Emacs のユーザインタフェースに革新を持たらしました。今や Emacs と helm は切っても切れない関係です。しかしそれにしても helm のアップデートの激しさは異常です。Melpa の最新版を追い掛けていると、ほぼ毎日アップデートされています。もう何が何だか、更新内容なんて追跡する気にもなれません。アップデートの激しさだけからすると、よっぽどデザインが悪いんだろうなという気がします。

これだけ頻繁にアップデートされるとやはり問題が起こるものです。最近(2016年8月のいつか)のアップデートで Emacs の起動エラーが出るようになってしまいました。原因を切り分けていくと、やはり helm でした。その時は時間もなかったこともあり、helm を少し前のバージョンに戻し、そのままにしておきました。

しかしいつまでもこのままにしておくわけにもいかなので、ちゃんと調べてみました。

Android AppCompat系テーマでのカスタム View の落とし穴

現在の Android Studio で普通にプロジェクトを作成すると、テーマとして Theme.AppCompat.Light.DarkActionBar 等が使われています。いわゆる AppCompat 系のテーマです。

Android で普通にマテリアルデザインを使おうとすると Android5.0 以上が必要ですが、さすがに Android4 以下を切り捨ててしまうのは現時点ではあまり現実的ではありません。そこで AppCompat 系のテーマが使われる訳です。AppCompat 系テーマは appcompat-v7 ライブラリに含まれていることからも分かるように、APIレベル7(Android2.1) まで遡ってマテリアルデザインを使用することができます。

しかしこの AppCompat テーマには意外な落とし穴があることを発見しました。というか自分が落とし穴に嵌まっただけですが。

2016年9月2日金曜日

Android - カスタムViewにカスタムレイアウトを適用する

ViewGroup をカスタマイズする

内部に複雑なレイアウト構造を持つ ViewGroup をカスタムクラス化すると、内部が隠蔽され、レイアウトを単純な View パーツとして扱うことができます。

TextView や Button 等の単純な View をカスタム化する方法はあらゆるところで解説されていますが、LinearLayout や FrameLayout 等の ViewGroup をカスタム化する方法はあまり見あたりません。今まで自分で試行錯誤しながらやってきましたが、自分の辿ってきた道を基に、ViewGroup をカスタマイズする方法を解説したいと思います。