Android Studioの備忘録


Android開発で調べたこと、ハマったところなどのメモ書きです。

# Android Studioの設定関係

## AVDの起動時にHAXM関係のエラー

AVDに「HAXM」が必要なのでインストールしてみましたが、「HAXM cannot be installed until VT-x is enabled.」というエラーが出ました。

BIOSで[セキュリティ]項目→[システムのセキュリティ]→[仮想化技術(VTx)]を無効から有効に切り替えて、解決しました。
※ThinkPad T460sで確認
http://ameblo.jp/hunnyjams/entry-11947648966.html


## キーマップの設定
「一行削除」のショートカットは`Ctrl+Y`で、`Ctrl+D`ではない。
[Settings>Keymap」から、Eclipseなど他の環境のキーマップを利用できる。
http://qiita.com/decchi/items/f8603ccccec03a71a4d9
ただし「Default」以外は、割り当てられているショートカットが少ない。
たとえば、「Override methods」のショートカットは、Eclipseキーマップでは割り当てられていない。


## SDK Mangerの開き方
「Tools > Android > SDK Manager]


## GitHubと連携する方法
「VCS>Import into Version Control」


## Logcatに表示されない場合の確認方法
* エラー種別(verbose, debug...)
* 検索Filter

![Logcat.PNG](https://qiita-image-store.s3.amazonaws.com/0/37903/a30e180e-c1e6-2704-03bb-c46dab1e0e48.png)


## Lamda式を使う方法
build.gradleに

```gradle:build.gradle
android {
  defaultConfig {
    jackOptions {
      enabled true
    }
  }
}
```

http://stackoverflow.com/questions/37004069/errorjack-is-required-to-support-java-8-language-features

## keytoolコマンドはJavaのコマンド
Androidが用意しているコマンドだと思っていた。。。


## Android Device Monitor
Android上のファイルを確認できる。
[Tool->Android->Android Devcie Monitor]
https://www.crunchtimer.jp/blog/technology/android/3743/

## JavaDocの表示が遅い場合
[Ctrl+Q]で、カーソル上のクラスのJavaDoc Referenceを閲覧できます。
ネットワーク接続速度が遅いと、「Fetching Documentation....」が表示された状態で、少し待たされます。
ローカルにSDK Documentationをダウンロードして、それを参照すれば速くなります。
その

1.[ Android SDK Manger -> SDK Tool]で、[Documentation for Android SDK]をダウンロードする
2. `sdk.table.xml`を開く。Windowsならばパスは、`%HOMEPAT%\.AndroidStudio2.3\config\options\jdk.table.xml`  .
3. `http://developer.android.com/reference/`を`file://$USER_HOME$/AppData/Local/Android/sdk/platforms/android-22/data/res` に置換する。バージョンは各自の環境に合わせる。

http://stackoverflow.com/questions/23378610/android-studio-quick-documentation-always-fetching-documentation

## `.gitignore`に追加すべき項目
* デフォルトの`gitignore`だけだは設定が不十分だったので、無視するファイルを追加しました。
* 下記ファイルは、Android Studio 3.1.2で作られたものです。
* https://github.com/github/gitignore/blob/master/Android.gitignore 参考

```plaintext:.gitignore
# プロジェクト生成時に自動的に生成される部分
*.iml
.gradle
/local.properties
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
.DS_Store
/build
/captures
.externalNativeBuild

# あとから追加した部分
/.idea/caches
/.idea/misc.xml
/.idea/compiler.xml
```

---------------------------------------------------
# Android Studioのショートカット(Default)

* Override methods: [Ctrl+O]
* Next/previous highlighted error: [F2] / [Shift+F2]

## Main Menu
* 定義箇所へ移動(Declaration): [Ctrl+B]
* View External Documentation: [Shift+F1]
* Rename: [Shift+F6]
* 型階層(Type Hierarchy): [Ctrl+H]
* Redo: [Ctrl+Shift+Z]
* Hide Active Tool Window: [Shift+ESC]
* Quick Documentation: [Ctrl+Q]
* External Documentation: [Shift+F1]

## Editor Actions
* Delete Line: [Ctrl+Y]
* Show Intention Actions: [Alt+Enter]
* Find in Path: [Ctrl+Shift+F]
* Hierarchy Caller of toast: [Ctrl+Alt+H]
* Search Everywhere: Shiftキーを2回押す
* Recent File(最近のファイルを開く): [Ctrl+E]
* Move Caret to Matching Brace(対応する括弧に移動する) : [Ctrl+Shift+M]
* Reformat Code(コード整形) : [Ctrl+Alt+L]


## Other
* Tool Windowは[Ctrl+数字]で開く


------------------------------------
# コーディング
* ジェスチャー操作は、`GestureDetecotr`クラスの`onTouchEvent`に`View.onTouchEvent`を渡す


## Event
* 次のリスナーに処理をまかせる場合はfalseを指定する。


## View

### RadioButtonオブジェクトに`setId(1)`で、`Expected Resource of type id`というエラーが出る

```js
        RadioButton radio1 = new RadioButton(this);
        radio1.setId(View.generateViewId());
```

http://stackoverflow.com/questions/24682007/assign-a-view-id-programmatically-in-android


### WebViewでHTMLを表示すると「Webpage not available」と言われる
マニフェストファイルに「インターネットアクセス権限設定」を設定。

```xml:AndroidManifest.xml
 <uses-permission android:name="android.permission.INTERNET"/>
```

### Gravityで左上寄せを指定

`|`を使って指定する。

```
Gravity.LEFT|Gravity.TOP
```

### TableLayoutが表示されない
`TableLayout.LayoutParams`と`TableRow.LayoutParams`を間違えて、「表示されない」という問題にハマりました。

```java
for (int i=0; i<ROW_SIZE; i++) {
	TableRow row = new TableRow(this);
	row.setLayoutParams(new TableLayout.LayoutParams(MP,WC));
	layout.addView(row);
	for (int j=0; j<COL_SIZE; j++) {
	    Button button = new Button(this);
	    button.setText("sample");
//	    button.setLayoutParams(new TableLayout.LayoutParams(WC,WC)); //【間違い】表示されなくなる
	    button.setLayoutParams(new TableRow.LayoutParams(WC,WC)); //【正解】
	    row.addView(button);
	}
}
```

http://blog.livedoor.jp/shizuku_kun/archives/51404514.html

### タイトルバーが非表示にならない

`requestWindowFeature(Window.FEATURE_NO_TITLE);` を実行してもタイトルが消えなくてハマった。
原因は`Activity`を継承すべきところを、`AppCompatActivity`を継承していた。
`AppCompatActivity`はアクションバーを表示するためのactivity。

------------------------------------
# 疑問点
* AndroidとGradleの関係
* logcatの使い方
* 日本語のAndroid Referenceを簡単に閲覧する方法
* SurfaceViewでエラーが出る理由
* AndroidのサイズをgetWidth, getHeight使わずに知る方法
* Emulatorと実機は、どちらが速い？
* LayoutParamsにはwidth, heightを指定と書いてあるのに、WRAP_CONTENTを指定するのはなぜか？
* ViewクラスとLayoutクラスの違い
* 一番最後のXMLLayoutのImageButtonに画像が表示されなかった
* PNG 9patch
* twitterからWebが閲覧できる仕組みは？
* WebViewとブラウザのバージョンの関係は？
* Gradleがわからない
* `16:24	AssertionError: No DOM at XML. Parent=XmlTag:fragment; attribute=PsiElement(XML_ATTRIBUTE); second attempt=null
* コンパイルエラーがあると、buildできない。
* gradleの時間がかかる
* `Error: Activity class {com.example.yuji3.helloworld/com.example.yuji3.helloworld.ButtonEx} does not exist.`というエラー
* `android.R.drawable`の画像一覧
* `MenuItem.setShowAsAction`の使い方.`setShowAsAction`を実行しないとアイコンは表示されない？
* [teratail] `MenuItem.onOptiosItemSelected`とListenerを紐づけなくてもよい理由は？
* 2種類あるbuild.gradleの違いが分からない
* `AppCompatActivity`の本来の使い方

------------------------------------
# 覚えたこと

* dex: Dalvik Executableの略
* `android.R.drawable`の画像一覧を下記サイトで確認できる
http://androiddrawables.com/
* res/values/color.xmlに記載された要素を、`@color`で参照できる


------------------------------------
# その他感想

* `setContentView`メソッドの実行忘れで、画面表示されない
* gradleでエラーになった場合は、まず「Clean Project」を実行した方がよい。
* SQLiteの使い道がよく分からない

------------------------------------
# 書籍の感想

## Android プログラミングバイブル
* HashMapで宣言している。
* Javaのバージョンについて書かれていない
* 不要なキャストあり
* Javaの説明しないと言っているのにforループなどの説明がある
* XMLレイアウトの説明が一番最後に書かれている
* サンプルコードのマニフェストファイルの記述場所が悪い。Javaの解説が終わった後にマニフェストファイルのサンプルがあるため、「Javaのサンプル完了！あれ？動かない。。。マニフェストファイルの追記が必要だった」というのがある。
* 

------------------------------------
# ハッカソンの準備

## 持ち物
* ノートパソコン
* 延長コード
* マウス
* android用USBケーブル
* 筆記用具
* テザリングできる環境
* ヘッドセット？
* USBメモリ

## PCの準備
* Android Studio
    - Android SDK
    - 環境設定
    
* GitHubを使えるGit
* DropBoxでファイル共有

## 環境設定
* File Encoding: UTF-8
* 

### あると便利なライブラリ 

```gradle:build.gradle
dependencies {
    compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.5'
    compile group: 'commons-io', name: 'commons-io', version: '2.5'
}
```

* commons-lang
* commons-io
* lombok
http://qiita.com/Mr_Legacy/items/c6d6cf39a7c0c48f27ec


------------------------------------
# Android端末

## apkファイルの作成
「Build>Generate Signed APK」

## 自分の端末情報
「DIGNO(R) rafre KYV36」、Android 5.1.1(API Level22)。


## 「アプリはインストールされていなせん」というエラー
インストール時に表示されるエラー。
既に同じ名前のアプリが存在する場合などに、出てくる。
http://qiita.com/orangain/items/a70f5b774296e609fb75
http://nobollel-tech.hatenablog.com/entry/2016/08/10/154255