【初心者向け】Android公式ドキュメント　ガイド　アプリの基本２

[【初心者向け】Android公式ドキュメント　ガイド　アプリの基本1](https://qiita.com/KIRIN3qiita/items/c2caa1766243e43b8e55)


公式ガイドのまとめを徐々に書いていきます。
また、範囲が広いので大雑把に書いて、重要なところは別記事で書いていこうと思います。

今回のまとめをすごい簡単に書くと、
`Androidは画像やレイアウトのXMLとかをディレクトリに種類ごとに分けて保存する。`
`ディレクトリの名前の最後に文字を追加すると、端末サイズや言語によって内容を出し分けできる。`
`Androidは画面を横にしたりすると、アクティビティが再読み込みになるから気を付けて。`
`ローカライズした場合の注意点やコツやルール、テスト方法が色々ある`
という内容。

（公式ガイド）https://developer.android.com/guide/

---
#### 項目一覧
４．[アプリのリソース](https://developer.android.com/guide/topics/resources/providing-resources)
　　・[概要](https://developer.android.com/guide/topics/resources/providing-resources)
　　・[設定の変更に対処する](https://developer.android.com/guide/topics/resources/runtime-changes)
　　・[ローカライズ](https://developer.android.com/guide/topics/resources/localization)

---
## ４．アプリのリソース

###〇概要
####・リソースの提供
画像や文字列は別ディレクトリに保存する。
特別な名前をディレクトリに付けることで、特定の端末用に設定することができる。
外部化するとRクラスで生成されるリソースIDを利用できるので、プログラム内で呼び出せる。

####・リソースタイプをグループ化する
☆ディレクトリの種類

| ディレクトリ名     | 説明 　　　　　　　 |
|:-----------------|:------------------|
| animator/    |プロパティ アニメーションを定義する XML ファイル|
| anim/    |トゥイーン アニメーションを定義する XML ファイル|
| color/    |色の状態リストを定義する XML ファイル|
| mipmap/    |ランチャー アイコン密度のドローアブル ファイル|
| layout/    |ユーザー インターフェースのレイアウトを定義する XML ファイル|
| menu/    |メニューを定義する XML ファイル|
| raw/    |未加工の形式で保存する任意のファイル|
| xml/    |実行時に読み込むことができる任意の XML ファイル|

###〇代替リソースを提供する
各端末画面密度が異なるのでサイズに合わせたリソースが必要。
特にタブレット。

（例） 

```
res/
    drawable/
        icon.png
        background.png
    drawable-hdpi/
        icon.png
        background.png
```


画像密度がhdpiの場合はdrawable-hdpiから画像ファイルを取得して、
その他の場合はdrawableから取得することになる。

☆設定修飾子

| 修飾子     | 説明 　　　　　　　 |
|:-----------------|:------------------|
|MCC と MNC|SIMカードによる出し分け|
|言語と地域|ユーザーがシステム設定で指定している言語による出し分け|
|レイアウトの方向|レイアウトの方向による出し分け　右から左に読む言語（ペルシャ語やヘブライ語）等で使う|
|smallestWidth|画面に使用できる高さと幅(dp)の最小サイズによる出し分け|
|使用可能な幅|最小画面幅(dp)による出し分け|
|使用可能な高さ|最小画面高さ(dp)による出し分け|
|画面サイズ|画面密度による出し分け|
|画面アスペクト|画面のアスペクト比による出し分け|
|円形の画面|ウェアラブル端末のような円形の画面で使う出し分け|
|画面の向き|画面の向きによる出し分け、横画面に奇麗に対応するに必要|
|UI モード|車載、テレビ、時計等のデバイスことの出し分け|
|ナイトモード|夜かどうかで出し分け|
|画面ピクセル密度（dpi）|画像密度ごとに出し分け　一番利用する|
|タッチスクリーン タイプ|タッチに対応している端末かで出し分け|
|キーボードの使用可能状況|キーボードが使用可能か？隠れているかに？等による出し分け|
|主なテキスト入力方法|テキスト入力用のハードウェアキー等による出し分け|
|ナビゲーション キーの使用可否|下に出ている　◁　〇　▢　の使用によって出し分け|
|タップ以外の主なナビゲーション方法|端末のナビゲーション機能による出し分け|
|プラットフォーム バージョン（API レベル）|APIレベルによる出し分け|

APIレベルによって使えないものもあるので注意

####・修飾子の名前のルール
複数の修飾子をセットできる。
（例）drawable-en-rUS-land
セット順は上にある通り
ただし、タイプは１つだけ（スペイン語とフランス語を合わせたディレクトリとかはダメ）。

####・エイリアス リソースを作成する
xmlファイルを用意することでエイリアス（リンク）を作ることができ、複数フォルダに同じ画像などのファイルを置く必要がないという説明。


####・ドローアブル

ドローアブルは 画面上に描画するグラフィックのこと。
こちらもxmlファイルでエイリアスを作成できる。

####・レイアウト
レイアウトのエイリアス作成方法。

####・文字列とその他の単純な値
stringsファイルに記載するデータをエイリアスできる。
使いどころは思い浮かばない。

####・リソースとの最適な端末の互換性を提供する
デフォルトのリソースディレクトリを用意するという説明（あたり前なこと）。

####・Android が最適なリソースを見つける仕組み
複数の修飾子がある場合どのディレクトリが選択されるかという説明。
かなり必要度の低いロジック説明。

###〇設定の変更に対処する
####・実行時の変更の処理
画面を横にしたり、電話着信などでアクティビティの再読み込みが行われ、表示していたデータが消えてしまうなどへの対応。
`1.構成の変更中にオブジェクトを保持する`
`2.構成の変更を自分で処理する`
がある。
2.を使うことは、ほとんどない。

1.構成の変更中にオブジェクトを保持する場合
Android はアクティビティを破棄する前に呼ばれる onSaveInstanceState() で、Gradleなどにデータを保存して、onCreate() か onRestoreInstanceState()でデータ呼び出すか、データが大量の場合はフラグメントにデータを保存して取得する。
（重要なので詳細は色んなサイトにまとめられている、フラグメントの仕組みは見たことないので、いつかまとめたい）

2.構成の変更を自分で処理する場合
代替リソースの使用が非常に難しくなります。
そのため再起動を回避するため以外では推奨されていない方法。


```Android:AndroidManifest.xml
<activity android:name=".MyActivity"
　　　android:configChanges="orientation|keyboardHidden"
　　　android:label="@string/app_name">
```
configChangesにorientationを入れると画面向きを変更した時、keyboardhiddenを入れるとキーボード可用性の変更をした時の再起動を回避する。

しかし、 onConfigurationChanged()に複雑なUIをセットしなければならない。

###〇ローカライズ
####・Localize your app
地域ごとにテキスト、数字、通貨等違うのでベストな設定方法を紹介する。

####・Overview: Resource switching in Android
res/ディレクトリ以下に特別な名前のディレクトリを置けば勝手に選ばれるという上と同じ内容。
デフォルトのディレクトリが必要というのも同じ内容。
日本語と英語ドキュメントで内容が被っている様子。

####・Using resources for localization
実際のディレクトリの作成方法。
こちらも日本語ドキュメントと同一内容。

####・Managing strings for localization
strings.xmlには説明を追加しましょうという内容。
実際にしているソースをあまり見たことない。

```xml:strings.xml
<!-- ボタンに表示するから30文字以内 -->
<string name="login_submit_button">Sign in</string>
```
・翻訳されて困る言葉はstrings.xml内でも特殊タグに入れる必要あり。
コード、値のプレースホルダ、特殊記号、名前等、翻訳されるとおかしくなるものは、strings.xml内で`<xliff:g>`を利用する。

XLIFFとは(http://docs.oasis-open.org/xliff/v1.2/os/xliff-core.html)

```
XML文書の翻訳を支援する一連の標準規格。
 XLIFFを使用すると、テキストが翻訳されるのを防ぐことができる。
また、フォーマットされた文字列パラメータの例を表示することもできる。
```

（例）

```xml:strings.xml
<string name="countdown">
  <xliff:g id="time" example="5 days">%1$s</xliff:g>until holiday
</string>
```
分かりづらいが、
textView.setText(getString(R.string.countdown));
とすると
`%1$suntil holiday`と表示され、囲まれている%1$sはユーザーが設定している言語に変換しないようにするということ。
idは囲っている部分が何であるか、exampleは例えば何が入るか書いてあると、
今後strings.xmlを見る人が便利だねっていうだけ（idは必須）。

####・Localization checklist
ローカライズのチェックリストもあるという話。
https://developer.android.com/distribute/best-practices/launch/localization-checklist

####・Localization tips
ローカライズのコツ一覧
・デフォルトフォルダにはすべてのリソースを入れること。
・サポートしていないロケールが読み込まれそうになると、メッセージを出して終了するという方法もある。
・言語によってレイアウトを再配置する方法もあるが、なるべく柔軟で単一なレイアウトがよい。
・言語によって、名前フィールドが２つだったり、３つだったりするが、プログラムによって１つ無効にするか、レイアウトごとに設定を変えて対応する。
・必要以上にリソースファイルやテキスト文字列を作成しない。
・デフォルトのstrings.xmlで足りないところだけ、代替テキストを用意する。
・プログラム上でロケールを判断できる
String locale = context.getResources().getConfiguration().locale.getDisplayName();
・アプリ翻訳サービスを使用する（Play Consoleから翻訳会社に注文できます。）

####・Testing localized apps
ローカライズのテスト方法
エミュレータとadbを利用して、言語を指定して起動できる。

####・Test your app with pseudolocales
疑似的なローカライズ[pseudolocale]を行うことで、ローカライズ可能なメッセージを英語で読むことができ、ローカライズされなければ変換不可能なメッセージであることを表すので、問題を見つけやすい。

####・Enable pseudolocales
[pseudolocales]の利用方法

Android 4.3以降で使用可能

・build.gradleに追加

```Android:build.gradle
android {
  ...
  buildTypes {
    debug {
      pseudoLocalesEnabled true
    }
  }
```

・アプリを起動

・端末の言語を疑似コードに設定

####・Spot localization issues
[pseudolocales]の効果、問題について
・翻訳できないハードコーディングされた文字を発見しやすくなる
・テキスト長によるUIレイアウトの問題がある。
・文が連携されていなく翻訳が不十分になる場合がある。
・文字を読む方向が違う文字が含まれていると、翻訳が失敗する可能性がある。

###・Unicode and internationalization support
Unicodeと国際化のサポートを行っているが、
Android 6.0以下と、7.0以上によって言語処理のライブラリが異なる。

###・言語とロケール
Android 7.0 以降になると極力ユーザーが設定している文字に近いロケールを選択してくれる。