SCREEN_ORIENTATION_REVERSE_LANDSCAPE

先日、こちらに端末の回転対応について書きましたが、そこにある方法では不十分なことが分かりました。Galaxy SとXPERIA ARCは逆さの横持ちに対応しています。横持ちは通常端末を反時計回りに回転させますが、その反対でも横向き画面になります。僕が持っているos2.1の端末は、この状態に対応していません。どうやら、os2.2以降だと逆さの縦持ちもアリのようですが、上記端末ではこれはサポートしていないようです。で、Galaxy S(まだ2.2.1を我慢しながら開発に使用中)とXPERIA ARCでは、逆さ横持ちの状態で画面の回転に応答しないようにすると、こちらで触れたコードでは(当然ですが)画面が逆になってしまいます。SCREEN_ORIENTATION_REVERSE_LANDSCAPEにしないといけないからです。で、次のコードにしました。(逆さの横持ち、縦持ちの定義はos2.3以降にしかないので、それより前の端末ではその状態をサポートしているものがあったら、Webによるとあるようですが、下記のコードでは対応できません。Galaxy Sもそうです。)
    public static void setFixedOrientation(Activity activity,Context context,boolean fixed)
{
if(fixed)
{
Configuration config = context.getResources().getConfiguration();
int orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; // warning回避
Display display = ((WindowManager)context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int rotation = display.getRotation();
boolean use_reverse_mode = false;
if(Build.VERSION.SDK_INT >= 9 && (rotation == Surface.ROTATION_180 || rotation == Surface.ROTATION_270))
{
use_reverse_mode = true;
}
if(config.orientation == Configuration.ORIENTATION_LANDSCAPE)
{
if(use_reverse_mode)
{
orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
}
else
{
orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
}

}
else if(config.orientation == Configuration.ORIENTATION_PORTRAIT)
{
if(use_reverse_mode)
{
orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
}
else
{
orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
}
}
activity.setRequestedOrientation(orientation);
}
else
{
//this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
}

それから、端末の回転対応についてはこちらも必見です。

 

厄介な端末の回転対応

画面のレイアウトを縦と横で分けて、それぞれに最適化した方が良い画面もあります。カレアラは端末を回転させてもActivityが再生成されないようにして(そのように割り切って)いましたが、現在開発中のアプリは、Android Layout Cookbookを教科書にしてUIに力を入れ始めているので、きちんと回転対応した方が良い画面はそのようにしています。が、そうすると端末の回転でActivityが再生成されるため、厄介なことが起きます。はい、基本的な対応方法はLayout Cookbookにも書かれていますが、次のようなケースを考えると、いちいち対応するのはとっても大変です。

  • AlertDialogを表示してユーザーに選択をさせている最中に端末を回転させた。

  • 時間のかかる処理をAsyncTaskで行い、プログレスを表示している最中に端末を回転させた。


端末の回転で、縦・横画面に最適なレイアウトを提供したいのですが、上記のようなケースに対応するにはコストがかかり過ぎるなと思いました。で、ふとこう思いました。上記のような、都合の悪い状態では回転させなくてもいいのではないか。どうせ見ているのはAlertDialogかプログレスバーぐらいなのだから。で、それらを閉じたら自動で端末の状態に応じて回転すればいいじゃないか。無理かなーと思いつつ調べたらありました。その方法が。これを使って、都合の悪い状態に入る前に向きを固定し、そこから出たら回転可能に戻しました。僕としてはこれで満足です。AsyncTaskを使っている最中にActivityを再生成して元に戻すコードを書いて大きなバグを作り込むよりはよっぽどいいと思います。とにかく品質第一だし。(UIを良くしてForceCloseさせたら本末転倒、、、って言い訳っぽいなあ。でも僕はこの現実解が好きです。)

 

ダイアログのカスタマイズ

Android Layout Cookbookに書かれていることに影響を受けて、現在開発中の2本目のアプリはUIをターゲットユーザー向けに大幅に変更することにしました。この書籍、ソースコードが充実しているのでとても助かっています。書籍によっては、ダウンロードできるソースコードは「全て」ではなくて、書籍の内容の一部であることもあり、そう言う時はがっかりしますが、Android Layout Cookbookは見たところ全部入っています。で、これまで避けてきたUIのカスタマイズをまじめに始めています。(この書籍はたくさん売れると思います。)

で、AlertDialogのカスタマイズでつまづいています。それ自体の説明は書籍にはなく、こちらを参考に変更しているのですが、期待した結果になりません。うーん。どうしてだろう。OS2.2ぐらいだと、AlertDialogをテーマの変更ではいじれないのかな。

 

 

クラッシュレポート機能が更新されました

クラッシュレポート機能は、Googleのサーバー(Google document)にレポートを送信しますが、その仕様が変更になったそうです。そのため、クラッシュレポート(ACRA)のライブラリーが更新されました。これに伴い、カレアラを更新しました。1.04.0です。

 

Android Layout Cookbook

今日書店に寄ったので「Android Layout Cookbook」を手に取り、役に立つと思ったので購入しました。Amazonには辛口のコメントもありましたが(読み辛いとか)、僕はそうは思いませんでした。あんざいさんの主張には迎合できないものもありますが、良い書籍だと思います。早速、今取り組んでいるアプリのUI関係で活用させてもらいました。

それから、著者のあんざいゆきさんのブログにはいつも、とてもお世話になっています。