0

我試圖建立一個onClickListner在while循環是這樣的:在while循環中設置OnClickListener?

View inflaterLayout; 
    LinearLayout myLayout = (LinearLayout)findViewById(R.id.linearLayout2);  
    while (counter < 5) { 
     inflaterLayout = LayoutInflater.from(getBaseContext()).inflate(R.layout.newplayerlayout, null); 
     myLayout.addView(inflaterLayout); 
     Button testButton = (Button) myLayout.findViewById(R.id.button2); 
     testButton.setId(testButtonArray[counter]); 
     ((TextView) myLayout.findViewById(R.id.textView1)).setId(testTextArray[counter]); 
     testButton.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       ((TextView) findViewById(testTextArray[counter])).setText("Hi!"); 

      } 
     }); 
     counter++; 
    } 

當你點擊它會改變未來的TextView的它的testButton的任何一個我以爲它會做的是!但只有第一個按鈕,這充氣工程!有誰知道我做錯了什麼?

基本上我想要完成的是,我正在充氣具有加號按鈕,減號按鈕和文本視圖的佈局,所以我希望能夠設置一個onClickListener,它將添加和減去而不必設置一百萬個單獨的onClickListeners!

+0

我想你應該保存在數組中的按鈕refrence。然後在循環外部設置onClicklistener。 –

+0

我試過了,我只是把它放在一個循環中,所以每個人都知道我正在努力完成什麼。 –

+0

我從你的新描述中更新了我的答案。 – Sam

回答

1
new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     ((TextView) findViewById(testTextArray[counter])).setText("Hi!"); 
    } 

的的onClick函數中的代碼按鈕點擊時運行。它並不是記住循環的每次迭代期間變量的值,因爲它在不同的範圍內。

更新

下面的代碼只使用一個OnClickListener遞增或遞減每個對應的TextView的值。您應該能夠以更好的外觀佈局輕鬆地將其應用於佈局充氣器。

public class Example extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     LinearLayout layout = new LinearLayout(this); 
     layout.setOrientation(LinearLayout.VERTICAL); 

     OnClickListener listener = new OnClickListener() { 
      public void onClick(View view) { 
       TextView text = (TextView) view.getTag(); 

       if(((Button) view).getText().equals("+")) 
        text.setText(Integer.parseInt(text.getText().toString()) + 1 + ""); 
       else 
        text.setText(Integer.parseInt(text.getText().toString()) - 1 + ""); 
      } 
     }; 

     for(int i = 0; i < 5; i++) { 
      LinearLayout line = new LinearLayout(this); 
      line.setOrientation(LinearLayout.HORIZONTAL); 

      TextView text = new TextView(this); 
      text.setText(i + ""); 
      line.addView(text); 

      Button plus = new Button(this); 
      plus.setTag(text); 
      plus.setText("+"); 
      plus.setOnClickListener(listener); 
      line.addView(plus); 

      Button minus = new Button(this); 
      minus.setTag(text); 
      minus.setText("-"); 
      minus.setOnClickListener(listener); 
      line.addView(minus); 

      layout.addView(line); 
     } 

     setContentView(layout); 
    } 
} 

從評論加成

我會假設你newplayerlayout.xml你有兩個按鈕(與IDS:「加」和「減」)和一個TextView(與ID「文本」)。也許你會實施這樣的方案:

OnClickListener mListener = new OnClickListener() { 
    public void onClick(View view) { 
     TextView text = (TextView) view.getTag(); 

     if(((Button) view).getText().equals("+")) 
      text.setText(Integer.parseInt(text.getText().toString()) + 1 + ""); 
     else 
      text.setText(Integer.parseInt(text.getText().toString()) - 1 + ""); 
    } 
}; 
... 


while (counter < 5) { 
    inflaterLayout = LayoutInflater.from(getBaseContext()).inflate(R.layout.newplayerlayout, null); 
    myLayout.addView(inflaterLayout); 

    TextView inflatedText = (TextView) inflaterLayout.findViewById(R.id.text); 
    Button testButton = (Button) inflaterLayout.findViewById(R.id.plus); 
    testButton.setTag(inflatedText); 
    testButton.setText("+"); 
    testButton.setOnClickListener(mListener); 

    testButton = (Button) inflaterLayout.findViewById(R.id.minus); 
    testButton.setTag(inflatedText); 
    testButton.setText("-"); 
    testButton.setOnClickListener(mListener); 

    counter++; 
} 
+0

除了我的版面充氣器,我該怎麼做?因爲使用3個開關語句,每個10個按鈕都不是很有趣。 –

+0

@WilliamL。我更新了我的答案,希望有所幫助。 – Sam

+0

你真棒!謝謝 –

2

試試這個:

View inflaterLayout; 
    LinearLayout myLayout = (LinearLayout)findViewById(R.id.linearLayout2);  
    while (counter < 5) { 
     inflaterLayout = LayoutInflater.from(getBaseContext()).inflate(R.layout.newplayerlayout, null); 
     myLayout.addView(inflaterLayout); 
     Button testButton = (Button) myLayout.findViewById(R.id.button2); 
     testButton.setId(testButtonArray[counter]); 
     ((TextView) myLayout.findViewById(R.id.textView1)).setId(testTextArray[counter]); 

     testButton.setOnClickListener(btnhandler); // Click Listener here 
     counter++; 
    } 

之外創建按鈕ClickListener while循環:

View.OnClickListener btnhandler = new View.OnClickListener() { 
    public void onClick(View v) { 

switch (v.getId()) { 
    case testTextArray[0]: 
    ((TextView) findViewById(testTextArray[0])).setText("Button One"); 
    break; 
    case testTextArray[1]: 
    ((TextView) findViewById(testTextArray[1])).setText("Button Two"); 
    break; 
    ..... 
    } 
    } 
} 
+0

我會使用'switch'而不是鏈接'else if'語句 – gobernador

+0

感謝@gobernador我改變了它。 –

0

通過()您註冊類單擊按鈕時執行它的onClick()方法的代碼testButton.setOnClickListener。所以每當在while循環中註冊一個新的匿名類,並且當你點擊按鈕時,最後註冊類的onClick()方法將被執行。

0
View inflaterLayout; 
LinearLayout myLayout = (LinearLayout)findViewById(R.id.linearLayout2);  
while (counter < 5) { 
    inflaterLayout = LayoutInflater.from(getBaseContext()).inflate(R.layout.newplayerlayout, null); 
    myLayout.addView(inflaterLayout); 
    Button testButton = (Button) myLayout.findViewById(R.id.button2); 
    testButton.setId(testButtonArray[counter]); 
    ((TextView) myLayout.findViewById(R.id.textView1)).setId(testTextArray[counter]); 
    testButton.setOnClickListener(new View.OnClickListener() { 
     int select = counter; 
     @Override 
     public void onClick(View v) { 
      ((TextView) findViewById(testTextArray[select])).setText("Hi!"); 
     } 
    }); 
    counter++; 
}