カテゴリー ‘ Android

[Android] プログラム中でstrings.xmlの文字列を取得する方法


Androidでstrings.xmlに書いてある文字列をJavaプログラムで取得する方法

例えば

strings.xmlの内容が

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="test">文字列</string>
</resources>

これだった場合

Javaのプログラムでは、Activityの中で

String word = getString(R.string.word)

このように記述すると

「文字列」というStringオブジェクトを取得出来る

単純だけど忘れるのでメモ

Androidでpxでの指定をdipに変換する方法


Androidで、どうしてもプログラム中で画像の表示位置の指定をしないといけない時に

困るのが、画面解像度の違い

xmlでレイアウトを指定する場合「dip」を使用できるのですが

プログラム上では、「px」での指定になるのですがそれだと端末の解像度が異なると表示位置が異なるという困った事象が発生します。

なので、プログラム上でもピクセルでの指定でなく、dipでの指定をする方法です。

その為には、「DisplayMetrics」を使用します。

以下がそのコードです。

    /**
     * pxからdipへの変換処理
     */
    public static float px2Dip(Activity activity, float pixel) {
    	float dip = 0;
    	DisplayMetrics metrics = new DisplayMetrics();
    	activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
    	dip = metrics.scaledDensity * pixel;
    	return dip;
    }

このような感じで記述することでpxからdipへの変換ができます。

本当はもっと簡単に出来るのか?

もし、もっといい方法ありましたら教えて頂けたらと思います。

AndroidでUriからファイルパスを取得する方法


AndroidでUriでファイルの情報をやりとりするのですが、

実際のFileパスを使用したい場合あるとおもいます。

そういう時に、どうしたらいいかを調べた内容です。

普通にUriからgetPathメソッドでPathを取得すると、

「/external/images/media/401」

のような形でパスの内容が取得されます。

これを実際のファイルパスである、

「/mnt/sdcard/Test_20111101_145318.jpg」

のような形で取得する為には、「ContentResolver」を使用する必要があります。

Uriからファイルパスを取得する実際の処理は以下のようになります。

    /**
     * UriからPathへの変換処理
     * @param uri
     * @return String
     */
    public static String getPath(Context context, Uri uri) {
    	ContentResolver contentResolver = context.getContentResolver();
    	String[] columns = { MediaStore.Images.Media.DATA };
    	Cursor cursor = contentResolver.query(uri, columns, null, null, null);
    	cursor.moveToFirst();
    	String path = cursor.getString(0);
    	cursor.close();
    	return path;
    }

これで、ファイルパスが取得できます。

これで、実際のファイルパスを使用して、ファイルの削除、コピー、移動などができます。

もしかするとこんなことしなくてもUriを使用するだけで、本当は出来るような気はするのですが、

やり方が分からなかったので、実際のファイルパスを取得してしまいました。

 

うまいやり方が他にあったら教えて頂けたらとおもいます。

AndroidでActivityのスタックを削除する方法


Androidで複数Activityからなるアプリの場合、

「A→B→C→A」

のような順番でActivityを順番に呼び出す事があると思います。

この時に、

「A→B→C→A」の「C→A」に移動する時、

前に呼ばれているA,BのActivityのスタックを削除したいようなアプリもあると思います。

なんでかと言うと

「A→B→C→A」と呼ばれたアプリで戻るボタンで戻ると

  1. C
  2. B
  3. A
のように順番に戻ります、これが1週だけならまだいいですが
「A→B→C→A→B→C→A」のような場合
  1. C
  2. B
  3. A
  4. C
  5. B
  6. A
と、戻るボタンで戻る場合かなり面倒な感じになります。
なので「A→B→C→A→B→C→A」の時の最後の「C→A」の時に、
今までのActivityのスタックを全て破棄して新しく「A」が起動してくれた方がありがたい
とおもいませんか?
なので、このようにしたい場合は、以下のようにActivityの呼び出しを変更すると実装できます。
public void onTop(View view) {
	Intent intent = new Intent(getApplication(), BeardMaker.class);
	intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
	startActivity(intent);
}
これで、今までのActivityのスタックが破棄されるので、
戻るボタンを押下した時に、アプリケーションが終了するようになります。

Androidで画像を配列リソース用xmlを使用して管理する方法


まず、「res/values/arrays.xml」にリソースを設定します。

<?xml version="1.0" encoding="utf-8"?>
<resources>
	<string-array name="test_array_drawable">
		<item>@drawable/test1</item>
		<item>@drawable/test2</item>
		<item>@drawable/test3</item>
	</string-array>
</resources>

でjavaの方では以下のようにしてDrawableのインスタンスを取得し使用します。

TypedArray images = context.getResources().obtainTypedArray(R.array.test_array_drawable);
Drawable drawable = images.getDrawable(0);

これで、配列は外出しに出来るのでなるべく外に出したほうが楽かもしれません。

return top