コンテントヘッダー

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
コンテントヘッダー

動的にSelecterを作る(ColoStateList)

こんにちは。
最近ちょっとだけTwitterにつぶやきをしている私です

さてタイトルの通りなんですが、開発をしているとボタンというパーツをよく使います。
そのボタンのテキストカラー背景色を状態に応じて変化させたい! という人、たくさんいますよね。
実際はxmlでファイルを作って設定するだけ...という具合に簡単なのですが、これはレイアウトにボタンがあることが決まっている場合です。(静的)

じゃあ、プログラム上から追加をする場合はどうなのよ、という話ですがこちらは動的追加ということになります。
が、動的追加の際には、なぜかうまくいかないことが多いらしいのです(私だけかな?)
そこで今回は動的にボタンを追加し、かつ動的にセレクターも作っちゃおうというお話です。

今回の利点
1、テーマ機能など多彩な表現方法がある場合でも楽に対応できる
2、実行速度がちょっと早い

ですかね(笑
ではさっそくソースを書きます

int[][] states = new int[][]{
//ここはボタンの状態を書いておく場所です。

//フォーカスがあるとき
new int[]{ android.R.attr.state_focused},
//押されているとき
new int[]{ android.R.attr.state_pressed},
//選択されているとき
new int[]{ android.R.attr.state_selected},
//選択されていない時
//最初の - は否定形です。
//xmlの書き方だとfalseのとこですね

new int[]{ -android.R.attr.state_selected}
};

//次にこちら。上に書いた各状態の時の色を書いてあります。
int[] colors = new int[]{/*フォーカス時の色*/ , /*押されているときの色*/ , /*選択されているときの色*/ , /*選択されてないときの色*/};

//そして最後に上の2つでカラーリストを作ります。
ColorStateList statelist = new ColorStateList(states, colors);

これをボタンとかにセットしてやれば状態に応じて色が変わってくれるはずです。
Button btn = new Button(this);
btn.setTextColor(statelist);
こんな感じ。

ちょっと余談
どんな部分でも静的な処理方法は書いてあるのに、動的処理については書いていないところが多いと思うAndroid。
処理時間も短くて済むのになんでだろうね(笑
スポンサーサイト
コンテントヘッダー

Androidのメモリ節約術?Javaのお話し

さてさて題名の通りですが、自己満足な部分がちょっとあります。

Androidってみなさんご存じのとおり、携帯端末なので性能がパソコンの様に高いわけではありませんよね?
そんな中で動かしているわけなので、当然そこら辺を意識せずにプログラミングしてたら重くなっちゃいます。

そこで、動きを軽くしたくて調べると、メモリーリークの話とか出てきますよね?
でも実際の例がのっている所があまりないですよね。私も実例を探しによくGoogleさんを使っていたんですけど、メモリーリークの話ばかりで、全然ありませんでした。

そこで今回は私の例(正しいかは不明ですが)をメモしておきます。
*Javaを初めてわずかなので常識だったらすみません(

ここからメモ。

たとえば、レイアウト上のTextViewTypeface(オリジナルフォント)をセットしたい場合。

Typeface typeface = Typeface.createFromAsset(this.getAssets(), "ファイル名.ttf");

TextView text = (TextView)findViewById(R.id.textview_id);
text.setTypeface(typeface);

としますよね?
ですが、これ、ただTypefaceをセットするだけとかだとtextというオブジェクトがメモリを食ってもったいない気がします。私だけかな?(笑

そこで1,2回しか処理を加えない場合とかはこうゆう書き方も出来ます。
((TextView)findViewById(R.id.textview_id)).setTypeface(Typeface.createFromAsset(this.getAssets(), "Assetのファイル名.ttf"));

最初の書き方だと typeface というオブジェクトと text というオブジェクトの2つが生成されます。
ですが、今書いたやり方だとオブジェクトは生成されません。(メモリも少し軽い気がします。

なぜこんなことが出来るかというと、Javaでは(TextView)findViewById(R.id.text_id);
ピンクの所の部分でIdで検索したオブジェクトをTextViewという型に変換しているのです。
なのでそれら全体を()で囲うことで、一時的にオブジェクト化?出来ちゃうらしいのです。

Androidでは余計なオブジェクトの生成は避けるべきなのでこうゆう書き方もあることを覚えておいたほうが良さそうです。

*これはあくまで私の経験談ですが、正しいかは怪しいので、プロの方がいたら詳しく教えていただけると嬉しいです。
プロフィール

Lilse_n_d

Author:Lilse_n_d
JavaとAndroid開発を初めて3か月ちょっと。
知識も経験もないですが、必死にもがいてみようと思います(笑)
それではよろしくお願いします。

検索フォーム
最新記事
最新コメント
最新トラックバック
カテゴリ
リンク
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。