【Android/Kotlin】細かい注意点2

## ボタン押下でダイアログフラグメントを表示する
注意：getSupportFragmentManager()をgetFragmentManager()とするとエラーになる。
  
```HogeActivity.java
Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //ダイアログを表示する
                DialogFragment dialog = new DialogFragment();
                // 表示  getSupportFragmentManager()は固定、sampleは識別タグ
                dialog.show(getSupportFragmentManager(), "sample");
            }
        });
```
## アラートダイアログを出すか、ダイアログフラグメントを出すか
- Activityからどちらも呼び出し可能。
- ダイアログフラグメント：デザインや処理の自由度が高い。
- アラートダイアログ：Style.xmlを適用することでデザインは可能。
- アラートダイアログ：メソッドチェーンで書いても、builder.~で処理を分けてもOK,好みの問題。

## ViewではないものにR.stringやR.colorを適用する
```strings.xml
<resources>
<string name="error_message">20文字以内で入力してください。</string>
</resources>
```
```MainActivity.java
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final Resources res = getResources();

        TextView textVIew = findViewById(R.id.text);
        textVIew.setText(res.getString(R.string.error_message));

       }
    }

```
## GridViewの列数指定
- numColumns="10"を指定しなければ1列のみの表示となる。
- 10は10列ということ。

```hoge.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
<GridView
    android:id="@+id/grid_view"
    android:layout_width="300dp"
    android:layout_height="242dp"
    android:layout_gravity="center_vertical"
    android:numColumns="10"></GridView>
</LinearLayout>
```
## 0 test classes found in paclage 'layout'エラーの原因
- drawableとかxmlとか、変なところでRunすると起こるエラー。
- AndroidStudio上部のRun「▶」の左横の枠内で、一番最初に起動するActivityを指定しなおせば解決できる。

## getCountで要素数9なのにgetViewが3回しか呼ばれていない
 - GridViewに要素を入れるため、Adapterを使用しているときに起きたエラー。
 - GridViewの領域に対してitemがおおきくて3つしか入らなかったため、3回しかgetViewが呼ばれていなかった。
 - 解決策としてはGridViewの領域を最大限にするか、itemのサイズを小さくする。

## adapterのsetTag/getTagって何？
 - setTag/getTagしたViewHolderの中身は、他のクラス（FragmentのOnItemClickListenerとか）でも参照ができるようになる。
 - Tagを使用しなければ、AdapterのなかでしかそのViewのメソッドの呼び出しができなくなってしまう。
 - 下記、kotlinサンプルコード

```Adapter.java
   /**
     * ビュー描画メソッド
     */
    override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View {
        val itemLayoutView = p1 ?: View.inflate(this.context, R.layout.item_custom_view, null)
        var viewHolder = itemLayoutView.tag
        if (viewHolder == null) {
            viewHolder = ViewHolder()
            viewHolder.customView = itemLayoutView.custom_view as CustomView
            (itemLayoutView.custom_view as CustomView).initView(
                this.values[p0].index()
            )
            itemLayoutView.tag = viewHolder
        }
        return itemLayoutView
    }

/**
 * ビューホルダークラス
 */
class ViewHolder {
    lateinit var customView: CustomView
}
```
## Kotlinの[:]と[=]のちがいって何？
 - [=]は型推論を使っているときの書き方。
 - すぐに代入する時は型推論ができるので[=]を使う。
 
 (例)

```main.java
//java
int number = 3;
//kotlin
var number = 3
```

- [:]はすぐに代入する予定はなく、いつか代入したいな〜というときに使うので、型推論ができない。

(例)

```main.java
//java
int number;
number = 3;
//kotlin
lateinit var number:Int
number = 3
```

## ?(エルビス演算子)について
 - ?は基本的には使用しない。分岐が増えてめんどうなので。
 - ?はnullを許容するという意味。
 - メソッドの戻り値がnullOKがどうかで判断することもある。