android.view.ViewといえばfindViewById(int)ですよねー。
実はそれ以外にもfindViewWithTag (Object tag)やfindViewsWithText(ArrayList, CharSequence, int)てのがあるようです。
使い所がよくわかりませんがなんか使えそうですね。
個人的にはViewのクラス名で取り出したいなーと、例えばjavascriptのgetElementsByTagName(name)のノリだと言うと判ると思います。
List<T> findViewsWithClass(View v, Class<T>)
はい、完成。本当は v instanceof Tってやりたかったけど怒られました。仕方なくClassのフルネームで比較してます。なのでサブクラスとかまでは検出できません。
public static <T extends View> List<T> findViewsWithClass(View v, Class<T> clazz){
List<T> views = new ArrayList<T>();
findViewsWithClass(v, clazz, views);
return views;
}
private static <T extends View> void findViewsWithClass(View v, Class<T> clazz, List<T> views){
if(v.getClass().getName().equals(clazz.getName())){
views.add((T)v);
}
if(v instanceof ViewGroup){
ViewGroup g = (ViewGroup)v;
for(int i = 0; i < g.getChildCount(); i++){
findViewsWithClass(g.getChildAt(i), clazz, views);
}
}
}
※追記20120223
@zaki50さんからツッコミが。ありがとうございます!!
@sys1yagi visible-true.blogspot.com/2012/02/list-f… で getName() で比較してますが、 Class#isAssignableFrom 使うといいですよ java.sun.com/j2se/1.5.0/ja/…
— ざき イラレ勉強中 (@zaki50) February 23, 2012
直した!。これの場合だとサブクラスまでがっつり取れる。
private static <T extends View> void findViewsWithClass(View v, Class<T> clazz, List<T> views) {
if (clazz.isAssignableFrom(v.getClass())){
views.add(clazz.cast(v));
}
if (v instanceof ViewGroup) {
ViewGroup g = (ViewGroup) v;
for (int i = 0; i < g.getChildCount(); i++) {
findViewsWithClass(g.getChildAt(i), clazz, views);
}
}
}
使う
こう使うとよさげ。例えばこういうレイアウト
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="mogeee" >
</TextView>
<ImageView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher" >
</ImageView>
<LinearLayout
android:id="@+id/main_list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
</LinearLayout>
</LinearLayout>
こういうコードで要素を取り出せます。以下はTextViewを取り出してます。
List<TextView> views = findViewsWithClass(v, TextView.class);
if(views.isEmpty()){
Log.d(TAG, "not found");
}
else{
Log.d(TAG, "find:"+views.size());
}
0 件のコメント:
コメントを投稿