ADT 20 でRelease用にビルドして設定を開いたらクラッシュする件

PreferenceActivity から PreferenceFragment を継承したクラスをロードするところで...。

AndroidRuntime: java.lang.RuntimeException:
    Unable to start activity ComponentInfo{xxx/xxx.activity.TabletSettingActivity}:
    android.app.Fragment$InstantiationException:
    Unable to instantiate fragment xxx.activity.SettingActivity$CheckFragment:
    make sure class name exists, is public, and has an empty constructor that is public
    :
Caused by: java.lang.ClassNotFoundException: xxx.activity.SettingActivity$CheckFragment
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
    at android.app.Fragment.instantiate(Fragment.java:574)

いままで問題が無かったのにどうして問題が起こったのか...
ADT 18 の ${sdk.dir}\tools\proguard\proguard-android.txt には↓この行があったが、ADT 20 では無くなっていた。

-keep public class * extends android.app.Fragment

ADT 20 からは、xml から参照されているActivityやFragmentは勝手に -keep class されるようになったらしい。おかげで無駄に -keep class することがなくなり、以前に比べて apk のサイズが縮むようになった。
勝手に -keep class されたものは bin/proguard.txt で確認できた。
ただ、どういうわけか

android:fragment に記述した class は自動的に -keep class してくれてないみたいで、これが原因で ClassNotFoundException がおこってた。
とりあえず、手動で追加して対処。

-keep class * extends android.preference.PreferenceFragment

Activityのアニメーションの制御

ひとつのActivityから複数のActivityを順番に呼び出すとき。

  1. A から B を呼び出す
  2. B が結果を返す
  3. A から C を呼び出す
  4. C でBACKが押された
  5. A から B を再び呼び出す

今作ってるアプリで、5 番目の画面遷移が Close ではなく Open のアニメーションになってしまい(戻る操作なのに進むアニメーションになってしまう)、すごく違和感があって気になっていたんだけど、回避方法があるんですな。

Android 2.1 から利用可能。

こんな感じで使ってみた。

static void setActivityAnimation(Activity activity, boolean forward) {
    if (!forward) {
        Theme theme = activity.getTheme();

        TypedValue tv = new TypedValue();
        theme.resolveAttribute(android.R.attr.windowAnimationStyle, tv, true);

        TypedArray ta = theme.obtainStyledAttributes(tv.resourceId, new int [] {
            android.R.attr.activityCloseEnterAnimation,
            android.R.attr.activityCloseExitAnimation,
        });
        int enterAnim = ta.getResourceId(0, 0);
        int exitAnim = ta.getResourceId(1, 0);
        ta.recycle();

        activity.overridePendingTransition(enterAnim, exitAnim);
    }
}

1つ前の画面を呼び出すときに、戻ってるアニメーションになり違和感が無くなった。

HTC One S

Galaxy Nexus があまりにもカクカクしすぎなので、ほかの Android 4.0 以降の端末が気になってたので購入。
Galaxy Nexus と違ってCPUが Snapdragon S4 というやつで、ベンチマークでは Galaxy Nexus よりだいぶ良いって話だったので期待していたんだけど、使った感じでは Xperia ray なんかの「古い端末 + 古いOS」の方が動きがスムースですなぁ...。

HTC One S を起動してまず気になったのはディスプレイの質が悪いこと。ペンタイルだしすごくギラギラしてる。少し斜めから見ただけで色が変わるのも気になった。

UIはこれまでのHTC端末同様でかなり独特だし見た目もあまりかっこよくないですな。ブラウザやギャラリーも独特で素のAndroidに慣れていると戸惑う。
個人的にはこれならSonySHARPのガラスマのほうがおすすめできますな。もちろんAndroidの中で選ぶならだけど。

端末にMENUキーが無いので、画面上にMENUボタンが表示されてる図。(BACKやHomeはキーがついてるので画面に出てこない)

7インチで1280x800の端末

7インチで高解像度の端末が無かったので購入。
density は 1.3312501 。

この端末もなぜかドットバイドットでスクリーンキャプチャが撮れなくてボケてる。たまにこういう端末があるけどなんなんだろう...。

このスクリーンショットではわかりにくいけど、マーケットの背景にある斜線の部分が、この端末ではギザギザに見えてしまう。densityが中途半端だからなのかな。


電源用のコネクタとケーブルがごつい...。PCと接続するためのUSB端子はカバーをあけなければアクセスできず、個人的にはちょっと不便。

Android端末をはじめてテレビにつなげてみたけど、結構パフォーマンスが落ちますな。この端末だけかもしれないけどHDMI接続するとタッチの反応がものすごく悪くなり、マルチタッチはほとんど認識できなくなってしまった。

16:10の画面は横にすると高さが窮屈で、縦にすると幅が窮屈に感じてしまう。7インチでは特にそう思う。画面長すぎって。
4:3や3:2の端末も出てきて欲しい。

Galaxy Nexus で下に MENU ボタンを表示する

targetSDK >= 11 だと MENU ボタンが出なくなるけど、Galaxy Nexus

requestWindowFeature(Window.FEATURE_NO_TITLE);

としたところ MENU ボタンが出てきた。当然 ActionBar もでない。(targetSDK >= 14 だと出ない)
残念ながら Android 3.1 と 3.2 ではこの方法でもMENUボタンは表示されず。


EditText はどうなるのかと思ったが、必要になったときに ActionBar が出てきました。
ActionBar が出てくるタイミングで画面がずれるのであまりかっこよくはないけど、使えないことも無いレベル。


ActionBarのボタンは長押しするとボタンの説明テキストが出てくるという、Windows 端末ぽい動作になっていた。