AndroidTips備忘録早見メモ
自分検索用。
twitterでfavっても検索できないクライアントが多い or ズレたりするので
- Html.fromHtmlで使う色指定記述の動的なやり方
- res/valus/string.xml 等で定義する文字列
- xml定義と呼び方
- configChangeの話
- eclipse ADTでのアイコン調整機能の話
- Toastをレイアウトを用意せずにカスタマイズしたいの話
- 遅延実行処理の話
- 画像投稿Intentの話
- Javaでのメルセンヌ・ツイスタコードの話
☆) Html.fromHtmlで使う文字列での色指定記述の動的なやり方
- 一応マスクかけないと駄目
- α値指定すると色表示できない
String color_str = String.format("#%06X",0xFFFFFF & m_r.getColor(R.color.green) );
<string name="start_msg"> <font color=%1$s> ゲーム開始! </font> <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&m=%2$s </string> </resources>
@kimukou2628 Javaの処理内容を知らないのではっきり分かりませんが「%26m」が怪しい気がします。「%26」って「&」ですか?
2013-05-09 18:22:22 via web to @kimukou2628
@mtk_f はいそうです。& 等はxmlに記述する場合はurlエンコードしたものを記述するとのことでしたので。mはどうもDateFormat周りの規則にぶつかっているような気がしています
2013-05-09 19:07:15 via YoruFukurou to @mtk_f
@kimukou2628 xmlだから <string name="hoge" >URL だと思ったのですが「Conversion: m」って何でしょうね?
2013-05-09 19:14:10 via web to @kimukou2628
- 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; }
- TypedArray自体は
- getString()
- getBoolean()
- getColor()
- getDimensions()
- getDrawable()
等 色々とあるらしい。
☆) configChangeの話
そもそもこれを知らなかった大誤算・・・ URL
2013-07-16 20:16:43 via web
@bina1204 お疲れ様です。バーコードリーダーってキーボード扱いなのですか(メモメモ。 ちなみにキーボード開閉式のものだと keyboardHidden も入れておかないと、キーボードの出し入れてWevViewがリロードされますね
2013-07-16 21:24:07 via YoruFukurou to @bina1204
@kimukou_26 入力デバイスは全部キーボード扱いなのかな。config change のログは出てたのに時間掛かってしまって凄く悔しい(´・ω・`)
☆) eclipse ADTでのアイコン調整機能の話
ASのWizardに入った eclipse ADTでのアイコン調整機能
実はあとから呼べるって話、あとから知った。うーん。知らないことばかりだわ。。。(汗
アイコンを勝手に大きさ別に作ってくれるのって初めてプロジェクト作った時だけなのかしら。後で差し替えるときはせっせと各サイズで書き出しして放り込まなきゃダメってことかな。
@mgmix5 New から Other 選んで Android の中の Android Icon set
2013-05-17 18:16:32 via YoruFukurou to @mgmix5
@zaki50 ありがとーありがとー。
2013-05-17 18:17:19 via twicca to @zaki50
でもひとつ注意しておかないと駄目なのは
で記載されてる推奨サイズで作られるということ。
ここを覚えておかないと「サイズが小さいんだけどどうにかしてよ!」
とデザイナーさんとかに文句言われたりする*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
レイアウトを用意する前提であれば
- Toastをカスタマイズする « Tech Booster
- カスタムToastの角を丸める | trash thread
- Y.A.M の 雑記帳: Android Toast で画像を表示する
- 琴線探査: AndroidでToastの表示時間を自由に設定したりアニメーションなしで即非表示したい!
ただ最後の例のレベルまでいじると、手軽さが凄く違う気がするけど‥‥‥
cancel()で終了すると思ってたけどちょっと違うみたい
最終的には
☆) 遅延実行処理の話
AsyncTask や ExecutorServce やっぱりDelay実行するすべがないのか。。。(汗。Handler.postDelayed噛ませろってのは本末転倒だな。。。(汗
@kimukou2628 Javaで非同期処理を遅延実行させたいのですか?ScheduledExecutorServiceというものがありますけど。
@aoetk ExecutorServiceに関しては多分それです! ありがとうございます! (今GalaxyS4 で一度に複数スレッド一度に動かすとアプリが固まる不具合対処中でして。。)凄く助かります<ぺこり
2013-08-13 16:09:08 via YoruFukurou to @aoetk
@kimukou2628 Javaで並行処理というとこの本がバイブル的存在なので持っておくといいですよ。 URL
ようは
- とりあえず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);
あたりが肝か。。
でもどっちにしてもSD権限付けないと駄目だから厳しいわけか。。4.2系以下であれば、1)MediaStore.Images.Media.insertImage でギャラリー保存、そのuriを渡す でいけるのかな。画質は50%に落ちるけど。。
他のは未検証
@takke 質問ですがTwitPane にi.setType("image/png");i.putExtra(Intent.EXTRA_STREAM,url);i.putExtra(Intent.EXTRA_TEXT, s)と送った時に sを投稿文にするの難でしょうか?
2013-08-17 19:15:34 via YoruFukurou to @takke
@takke 画像投稿として 画像が添付される動きまでは確認しています (はむーん 辺りでは Intent.EXTRA_TEXTが本文と入力BOXに入力される所まで確認できているので難しくなければ対応していただけると有りがたいです
2013-08-17 19:23:09 via YoruFukurou to @takke
@kimukou2628 次の版で対応しますね。
@takke おお。ありがとうございます〜!凄く助かります。
2013-08-17 19:54:59 via YoruFukurou to @takke
自分が触ってるアプリとか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が
- 線形合同法 & 時間Seed
って話で偏るから、IOSの乱数関数よりクソだよね−って話がよくでてて
- NDKで実装するのがベターでしょ?
- boostなら letsboost::random つかえばよくない?letsboost::random
みたいなノリになってて微妙に感じてました。。。
でもIOSのarc4randomってMTでやってるだけだよなと思ってたら
訂正)
@kimukou_26 arc4randomはMTじゃないですよー。RC4(ストリーム暗号)の出力段をそのまま出しているようなもので、こちらは暗号学的に強力な乱数です。
2013-08-24 13:20:50 via twicca to @kimukou_26
@alterakey スミマセン><。IOSで容易されてる MT実装の乱数関数ってなんでしたっけ?2番めの方の方ですか?
2013-08-24 13:22:30 via YoruFukurou to @alterakey
@kimukou_26 デフォルトでmtは用意されていないと思いますよ。
2013-08-24 14:28:23 via twicca to @kimukou_26
@alterakey さんに
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; }