Android Error Resource is not public

Android

Androidの画面を作る際などに、アイコンをAndroidの組み込みのものを利用すれば、早いし手間がないので、下記のようなサイトを見て
http://androiddrawableexplorer.appspot.com/
アイコンを下記のように実装しますが

    <item android:id="@+id/history"
        style="@style/MenuBackGround"
        android:icon="@android:drawable/ic_menu_agenda"
        android:title="@string/history" 
        />

Android Error Resource is not public
というエラーが出ることがあります。

なぜか、アイコンがpublicになっていないため、レイアウトから呼びだせないようです。なんででしょうねー?!

仕方ないので、自分で作った画像と同じく、アイコン画像をダウンロードして、drawableのフォルダに自分でコピーします。

Android EnumのクラスをParcelableにする

Android

IntentからIntentにいろいろな値を受け渡ししますね。
自作のクラスのオブジェクトもParcelableというインターフェースを実装することで受け渡しできますが、Enumのクラスだと、一工夫必要です。

Parcelableに受け渡せるようにできるようにするサンプルコードです。

 public enum VehicleType implements Parcelable {
    FLAT_BODY("FLAT_BODY"),
    WING("WING"),
    VAN("VAN"),
    FREEZER_CAR("FREEZER_CAR"),
    POWER_GATE("POWER_GATE");
 
    private final String name;
 
    private VehicleType(String s) {
        name = s;
    }
 
    public String toString() {
        return this.name;
    }
 
    public static VehicleType fromString(String vehicle_type_str) {
        return stringToEnum.get(vehicle_type_str);
    }
 
    private final static EnumMap<VehicleType, Integer> vehicleImageMap;
 
    public static int toIconImage(VehicleType vehicleType){
        return vehicleImageMap.get(vehicleType);
    }
    private static final Map<String, VehicleType> stringToEnum = new HashMap<String, VehicleType>();
 
    static {
 
        stringToEnum.put("1", FLAT_BODY);
        stringToEnum.put("2", WING);
        stringToEnum.put("3", VAN);
        stringToEnum.put("4", FREEZER_CAR);
        stringToEnum.put("5", POWER_GATE);
 
        vehicleImageMap = new EnumMap<VehicleType, Integer>(VehicleType.class);
        vehicleImageMap.put(VehicleType.FLAT_BODY, R.drawable.icon_car_flat);
        vehicleImageMap.put(VehicleType.WING, R.drawable.icon_car_wing);
        vehicleImageMap.put(VehicleType.VAN, R.drawable.icon_car_van);
        vehicleImageMap.put(VehicleType.FREEZER_CAR, R.drawable.icon_car_freeze);
        vehicleImageMap.put(VehicleType.POWER_GATE, R.drawable.icon_power_gate);
    }
 
    // 99.9% of the time you can just ignore this
    @Override
    public int describeContents() {
        return 0;
    }
 
    // write your object's data to the passed-in Parcel
    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeString(name);
    }
 
    // this is used to regenerate your object. All Parcelables must have a CREATOR that implements these two methods
    public static final Parcelable.Creator<VehicleType> CREATOR = new Parcelable.Creator<VehicleType>() {
        public VehicleType createFromParcel(Parcel in) {
            return VehicleType.values()[in.readInt()];
        }
 
        public VehicleType[] newArray(int size) {
            return new VehicleType[size];
        }
    };
 
    // example constructor that takes a Parcel and gives you an object populated with it's values
    private VehicleType(Parcel in) {
        name = in.readString();
    }
 };

下記を参考にさせて頂きました、ありがとうございます。

http://stackoverflow.com/questions/2836256/passing-enum-or-object-through-an-intent-the-best-solution

Android Emulator コマンドプロンプトから立ち上げる

Android
Android Studio2.3.3

AndroidのエミュレーターをWindowsのコマンドプロンプトから立ち上げる方法です。
Android StudioのAVDマネージャーから立ち上げればGUIで全部すむのに、なんでそんなめんどくさいことするの?
というと、立ち上げる時にいろんな設定ができるからです。

できること 本家サイト↓
https://developer.android.com/studio/run/emulator-commandline.html

さて、やり方は簡単で、Android Studioがインストールされているフォルダの下に、toolsというフォルダがあるので、それのemlulator.exeを使います。
ちなみに、エミュレーターはあらかじめAVDマネージャーで作っておきます。

んで、起動したいエミュレーターの名前を控えておきます。

名前とは、

 C:\Users\ユーザー名\.android\avd

の中にAVDの実態がありますが、このフォルダの名前の.avdを外したものです。

 Nexus_10_API_23_2.avd

というフォルダがあれば、

 C:\Android\AndroidStudio\tools>emulator @Nexus_10_API_23_2

とやります。

オプションつけて実行したいときは、次のような感じですね。

 C:\Android\AndroidStudio\tools>emulator @Nexus_10_API_23_2 -dns-server 192.168.1.1

とはいえ、筆者はDNSのサーバーの変更がこれでうまく行きませんでした。[sad]
なので、あまり参考にならないかもしれません…。

Android Emulator Consoleを使ってみる

Android
Android Studio2.3.3

Androidのデバイスをエミュレーターやら実機やらなんかしらコントロールするためには、今までADB(Android Debug Bridge)とかを使っていたと思いますが、エミュレーターに関しては、エミュレーター コンソールというものがいつの間にかできていたようです。

ADBについてはこちら↓
Android ADBを利用する

このエミュレーター コンソールについて、わからないことがかなりあったので、書いておきます。

公式サイトの説明はこちら↓
https://developer.android.com/studio/run/emulator-console.html

エミュレーターを一つ立ち上げておきます。

Windowsだったら、コマンドプロンプトを立ち上げ、

 telnet localhost 5554

とやります。

んで、接続できたと思ったら

 event

などのコマンドを打ち込んでも

 unknown commands

となってしまいます。(つД`)

色々調べていたら、認証が必要なんだとか…

 .emulator_console_auth_token

というファイルが、C:\ユーザー\ユーザー名 のどっかにあります。
それをテキストエディタなどで開いてその値をコピーします。

 auth auth_tokenの値

と打ち込みます。

これで、やっといろいろな操作がAndroid Emulator Consoleでできるようになりました!

Android Eclipse MATでメモリーリークの可能性がある画像が何かをつきとめる

Android
Eclipse

Android Eclipse MATでメモリーリークの可能性がある画像が何かをつきとめる

MATと言えば、マット・デーモンでもなく、マット・ボマーでもなく、Eclipseのプラグイン、Memory Analyzer Toolですね。

MAT自体のインストールや使い方は、下記のブログさんが大変参考になりました。m(_ _)m

http://tlync.hateblo.jp/entry/20111220/1324372308

で、じゃあ色々わかった時に、Leak Suspects(メモリーリークの疑いがあるやつら)の中に、Bitmap画像が入っていた時に、多少テクニックが必要だったので、書いておきます。

↓の記事が大変参考になりました。

MAT (Eclipse Memory Analyzer) – how to view bitmaps from memory dump
http://stackoverflow.com/questions/12709603/mat-eclipse-memory-analyzer-how-to-view-bitmaps-from-memory-dump

下記は、とりあえずの上記サイトの和訳です。

  • GIMPをインストールする
  • BitmapオブジェクトのmBufferフィールドを右クリックし、 “Copy” -> “Save Value To File” を選択、 どこかに保存する
  • GIMPで上記で保存したファイルを開く
  • “Load Image from Raw Data”を選択
  • RGBかRGBアルファなどの形式を選択するダイアログになりますが、おそらくRGBアルファでOK
  • 画像の縦と横を入力

私が止まってしまったのは、この最後の 画像の縦と横を入力しなければいけないところです。
上記の人は、さらっとMATで見れるよ~ 的なことを書いてあります。

縦と横?どこにあるの??

それは次の手順で見れます。

  • EclipseのWindow→Show View→Other→Memory Analyzer Views→Inspectorを開きます。
  • Inspectorのビューは、MATのオブジェクトを選択すると、連動して色々な情報を表示してくれます。
  • MATのメインのビューでLeak Suspectsから、怪しいオブジェクトを選択し、mBitmapを選択します。
  • すると、InspectorにAttributesという画面に、画像の縦幅と横幅が表示されます。

mat_inspector.png