読者です 読者をやめる 読者になる 読者になる

AndroidTips備忘録早見メモ

自分検索用。
twitterでfavっても検索できないクライアントが多い or ズレたりするので

  1. Html.fromHtmlで使う色指定記述の動的なやり方
  2. res/valus/string.xml 等で定義する文字列
  3. xml定義と呼び方
  4. configChangeの話
  5. eclipse ADTでのアイコン調整機能の話
  6. Toastをレイアウトを用意せずにカスタマイズしたいの話
  7. 遅延実行処理の話
  8. 画像投稿Intentの話
  9. Javaでのメルセンヌ・ツイスタコードの話



☆) Html.fromHtmlで使う文字列での色指定記述の動的なやり方

  • 一応マスクかけないと駄目
  • α値指定すると色表示できない
String color_str = String.format("#%06X",0xFFFFFF & m_r.getColor(R.color.green) );
<string name="start_msg">
&lt;font color=%1$s>
ゲーム開始!
&lt;/font>
&lt;br>
</string>

みたいな奴に指定するイメージ。



☆) res/valus/string.xml 等で定義する文字列

http://localhost/?r=%1$s%26m=%2$s
http://localhost/?r=%1$s&m=%2$s
<?xml version="1.0" encoding="utf-8"?>
<resources>
   <string name="hoge_url" >
http://localhost?r=%1$s&amp;m=%2$s
</string> 
</resources>

  • URLエンコードする認識の文字
    • ココらへん使う場合は[formatted="false"]が必須。じゃないとエラー扱いになる
    • でも [%1$d] みたいなのと組みあわせると変に誤爆で落ちたりするんだよなー(汗
[&] %26
[ ] %20
[#] %25
[:] %3a


一応は

<string name="search_query" formatted="false" >
#twitter4j
</string>

みたいな書き方もできるんだけど、
エラーが出る時があるので、
その時は formatted="false" を外してURLエンコードするしか無いかなと思う



☆) xml定義と呼び方

よくググるとitog/yanzam さんのブログが引っかかるはずなんですけど
itogさんのは誤記載があって何時も混乱するので自メモしておく

Resources m_r =getResources();

という前提で話をメモ

  • String型配列
    • res/value/array-string.xml
    <string-array name="string_a">
    	<item>ああ</item>
    	<item>いい</item>
    </string-array>
String[] names = m_r.getStringArray(R.array.string_a);
for(String name :names){
     //取得処理
}
  • Integer型配列
    • res/value/array-integer.xml
    <integer-array name="integer_a">
    	<item>10</item>
    	<item>20</item>
    	<item>30</item>
    </integer-array>
int[] ids = m_r.getIntArray(R.array.integer_a);
for(int id :ids){
     //取得処理
}
  • Integerで取れないのがポイント!
  • 2次元配列モドキ
    • res/value/array-array.xml
    <array name="gem_type">
	<item>@array/gem_fire</item>
	<item>@array/gem_water</item>
    </array>

    <string-array name="gem_fire">
	<item>R</item>
	<item>E</item>
	<item>D</item>
    </array>
private TypedArray arr_mst= null;
private String[] gem_names = null;
private int k_index = -1;
private int m_gem_flag = 1;//1の時gem変更可能

if(arr_mst==null)arr_mst = m_r.obtainTypedArray(R.array.gem_type);
int index = 0;
if(m_gem_flag==1)index = m_gem_level;
f(k_index != index){
     int gnum = arr_mst.getResourceId(index, R.array.gem_fire); 
     gem_names = m_r.getStringArray(gnum);
     k_index = index;
}
  • id除外処理
    • res/value/array-skip.xml
    <array name="skip_res">
	<item>@id/row_modeB</item>
	<item>@id/row_modeC</item>
   </array>
private TypedArray skip_arr= null;
	
private boolean isSkip(int resID){
	if(skip_arr==null)skip_arr = m_r.obtainTypedArray(R.array.skip_res);
	boolean retID = false;
		
	int index = 0;
	int mode = -1;
	do{
		mode = skip_arr.getResourceId(index, -1);
		if(mode==resID){
			retID = true;
			break;
		}
		index++;
	}while(mode !=-1);

	return retID;
}
  1. TypedArray自体は
    1. getString()
    2. getBoolean()
    3. getColor()
    4. getDimensions()
    5. getDrawable()

等 色々とあるらしい。



☆) configChangeの話



☆) eclipse ADTでのアイコン調整機能の話

 ASのWizardに入った eclipse ADTでのアイコン調整機能
実はあとから呼べるって話、あとから知った。うーん。知らないことばかりだわ。。。(汗

 でもひとつ注意しておかないと駄目なのは

で記載されてる推奨サイズで作られるということ。

ここを覚えておかないと「サイズが小さいんだけどどうにかしてよ!」
とデザイナーさんとかに文句言われたりする*1

で、取れる方式としては

  • 自分でギリギリまでSeashore等でリサイズする
  • 上記に記載されてるように9patchで作成する*2



☆) Toastをレイアウトを用意せずにカスタマイズしたいの話

Toast はメモリが足りなくて、
背景ゴッテリのダイアログが出せない時に表示できるんですけど

  • デフォルトちっちゃいし、下の方に出て見難いよね。
  • メモリがあるときぐらいUI凝りたいよね*3
  • でもレイアウトを用意するまではちょっとね。。面倒だよね

って話でカスタマイズを調べてた

private static Toast ts = null;
public void showToast(Activity activity,CharSequence msg) {
	showToast(activity,msg,18.0f);
}

public void showToast(Activity activity,CharSequence msg,float size) {
	if(ts!=null){
		ts.cancel();
		ts=null;
	}
		
	//こっちじゃないと通常はエラーになる。下記の例の場合は普通infrateする例で解説されてて実体あるから?
	ts = Toast.makeText(activity, msg, Toast.LENGTH_LONG);
/*
	ts =  new Toast(activity);
	ts.setText(msg);
	ts.setDuration( Toast.LENGTH_LONG);
*/
        //Toastの表示位置を画面中央に(デフォルトは画面下)
	ts.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
	
	if( /* メモリが足りてるかチェック処理 で足りてるなら */ ){
		LinearLayout ln = (LinearLayout)ts.getView();
                //背景画像を差し替えます(9patchで作るとベター)
		if(ln!=null)ln.setBackgroundResource(R.drawable.dialog_back);

		TextView tx = (TextView) ln.getChildAt(0);
                //文字を中央表示で表示したいよ 
		tx.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL);
		tx.setTextSize(size);
		tx.setPadding((int)size, 0, (int)size, 0);//そのまま設定すると外にはみ出る表示になるので1文字分くらいPaddingを設定

		tx.setTypeface(Typeface.DEFAULT_BOLD);
		tx.setTextColor(m_r.getColor(R.color.white));
	}
	ts.show();
}

プロパティは

あたりを参考にすればOK

レイアウトを用意する前提であれば

ただ最後の例のレベルまでいじると、手軽さが凄く違う気がするけど‥‥‥

cancel()で終了すると思ってたけどちょっと違うみたい

最終的には




☆) 遅延実行処理の話

ようは

  • とりあえずAsyncTaskやExecutorServiceで実行
  • 先に進める

みたいなのでIO処理が重なるとANR等で固まることが有るわけだ。。

でそれが古い機種だけで起こればいいんですけどね。。。
どうも Galaxy S4(Android 4.2.2) とかでも起きるんでデグレッテル?
って聞きたくなる<GNでは起きないからな。。。まず。。



☆) 画像投稿Intentの話

Uri uri = Uri.fromFile(new File(fileFullPath));

intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/jpg"); // PNGの場合は "image/png" にする
intent.putExtra(Intent.EXTRA_STREAM, uri);

あたりが肝か。。

で、試してみたら

  • はむーん/Twitter公式 はOK
  • TwitPane は未対応 *4

他のは未検証

で対応してもらえることになりました。パチパチ。

自分が触ってるアプリとかSD権限で某Secサイトで言及されるのを嫌うので

String uri_s = MediaStore.Images.Media.insertImage(getContentResolver(), bmp, "", null);
Uri uri =  Uri.parse(uri_s);

な記述になったりしますけどね。(汗
でもこれ4.2.X関係だとSD権限がないと使えないテク。。。



☆) Javaでのメルセンヌ・ツイスタコードの話

javaのRondomが

って話で偏るから、IOSの乱数関数よりクソだよね−って話がよくでてて

  • NDKで実装するのがベターでしょ?

みたいなノリになってて微妙に感じてました。。。

でもIOSのarc4randomってMTでやってるだけだよなと思ってたら

訂正)

社内のIOS詳しい(?)人がMT実装だと言ってたので。。。人の又聞きは駄目だよな。。(汗


@ さんに
javaの実装とかも有るよ って聞いて調べたら

は確かに。

でもMTはそれほど処理速いってわけでもない*5

  • XorShift128

でやるのがベターなのかも

Xorshift 乱数生成アルゴリズムを書いてみた。 - 野良C++erの雑記帳
高速で質もよい疑似乱数生成アルゴリズム xorshift(xor128): ヘキサドライブ日記
http://unkar.org/r/tech/1192628099/76

// Math.hから該当部分を抜粋

namespace Math {

/**
 * XorShift128
 */
class Random {
    unsigned int x, y, z, w;
    void init(unsigned int seed);
public:
    Random();
    explicit Random(unsigned int seed);
    virtual ~Random() {}
    unsigned int generate();
    int nextInt();
    int nextInt(int max);
    int nextInt(int min, int max);
    int nextSign();
    float nextFloat();
    float nextFloat(float max);
    float nextFloat(float min, float max);
    bool nextBool();
};
}

// Math.cppから該当部分を抜粋

Math::Random::Random() {
    init(time(NULL));
}
Math::Random::Random(unsigned int seed) {
    init(seed);
}
Math::Random::~Random() {
}

void Math::Random::init(unsigned int seed) {
    if(seed == 0U) {
        x = 123456789U;
        y = 362436069U;
        z = 521288629U;
        w = 88675123U;
    } else {
        int seeds[4];
        for(unsigned int i = 0; i < 4U; ++i) {
            seed = 1812433253U * (seed ^ (seed >> 30)) + i;
            seeds[i] = seed;
        }
        x = seeds[0];
        y = seeds[1];
        z = seeds[2];
        w = seeds[3];
    }
}

unsigned int Math::Random::generate() {
    unsigned int  t = (x ^ (x << 11));
    x = y;
    y = z;
    z = w;
    w = (w ^ (w >> 19)) ^ (t ^ (t >> 8));
    return w;
}

int Math::Random::nextInt() {
    return (int)(generate()); // 符号つき変換は中身を評価しない
}

/**
 * [0, max)
 * @param max
 * @return
 */
int Math::Random::nextInt(int max) {
    return nextInt(0, max);
}

/**
 * [min, max)
 * @param min
 * @param max
 * @return
 */
int Math::Random::nextInt(int min, int max) {
    return min + (int)((max - min) * nextFloat());
}

int Math::Random::nextSign() {
    return nextBool() ? 1 : -1;
}

/**
 * [0.0, 1.0)
 * @return
 */
float Math::Random::nextFloat() {
    unsigned int rand = generate();
    if(rand == UINT_MAX) {
        --rand;
    }
    return (float)(rand) / (float)(UINT_MAX);
}

/**
 * [0, max)
 * @param max
 * @return
 */
float Math::Random::nextFloat(float max) {
    return nextFloat(0, max);
}

/**
 * [min, max)
 * @param min
 * @param max
 * @return
 */
float Math::Random::nextFloat(float min, float max) {
    return min + (max - min) * nextFloat();
}

bool Math::Random::nextBool() {
    return generate() & 1;
}

*1:というか、最初からそれぞれのサイズのアイコンくれればいいだけなんですが。。。

*2:ただし9patchはプログラマの嗜み<デザイナーの仕事じゃない>みたいな言われ方するので結局こっちに仕事が来ると。。。<汗

*3:IOSっぽいUIに<汗

*4:現在の最新バージョンでは対応済みです

*5:SecureRandomとかまで引っ張りだすと固まるとか昔からよくあった記憶が。。。