2013-01-24 41 views
0

我需要的是訪問被點擊的項目(佈局)的按鈕;此代碼可以工作,但只顯示所有佈局的所有按鈕,TextView,...而不是單擊的按鈕。 如果你想運行此代碼,您可以用按鈕添加其他佈局的測試 感謝你的幫助 這裏是我的佈局:訪問每個佈局的按鈕

這是activity_main.xml中

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" > 

     <ListView 
      android:id="@+id/listView_button" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" > 
     </ListView> 
     <TextView   
      android:id="@+id/myTextView"  
      android:layout_width="fill_parent"  
     android:layout_height="25dp"  
     android:textSize="23sp" /> 
    </LinearLayout> 

然後我的MainActivity:

package com.example.adapterlist; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Map; 

import android.os.Bundle; 
import android.app.Activity; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ListView; 

public class MainActivity extends Activity { 
    Map<String, Integer> layoutIds = new HashMap<String, Integer>(); 
    ArrayList<String> arrayForArrayAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     final ListView listView = (ListView) findViewById(R.id.mylist); 
     java.lang.reflect.Field[] ID_Fields = R.layout.class.getFields(); 
     String []values=new String[ID_Fields.length]; 
     int[] resArray = new int[ID_Fields.length]; 
     for(int i = 0; i < ID_Fields.length; i++){ 
      try { 
       resArray[i] = ID_Fields[i].getInt(null); 
       values[i]=getResources().getResourceEntryName(resArray[i]); 
       Log.v("resArray[i] " , getResources().getResourceEntryName(resArray[i])); 

      } catch (IllegalArgumentException e) { 
       e.printStackTrace(); 
      } catch (IllegalAccessException e) { 
       e.printStackTrace(); 
      } 
     } 
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, android.R.id.text1, values); 
      listView.setAdapter(adapter); 
      listView.setOnItemClickListener(new OnItemClickListener(){ 







       @Override 
       public void onItemClick(AdapterView<?> arg0, View arg1, 
         int arg2, long arg3) { 
        iJustClickedAnItemInTheList((String) listView.getSelectedItem()); 


       } 
      }); 
private void iJustClickedAnItemInTheList(String idname) { 
     setContentView(layoutIds.get(idname)); 
     ArrayList<Button> allButtonsInLayout = getViewsFromViewGroup(findViewById(android.R.id.content), Button.class); 
    } 

    public static <T> ArrayList<T> getViewsFromViewGroup(View root, Class<T> clazz) { 
     ArrayList<T> result = new ArrayList<T>(); 
     for (View view : getAllViewsFromRoots(root)) 
      if (clazz.isInstance(view)) 
       result.add(clazz.cast(view)); 
     return result; 
    } 

    public static ArrayList<View> getAllViewsFromRoots(View...roots) { 
     ArrayList<View> result = new ArrayList<View>(); 
     for (View root : roots) 
      getAllViews(result, root); 
     return result; 
    } 

    private static void getAllViews(ArrayList<View> allviews, View parent) { 
     allviews.add(parent); 
     if (parent instanceof ViewGroup) { 
      ViewGroup viewGroup = (ViewGroup)parent; 
      for (int i = 0; i < viewGroup.getChildCount(); i++) 
       getAllViews(allviews, viewGroup.getChildAt(i)); 
     } 
    } 

最後,我的類MySimpleA rrayAdapter:

import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.TextView; 

public class MySimpleArrayAdapter extends ArrayAdapter<String> { 
    private final Context context; 
    private final String[] values; 

    public MySimpleArrayAdapter(Context context, String[] values) { 
    super(context, R.layout.troisieme, values); 
    this.context = context; 
    this.values = values; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = (LayoutInflater) context 
     .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View rowView = inflater.inflate(R.layout.troisieme, parent, false); 
    TextView textView = (TextView) rowView.findViewById(R.id.myTextView); 
    //ImageView imageView = (ImageView) rowView.findViewById(R.id.icon); 
    textView.setText(values[position]); 
    // Change the icon for Windows and iPhone 
    String s = values[position]; 


    return rowView; 
    } 
} 
+0

現在我的問題更清晰了嗎? – Sharp

+0

有任何想法嗎? – Sharp

+0

請更清楚。您是否想在設置contentView上的所有視圖時使用ID名稱?例如在佈局'someLayout'上,你只有一個ID爲'R.id.myTextview'的textView,你只需要'myTextview'? – stealthjong

回答

1

要從單個佈局得到所有的Buttons

public static <T> ArrayList<T> getViewsFromViewGroup(View root, Class<T> clazz) { 
    ArrayList<T> result = new ArrayList<T>(); 
    for (View view : getAllViewsFromRoots(root)) 
     if (clazz.isInstance(view)) 
      result.add(clazz.cast(view)); 
    return result; 
} 

public static ArrayList<View> getAllViewsFromRoots(View...roots) { 
    ArrayList<View> result = new ArrayList<View>(); 
    for (View root : roots) 
     getAllViews(result, root); 
    return result; 
} 

private static void getAllViews(ArrayList<View> allviews, View parent) { 
    allviews.add(parent); 
    if (parent instanceof ViewGroup) { 
     ViewGroup viewGroup = (ViewGroup)parent; 
     for (int i = 0; i < viewGroup.getChildCount(); i++) 
      getAllViews(allviews, viewGroup.getChildAt(i)); 
    } 
} 

MainActivity你叫

ArrayList<Button> allButtonsOnCurrentLayout = getViewsFromViewGroup(findViewById(android.R.id.content), Button.class); 

現在你有一個ArrayList與當前所有Buttons佈局。您可以迭代列表並使用您已經顯示的反射來獲取他們的ID,或者顯示他們的標籤等等。

編輯:我最後一次嘗試幫助,用自己的

public class MainActivity extends Activity { 
    Map<String, Integer> layoutIds = new HashMap<String, Integer>(); 
    ArrayList<String> arrayForArrayAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     for(Field field : R.layout.class.getFields()){ 
      try { 
       int id = field.getInt(null); 
       String name = getResources().getResourceEntryName(id); 
       layoutIds.put(name, id); 
       arrayForArrayAdapter.add(name); 
      } 
      catch (IllegalArgumentException e) { 
       e.printStackTrace(); 
      } 
      catch (IllegalAccessException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    private void iJustClickedAnItemInTheList(String idname) { 
     setContentView(layoutIds.get(idname)); 
     ArrayList<Button> allButtonsInLayout = getViewsFromViewGroup(findViewById(android.R.id.content), Button.class); 
    } 

    public static <T> ArrayList<T> getViewsFromViewGroup(View root, Class<T> clazz) { 
     ArrayList<T> result = new ArrayList<T>(); 
     for (View view : getAllViewsFromRoots(root)) 
      if (clazz.isInstance(view)) 
       result.add(clazz.cast(view)); 
     return result; 
    } 

    public static ArrayList<View> getAllViewsFromRoots(View...roots) { 
     ArrayList<View> result = new ArrayList<View>(); 
     for (View root : roots) 
      getAllViews(result, root); 
     return result; 
    } 

    private static void getAllViews(ArrayList<View> allviews, View parent) { 
     allviews.add(parent); 
     if (parent instanceof ViewGroup) { 
      ViewGroup viewGroup = (ViewGroup)parent; 
      for (int i = 0; i < viewGroup.getChildCount(); i++) 
       getAllViews(allviews, viewGroup.getChildAt(i)); 
     } 
    } 
} 

如果好好嘗試一下幫助你,我不知道什麼會延長下面的代碼。現在使用allButtonsInLayout來顯示Button的ID,或者你想要對所有buttons做什麼。

+0

謝謝,但似乎getAllViewsFromRoots()必須創建... – Sharp

+0

請參閱編輯。但是,我描述了你真正想要的,還是我誤解了你? – stealthjong

+0

對不起,我已經得到它我測試它,我會看到 – Sharp