2013-07-21 3 views
0

내 대답을 아래로 스크롤하십시오. 질문은별로 중요하지 않으며 코드는 혼란 스럽습니다.한 번에 여러 버튼 리스너를 추가 할 수 있습니까?

버튼 리스너를 쉽게 반복 할 수 있도록 ID 레이블을 가져올 수있는 기능이 있습니까?

public static final Map<String, Integer> RMAP = createMapR(); 
// Map of widget id's in R 

private static Map<String, Integer> createMapR() { 
    Map<String, Integer> result = new HashMap<String, Integer>(); 
    for (Field f : R.id.class.getDeclaredFields()) { 
     String key = f.getName(); 
     Integer value = 0; 
     try { 
      value = f.getInt(f); 
     } 
     catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } 
     catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } 
     result.put(key, value); 
    } 
    return Collections.unmodifiableMap(result); 
} 

과 RMAP를 데리러, 내가 지정한 레이블이 교차한다 나의 조각의 다음 하나 현재 내가 파편이 코드의 라인을 주택 내 주요 "용기"XML에 있습니다. 몇 개의 버튼이있어서 거대한 청취자 목록을 지정하는 것이 비효율적 인 것처럼 보이기 때문에이 작업을 수행합니다. 그런 다음이 코드에서 벗어났습니다.

public class BottomFragment extends Fragment { 
private final String[] LABELS = {"button_do_1", "button_woah_2", "button_foo_1", 
           "button_hi_2"}; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.bottom_fragment, container, false); 
    for (String item : LABELS) { 
      if (Container.RMAP.containsKey(item)) { 
      ((Button) v.findViewById(Container.RMAP.get(item))) 
       .setOnClickListener(this); 
     } 
    } 
    return v; 
} 

그러나이 안드로이드의 목록을 반복 할 수있는 방법 인 경우 : 심지어 코드의 첫 번째 블록을 필요로하지 않았을) 특히 BottomFragment (이드 항목과는 ID 년대의 수동 목록을 제거 할 것 내가 입력했습니다.

+0

위의 코드는 작동합니다. 그러나 특정 조각에 대한 ID 목록을 가져올 수 있었다면 버튼 onClick 리스너를 setOnCLickListener (this)의 15 회선 대신 멋진 루프에 한꺼번에 추가 할 수있었습니다. 지금은 두 가지 목록을 사용하고 있습니다. 하나는 자동으로 채워지 며, 여기에는 모든 R.id() 변수가 포함됩니다. 제 경우에는 주로 버튼과 다른 위젯입니다. – Steven

+0

해당 유형의 함수가 없거나 해당 뷰에 위젯 ID를 가져 오는 데 사용할 수있는 함수의 조합이 있으면 위의 코드가 작동합니다. 입력 한 레이블이있어 위 코드가 자동으로 작동하지 않습니다. 신분증은 수동으로 있어요. – Steven

+1

이런 종류의 작업에는 SparseArray를 사용해야합니다. https://developer.android.com/reference/android/util/SparseArray.html – hwrdprkns

답변

0

나는 그것을 알아 냈다. 이 솔루션은 ViewGroup의 하위 내에 있습니다. 이 코드는 특정보기의 모든 단추에 대한 리스너를 추가합니다. 이 경우 뷰는 단추만으로 구성된 조각입니다. 이 코드는 많은 버튼이 있고 각각에 리스너를 추가하고자 할 때 유용합니다.

public static void addButtonListeners(View v, OnClickListener clickListener) 
{ 
    ViewGroup widgets = (ViewGroup) v; 
    for(int i = 0; i < widgets.getChildCount(); ++i) 
    { 
     View child = widgets.getChildAt(i); 
     if (child instanceof Button) 
     { 
      Button nextButton = (Button) child; 
      nextButton.setOnClickListener(clickListener); 
     } 
    } 
} 

이 기능에는보기 및 수신기를 전달해야합니다. 청취자는 'this'를 전달하면됩니다.

addButtonListeners(v, this); 
0

다음은 대략적인 논리 스케치입니다 (C#에서). 기본적으로 레이아웃을 위에서 아래로 한 번 지나가고 이후에 반복 할 수있는 ID-to-view 맵을 만듭니다. 이를 수행하는 일반적인 방법은 알고 있으므로 레이아웃 파일과 함께 유지 관리해야합니다 (둘 다 함께 수정해야 함).

당신이 당신의 조각 (들) (이 가능하게 조각 된 onMeasure에서 수행 할 수 또는 OnLayout 너무 무시)

당신의 조각의 레이아웃 파일을 가정 호스팅하는 활동의 한 OnCreate에서이 작업을 수행하려면 다음과 같은 한 말 구조


LinearLayout 

    TextView 
    TextView 

    RelativeLayout 

     EditText 
     EditText 

    TextView 

public override OnCreate() 
{ 
    Map<int, view> idLabels = new Map<int, view>(); 

    View v = fragment.View; 

    LinearLayout ll = (LinearLayout) v; 
    idLabels.Add(ll.Id, ll) 

    TextView tv1 = (TextView) ll.GetChildAt(0); 
    idLabels.Add(tv1.Id, tv1) 

    TextView tv2 = (TextView) ll.GetChildAt(1); 
    idLabels.Add(tv2.Id, tv2) 

    RelativeLayout rl = (RelativeLayout) ll.GetChildAt(2); 
    idLabels.Add(rl.Id, rl) 

    // notice the numbers being passed to GetChildAt, its a traversal of Views and Viewgroups ! 

    EditText et1 = (EditText) rl.GetChildAt(0); 
    idLabels.Add(et1.Id, et1) 

    EditText et2 = (EditText) rl.GetChildAt(1); 
    idLabels.Add(et2.Id, et2) 

    // now, go back "up" to top-most, linear layout viewgroup and get remaining views, if any 

    TextView tv3 = (TextView) ll.GetChildAt(3); 
    idLabels.Add(tv3.Id, tv3) 

    ... 

    foreach(int id in idLabels) 
    { 
     if(id == R.id.myViewIdLabel) // your R file will have all your id's in the literal form. 
     { 
      View v = idLabels.Map(id); 
      v.SetOnClickListener(this); 
     } 
    } 

} 

이것은 최선의 방법이 될 수 있지만하지 않을 수 있습니다 작동해야합니다.

관련 문제