Android Error inflating class com.google.android.maps.MapView

Android

Android Error inflating class com.google.android.maps.MapView

Android のMapviewが表示されないというこのエラー。
検索してみるとAndroidManifest.xmlで

 <uses-library android:name="com.google.android.maps"/>

を宣言していない場合、あとActivityをMapActivityを継承して作っていないことが原因、とありますが、その二つともやってあるのになんで?とだいぶ試行錯誤してしまいました。

原因は、

 super.onCreate(savedInstanceState);

がOnCreate内の後の方で宣言されていたことでした。(^_^;

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でできるようになりました!