2012-06-05 47 views
1

我寫此代碼爲一個動態佈局,其中我使用這個循環以產生一對按鈕(這是在我生成它們的代碼的一部分)從動態視圖

for(int i = 1; i <= 2 ; i++) { 
     Button button1 = new Button(this); 
     button1.setTag("age"); 
     button1.setId(i); 
     layout.addView(button1); 

     Button button2 = new Button(this); 
     button2.setId(i); 
     button2.setTag("country"); 
     button2.setEnabled(false); 
     layout.addView(button2); 

     button1.setOnClickListener(this); 
     button2.setOnClickListener(this); 
     } 

認識的按鈕我想要做的是如果button1被點擊,button2應該被啓用(最初它被禁用)。

這將是一個非常簡單的任務,如果按鈕是在xml中創建的,那麼它們將爲每個按鈕分別指定R.id.xxxxx名稱,但在這裏我無法理解如何檢測其他按鈕OnClick(View v)方法,以便我可以更改它是否啓用,我試圖爲每個按鈕添加標籤,以便我有另一個參數來識別按鈕,但我不知道如何識別其他按鈕被點擊的按鈕1的視圖信息。

+0

我有類似的疑問。請幫助http://stackoverflow.com/questions/17061833/androidone-button-id-for-many-buttons-on-expandable-list-children – user2468835

回答

2

我假設你在點擊處理中使用了按鈕標籤。爲了保持標籤數據,並添加按鈕之間所需的佈線,您可以創建一個數據結構,將作爲一個標籤:

static class ButtonTag { 
    String buttonType; 
    Button partner; 
    ButtonTag(String type, Button button) { 
     buttonType = type; 
     partner = button; 
    } 
} 

然後,你可以重新組織你的設置代碼:

for(int i = 1; i <= 2 ; i++) { 
    Button button1 = new Button(this); 
    button1.setId(i); 
    layout.addView(button1); 

    Button button2 = new Button(this); 
    button2.setId(i); 
    button2.setEnabled(false); 
    button1.setTag(new ButtonTag("age", button2)); 
    button2.setTag(new ButtonTag("country", button1)); 
    layout.addView(button2); 
} 

的點擊顯然需要改變處理以將getTag()轉換爲ButtonTag而不是String

如果您不需要「年齡」和「國家」信息來區分按鈕類型,只需將每個按鈕設置爲另一個按鈕的標籤即可。

編輯:

對於後者方案,這裏是你如何會在點擊監聽器使用此:

public void onClick(View v) { 
    Object tag = v.getTag(); 
    if (tag instanceof Button) { 
     Button btn = (Button) tag; 
     btn.setEnabled(true); 
     v.setEnabled(false); 
    } 
} 

如果你所需要的「年齡」和其他標籤的「國家」部分原因,代碼將是隻有一點點不同:

public void onClick(View v) { 
    Object tag = v.getTag(); 
    if (tag instanceof ButtonTag) { 
     ButtonTag bTag = (ButtonTag) tag; 
     bTag.partner.setEnabled(true); 
     v.setEnabled(false); 
    } 
} 
+0

謝謝先生......但我仍然不明白如何識別另一個按鈕,....可以請告訴我什麼必須寫入onClick偵聽器,以便在單擊button1時,啓用button2 get。 – Sumit

+0

特德我在下面發佈了一個答案,你認爲答案是可以的嗎? – Sumit

+0

@Sumit - 你的代碼可能做你想做的,但效率低下(需要搜索所有的按鈕)和精心製作。我已將示例代碼添加到我的答案中,以顯示更直接的解決方案。 –

2

我得到了一個解決問題的辦法提到這個問題,在這裏(find button by ID or TAG)之後,它解決了我的問題面對這樣!

public class DynmaicViewExperimentActivity extends Activity implements OnClickListener{ 

List<Button> buttons; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     buttons = new ArrayList<Button>(); 
     setDynamicContentViewOfThisPage(); 
    } 

public void onClick(View v) { 
    // TODO Auto-generated method stub 
    int buttonType = 0; 
    if (v.getTag()=="age") 
      buttonType = 1; 
    else if (v.getTag()=="country") 
      buttonType = 2; 
    switch (buttonType) { 
     case 1: 
      for(Button b: buttons) { 
       if(b.getId() == v.getId() && b.getTag().equals("country")){ 
        b.setEnabled(true); 
        v.setEnabled(false); 
        } 
     case 2: 
      for(Button b: buttons) { 
       if(b.getId() == v.getId() && b.getTag().equals("age")){ 
        b.setEnabled(true); 
        v.setEnabled(false); 
        } 
       } 
      } 
     } 


private void setDynamicContentViewOfThisPage() { 
    // Defining the Scroll View and the LinearLayout 
    ScrollView sv = new ScrollView(this); 
    LinearLayout l = new LinearLayout(this); 
    l.setOrientation(LinearLayout.VERTICAL); 
    sv.addView(l); 

           for(int i = 1; i <= 2 ; i++) { 

            Button button1 = new Button(this); 
            button1.setId(i); 
            button1.setTag("age"); 
            buttons.add(button1); 
            l.addView(button1); 

            Button button2 = new Button(this); 
            button2.setId(i); 
            button2.setTag("country"); 
            buttons.add(button2); 
            l.addView(button2); 

            button.setOnClickListener(this); 
            button2.setOnClickListener(this); 

    // Set the content View to this 
     this.setContentView(sv); 
    } 
    } 
}