Android
リソース
サーチ…
文字列を翻訳する
文字列は、サポートする言語ごとに異なるstrings.xmlを定義することで、国際化することができます。
ISO言語コードを接尾辞として新しいvaluesディレクトリを作成して、新しい言語を追加します。たとえば、ドイツ語セットを追加すると、構造は次のようになります。
システムが要求された文字列を探すと、言語固有のxmlが最初にチェックされ、見つからなければ、デフォルトのstrings.xmlファイルの値が返されます。キーは各言語で同じままで、値だけが変更されます。
コンテンツの例:
/res/values/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">HelloWorld</string>
<string name="hello_world">Hello World!</string>
</resources>
/res/values-fr/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello_world">Bonjour tout le monde !!!</string>
</resources>
文字列を定義する
文字列は通常、リソースファイルstrings.xml
格納されます。それらは、 <string>
XML要素を使用して定義されます。
strings.xmlの目的は、国際化を可能にすることです。言語isoコードごとにstrings.xmlを定義することができます。したがって、システムが文字列 'app_name'を検索すると、現在の言語に対応するxmlファイルが最初にチェックされ、見つからなければ、デフォルトのstrings.xmlファイルのエントリが検索されます。つまり、一部の文字列をローカライズするだけでなく、他の文字列をローカライズすることもできます。
/res/values/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Hello World App</string>
<string name="hello_world">Hello World!</string>
</resources>
文字列がXMLリソースファイルで定義されると、アプリケーションの他の部分で使用できます。
アプリケーションのXMLプロジェクトファイルは、 @string/string_name
を参照して<string>
要素を使用できます。たとえば、アプリケーションのマニフェスト (/manifests/AndroidManifest.xml)ファイルには、Android Studioのデフォルトで次の行が含まれています:
android:label="@string/app_name"
これはアンドロイドに、アプリケーションがランチャーにインストールまたは表示されたときにアプリの名前として使用する<string>
app_name <string>
リソースを探します。
アンドロイドのXMLファイルから<string>
リソースを使用する別の時間は、レイアウトファイル内にあります。たとえば、次の例は、前に定義したhello_world
文字列を表示するTextViewを表しています。
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world"/>
また、アプリケーションのJava部分から<string>
リソースにアクセスすることもできます。 Activityクラス内の上から同じhello_world
文字列を呼び出すには、次のようにします。
String helloWorld = getString(R.string.hello_world);
文字列配列を定義する
リソースファイルに文字列配列の書き込みを定義するには
res / values / filename.xml
<string-array name="string_array_name">
<item>text_string</item>
<item>@string/string_id</item>
</string-array>
例えば
res / values / arrays.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="string_array_example">
<item>@string/app_name</item>
<item>@string/hello_world</item>
</string-array>
</resources>
のようなJavaからそれを使用してください
String[] strings = getResources().getStringArray(R.array.string_array_example;
Log.i("TAG",Arrays.toString(strings)));
出力
I/TAG: [HelloWorld, Hello World!]
ディメンションを定義する
ディメンションは通常、リソースファイル名dimens.xml
格納されます。それらは<dimen>
要素を使用して定義されます。
res / values / dimens.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="small_padding">5dp</dimen>
<dimen name="medium_padding">10dp</dimen>
<dimen name="large_padding">20dp</dimen>
<dimen name="small_font">14sp</dimen>
<dimen name="medium_font">16sp</dimen>
<dimen name="large_font">20sp</dimen>
</resources>
異なる単位を使用することができます:
- sp:スケールに依存しないピクセル。フォントの場合。
- dp:濃度に依存しないピクセル。他のすべてのために。
- pt:ポイント
- px:ピクセル
- mm:ミリメートル
- イム:インチ
ディメンションは@dimen/name_of_the_dimension
という構文でXMLで参照できるようになりました。
例えば:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="@dimen/large_padding">
</RelativeLayout>
整数を定義する
整数は通常、 integers.xml
という名前のリソースファイルに格納されますが、ファイル名は任意に選択できます。各整数は、次のファイルに示すように、 <integer>
要素を使用して定義されます。
res / values / integers.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer name="max">100</integer>
</resources>
次の例に示すように、 @integer/name_of_the_integer
という構文で@integer/name_of_the_integer
XMLで参照できるようになりました。
<ProgressBar
android:layout_width="match_parent"
android:layout_height="match_parent"
android:max="@integer/max"/>
整数配列を定義する
リソースファイルに整数配列の書き込みを定義するには
res / values / filename.xml
<integer-array name="integer_array_name">
<item>integer_value</item>
<item>@integer/integer_id</item>
</integer-array>
例えば
res / values / arrays.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer-array name="fibo">
<item>@integer/zero</item>
<item>@integer/one</item>
<item>@integer/one</item>
<item>@integer/two</item>
<item>@integer/three</item>
<item>@integer/five</item>
</integer-array>
</resources>
のようなJavaからそれを使用してください
int[] values = getResources().getIntArray(R.array.fibo);
Log.i("TAG",Arrays.toString(values)));
出力
I/TAG: [0, 1, 1, 2, 3, 5]
色を定義する
色は、通常、 /res/values/
フォルダーのcolors.xml
という名前のリソースファイルに格納されます。
それらは<color>
要素で定義されます:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="blackOverlay">#66000000</color>
</resources>
色は、次のいずれかの形式の各カラーチャネル(0 - FF)
16進数のカラー値で表されます。
-
#RGB
-
#ARGB
-
#RRGGBB
-
#AARRGGBB
伝説
- A - アルファチャンネル - 0値は完全に透明で、FF値は不透明です
- R - 赤チャンネル
- G - 緑色のチャンネル
- B - 青色のチャンネル
定義された色はXMLで次の構文で使用できます@color/name_of_the_color
例えば:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/blackOverlay">
コードでの色の使用
これらの例では、 this
がアクティビティ参照であると想定しthis
ます。コンテキスト参照もその場所で使用できます。
int color = ContextCompat.getColor(this, R.color.black_overlay);
view.setBackgroundColor(color);
int color = this.getResources().getColor(this, R.color.black_overlay);
view.setBackgroundColor(color);
上記のcolorPrimary
宣言では、 colorPrimaryDark
とcolorAccent
を使用して、 styles.xml
カスタムAndroidテーマを定義する際に使用するマテリアルデザインの色を定義しています。 Android Studioで新しいプロジェクトを作成すると自動的に追加されます。
「廃止予定」の警告なしでリソースを取得する
Android API 23以降を使用すると、非常に頻繁にそのような状況が見えます:
このような状況は、Android APIのリソースの取得に関する構造的な変更によって発生します。
今の関数:
public int getColor(@ColorRes int id, @Nullable Theme theme) throws NotFoundException
使用すべきです。しかし、 android.support.v4
ライブラリには別の解決策があります。
build.gradle
ファイルに次の依存関係を追加します。
com.android.support:support-v4:24.0.0
サポートライブラリのすべてのメソッドが利用可能です:
ContextCompat.getColor(context, R.color.colorPrimaryDark);
ContextCompat.getDrawable(context, R.drawable.btn_check);
ContextCompat.getColorStateList(context, R.color.colorPrimary);
DrawableCompat.setTint(drawable);
ContextCompat.getColor(context,R.color.colorPrimaryDark));
さらにサポートライブラリからのより多くのメソッドを使用することができます:
ViewCompat.setElevation(textView, 1F);
ViewCompat.animate(textView);
TextViewCompat.setTextAppearance(textView, R.style.AppThemeTextStyle);
...
メニューリソースを定義し、アクティビティ/フラグメント内で使用する
res / menuにメニューを定義する
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/first_item_id"
android:orderInCategory="100"
android:title="@string/first_item_string"
android:icon="@drawable/first_item_icon"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/second_item_id"
android:orderInCategory="110"
android:title="@string/second_item_string"
android:icon="@drawable/second_item_icon"
app:showAsAction="ifRoom"/>
</menu>
設定のその他のオプションについては、次を参照してください。 メニューリソース
内部Activity
:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
///Override defining menu resource
inflater.inflate(R.menu.menu_resource_id, menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
//Override for preparing items (setting visibility, change text, change icon...)
super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//Override it for handling items
int menuItemId = item.getItemId();
switch (menuItemId) {
case: R.id.first_item_id
return true; //return true, if is handled
}
return super.onOptionsItemSelected(item);
}
ビューの表示中に上記のメソッドを呼び出すには、 getActivity().invalidateOptionsMenu();
呼び出しgetActivity().invalidateOptionsMenu();
Fragment
もう1つのコールが必要です:
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setHasOptionsMenu(true);
super.onCreateView(inflater, container, savedInstanceState);
}
strings.xmlの文字列フォーマット
strings.xmlファイルに文字列を定義することで、文字列の書式設定も可能です。唯一の注意点は、文字列を単純にレイアウトにアタッチするのとは異なり、以下のようなコードで処理する必要があることです。
<string name="welcome_trainer">Hello Pokémon Trainer, %1$s! You have caught %2$d Pokémon.</string>
String welcomePokemonTrainerText = getString(R.string.welcome_trainer, tranerName, pokemonCount);
上記の例では、
%1 $ s
'%'は通常の文字から区切ります。
「1」は第1のパラメータを示し、
'$'はパラメータ番号と型の間のセパレータとして使用され、
's'は文字列型を表します( 'd'は整数に使用されます)
getString()
はContext
またはResources
メソッドです。つまり、 Activity
インスタンス内で直接使用できますgetActivity().getString()
そうでない場合は、 getActivity().getString()
またはgetContext().getString()
それぞれ使用できます。
色の状態リストを定義する
カラー状態リストはカラーとして使用できますが、使用されているビューの状態に応じて変わります。
定義するには、 res/color/foo.xml
リソースファイルを作成します
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#888888" android:state_enabled="false"/>
<item android:color="@color/lightGray" android:state_selected="false"/>
<item android:color="@android:color/white" />
</selector>
項目は定義された順序で評価され、指定された状態がビューの現在の状態と一致する最初の項目が使用されます。ですから、ステートセレクタを指定しなくても、最後にキャッチオールを指定することをお勧めします。
各項目は、カラーリテラルを使用することも、別の場所で定義された色を参照することもできます。
ストリング・プレリュールの定義
複数の文字列と単一の文字列を区別するために、 strings.xmlファイルに複数形を定義し、以下の例に示すように異なる数量をリストすることができます。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="hello_people">
<item quantity="one">Hello to %d person</item>
<item quantity="other">Hello to %d people</item>
</plurals>
</resources>
この定義は、次の例に示すように、 Resources
クラスのgetQuantityString()
メソッドを使用してJavaコードからアクセスできます。
getResources().getQuantityString(R.plurals.hello_people, 3, 3);
ここでは、最初のパラメータR.plurals.hello_people
がリソース名です。 2番目のパラメータ(この例では3
)を使用して、正しいquantity
文字列を選択します。 3番目のパラメータ(この例では3
)は、書式指定子%d
置換に使用される書式引数です。
可能な数量値(アルファベット順)は次のとおりです。
few
many
one
other
two
zero
ないすべてのロケールは、すべての宗派サポートしていることに注意することが重要であるquantity
。たとえば、中国語にはone
項目の概念がありません。文法的にはother
のものと同じであるため、英語にはzero
項目はありません。サポートされていないquantity
インスタンスは、IDEによってLintの警告としてフラグが立てられますが、使用されると複雑なエラーは発生しません。
リソースで定義されたオブジェクトの配列をインポートする
カスタムオブジェクトを作成し、アプリケーションのリソースで定義する必要がある場合があります。このようなオブジェクトは、 Java
単純型( Integer
、 Float
、 String
など)で構成できます。
アプリケーションリソースで定義されたオブジェクトをインポートする方法の例を次に示します。オブジェクトCategory
3つのプロパティを保持します:
- ID
- 色
- 名
このPOJO
はcategories.xml
ファイルに相当しcategories.xml
。各配列は各カテゴリに対して同じプロパティが定義されています。
- あなたのためのモデルを作成する:
public class Category {
private Type id;
private @ColorRes int color;
private @StringRes String name;
public Category getId() {
return id;
}
public void setId(Category id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getColor() {
return color;
}
public void setColor(int color) {
this.color = color;
}
public enum Type{
REGISTRATION,
TO_ACCEPT,
TO_COMPLETE,
TO_VERIFY,
CLOSED
}
}
-
res/values
フォルダにファイルを作成します。
categories.xml
- リソースからなる各モデルを作成する:
<array name="no_action">
<item>0</item>
<item>@android:color/transparent</item>
<item>@string/statusRegistration</item>
</array>
<array name="to_accept">
<item>1</item>
<item>@color/light_gray</item>
<item>@string/acceptance</item>
</array>
<array name="opened">
<item>2</item>
<item>@color/material_green_500</item>
<item>@string/open</item>
</array>
<array name="to_verify">
<item>3</item>
<item>@color/material_gray_800</item>
<item>@string/verification</item>
</array>
<array name="to_close">
<item>4</item>
<item>@android:color/black</item>
<item>@string/closed</item>
</array>
リソースファイルに配列を定義する:
<array name="categories"> <item>@array/no_action</item> <item>@array/to_accept</item> <item>@array/opened</item> <item>@array/to_verify</item> <item>@array/to_close</item> </array>
それらをインポートする関数を作成します。
@NonNull public List<Category> getCategories(@NonNull Context context) { final int DEFAULT_VALUE = 0; final int ID_INDEX = 0; final int COLOR_INDEX = 1; final int LABEL_INDEX = 2; if (context == null) { return Collections.emptyList(); } // Get the array of objects from the `tasks_categories` array TypedArray statuses = context.getResources().obtainTypedArray(R.array.categories); if (statuses == null) { return Collections.emptyList(); } List<Category> categoryList = new ArrayList<>(); for (int i = 0; i < statuses.length(); i++) { int statusId = statuses.getResourceId(i, DEFAULT_VALUE); // Get the properties of one object TypedArray rawStatus = context.getResources().obtainTypedArray(statusId); Category category = new Category(); int id = rawStatus.getInteger(ID_INDEX, DEFAULT_VALUE); Category.Type categoryId; //The ID's should maintain the order with `Category.Type` switch (id) { case 0: categoryId = Category.Type.REGISTRATION; break; case 1: categoryId = Category.Type.TO_ACCEPT; break; case 2: categoryId = Category.Type.TO_COMPLETE; break; case 3: categoryId = Category.Type.TO_VERIFY; break; case 4: categoryId = Category.Type.CLOSED; break; default: categoryId = Category.Type.REGISTRATION; break; } category.setId(categoryId); category.setColor(rawStatus.getResourceId(COLOR_INDEX, DEFAULT_VALUE)); int labelId = rawStatus.getResourceId(LABEL_INDEX, DEFAULT_VALUE); category.setName(getString(context.getResources(), labelId)); categoryList.add(taskCategory); } return taskCategoryList; }
9パッチ
9パッチは伸縮可能な画像で、伸ばすことができる領域は透明な境界に黒のマーカーで定義されます。
ここに大きなチュートリアルがあります 。
とても古くても、それはまだ価値があり、多くの人が9パッチ・ギアを深く理解するのに役立ちました。
残念ながら、最近、そのページはしばらくの間停止されています(現在はもう一度稼働しています)。
したがって、信頼性の高いサーバー上でアンドロイド開発者向けにそのページの物理コピーを作成する必要があります。
ここにあります。
アンドロイドUIの9つのパッチの簡単なガイド2011年5月18日
私が最初のAndroidアプリを開発している間に、9パッチ(別名9.png)が混乱していて、文書化されていないことが判明しました。しばらくすると、ついにそれがどのように働いているのかを拾い集め、他の人がそれを理解するのを助けるために何かを一緒に投げることに決めました。
基本的に、9パッチは、9スライスまたはスケール9の高度な形式を実行するためにpngの透明度を使用します。ガイドは、画像の端に描かれた1ピクセルの黒線で、画像の拡大縮小と塗り潰しを定義します。画像ファイルname.9.pngに名前を付けることによって、Androidは9.png形式を認識し、黒いガイドを使用してビットマップを拡大/縮小して埋め尽くします。
基本的なガイドマップは次のとおりです。
ご覧のとおり、画像の両側にガイドがあります。 TOPとLEFTのガイドは画像を拡大/縮小するためのガイドです(9スライス)。また、RIGHTとBOTTOMガイドは塗りつぶし領域を定義します。
黒のガイドラインは画像から切り取られ/削除されます。アプリには表示されません。ガイドは1ピクセル幅でなければならないので、48×48ボタンが必要な場合は、実際には50×50になります。 1ピクセルよりも厚いものは、あなたの画像の一部として残ります。 (私の例では、視認性を高めるために4ピクセル幅のガイドがありますが、実際には1ピクセルのみである必要があります)。
あなたのガイドは黒く塗られていなければなりません(#000000)。色(#000001)やアルファのわずかな違いでさえ、正常に機能しなくなります。この失敗は明らかではない*、それは静かに失敗する!はい。本当に。今あなたは知っている。
また、1ピクセルのアウトラインの残りの領域は完全に透明でなければならないことに注意してください。これにはイメージの4つのコーナーが含まれます。それらは常に明確でなければなりません。これは、あなたが気づくよりも大きな問題になる可能性があります。たとえば、Photoshopで画像を拡大/縮小すると、アンチエイリアス処理されたピクセルが追加されます。このピクセルにはほとんど見えないピクセルも含まれているため、失敗する可能性があります*。 Photoshopで拡大/縮小する必要がある場合は、[イメージサイズの変更]プルダウンメニュー(画像サイズポップアップメニューの最下部にある)の[最近傍]設定を使用して、ガイドにシャープなエッジを確保します。
*(updated 1/2012)これは実際には最新の開発キットの「修正」です。以前は、実際に壊れた9パッチ画像ではなく、他のすべての画像やリソースが突然破損してしまうため、それ自体が現れます。
TOPおよびLEFTガイドは、画像のスケーラブルな部分を定義するために使用されます。LEFTはスケーリングの高さ、TOPはスケーリングの幅です。例としてボタンイメージを使用すると、ボタンが黒い部分内で水平方向と垂直方向に伸び、コーナーなどのすべてが同じサイズのままになることを意味します。このボタンを使用すると、任意のサイズに拡大縮小でき、均一な外観を維持できるボタンを使用できます。
9パッチの画像は縮小されないことに注意することが重要です。だからできるだけ小さくすることが最善です。
また、スケール線の途中に部分を残すこともできます。たとえば、途中で鮮明なエッジを持つボタンがある場合は、LEFTガイドの中央にいくつかのピクセルを残しておくことができます。画像の中央の水平軸はスケールされず、上下の部分だけで、シャープな光沢はアンチエイリアスやファジーにならないでしょう。
塗り領域ガイドはオプションで、テキストラベルのようなもののための領域を定義する方法を提供します。塗りつぶしは、テキスト、アイコン、またはその他のものを置くためにイメージ内にどれくらいのスペースがあるかを決定します。 9パッチはボタンだけでなく、背景画像にも使用できます。
上記のボタンとラベルの例は、単に塗りつぶしのアイデアを説明するために誇張されています - ラベルは完全に正確ではありません。正に言えば、ボタンラベルは通常1行のテキストであるため、Androidでは複数行のラベルをどのように扱うのか経験していません。
最後に、LinearLayoutなどの背景画像と完全に丸みを帯びた側面など、スケールガイドと塗りつぶしガイドがどのように異なるかを示すデモンストレーションです:
この例では、LEFTガイドは使用されていませんが、まだガイドが必要です。背景画像は垂直方向に拡大縮小されません。それは単に(TOPガイドに基づいて)水平にスケーリングされます。塗りつぶしガイドを見ると、右と下のガイドは、画像の湾曲したエッジを満たす場所を超えて拡張されています。これにより、丸いボタンを背景のエッジの近くに配置して、きつくフィットした外観にすることができます。
そうです。あなたがそれを得ると、9パッチは非常に簡単です。スケーリングを行うには完全な方法ではありませんが、塗りつぶし領域とマルチラインのスケールガイドは、従来の9スライスやスケール9よりも柔軟性があります。それを試してみるとすぐにそれを理解するでしょう。
色の透明度(アルファ)レベル
16進不透明度値
------------------------------
| Alpha(%) | Hex Value |
------------------------------
| 100% | FF |
| 95% | F2 |
| 90% | E6 |
| 85% | D9 |
| 80% | CC |
| 75% | BF |
| 70% | B3 |
| 65% | A6 |
| 60% | 99 |
| 55% | 8C |
| 50% | 80 |
| 45% | 73 |
| 40% | 66 |
| 35% | 59 |
| 30% | 4D |
| 25% | 40 |
| 20% | 33 |
| 15% | 26 |
| 10% | 1A |
| 5% | 0D |
| 0% | 00 |
------------------------------
赤色に45%を設定する場合。
<color name="red_with_alpha_45">#73FF0000</color>
赤の16進値 - #FF0000
接頭辞に73%の不透明度を追加することができます - #73FF0000
strings.xmlファイルの操作
文字列リソースは、オプションのテキストのスタイリングと書式設定を使用してアプリケーションのテキスト文字列を提供します。アプリケーションに文字列を提供できる3種類のリソースがあります。
文字列
XML resource that provides a single string.
構文:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="string_name">text_string</string>
</resources>
レイアウトでこの文字列を使用するには:
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/string_name" />
文字列配列
XML resource that provides an array of strings.
構文:
<resources>
<string-array name="planets_array">
<item>Mercury</item>
<item>Venus</item>
<item>Earth</item>
<item>Mars</item>
</string-array>
使用法
Resources res = getResources();
String[] planets = res.getStringArray(R.array.planets_array);
数量文字列(複数の文字列)
XML resource that carries different strings for pluralization.
構文:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals
name="plural_name">
<item
quantity=["zero" | "one" | "two" | "few" | "many" | "other"]
>text_string</item>
</plurals>
</resources>
使用法:
int count = getNumberOfsongsAvailable();
Resources res = getResources();
String songsFound = res.getQuantityString(R.plurals.plural_name, count, count);