2012-09-24 22 views
5

我增加了一些按鈕具有以下行:如何從編程添加的按鈕獲取OnClick()?

for (int i=0; i<XML.size(); i++) { 
//add button 
ToggleButton b = new ToggleButton(this); 
// Setting the parameters 
lefttextv.setLayoutParams(lleft); 
b.setLayoutParams(bright); 
//customize button 
    b.setOnClickListener(this); 
b.setId(id_button); 
System.out.println(id_button); 
b.setHeight(100); 
b.setWidth(200); 
// Adding to the RelativeLayout as a child 
layouth.addView(lefttextv); 
layouth.addView(b); 
    id_button++; 
    } 

但我怎麼能獲得這些的OnClick()方法?我已經使用此方法實現了View.OnClickListener:

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 
    switch (v.getId()) 
    { 
    case id_button: Log.d("Button 0","Button 0 pressed); 
     break; 
    } 
} 

但是,這不起作用,我該如何獲得Id?

+1

是否'id_button'始終爲0?如果不是,你爲什麼要在'case'語句中檢查0?考慮下次不要使用魔法常量。 –

+1

你不需要在某個時候調用setOnClickListener嗎? (另外,setId什麼都不做,我認爲) – njzk2

+0

按鈕的創建是在for循環中,並且創建了多個按鈕。 –

回答

7

b是認爲,如果你的onClick方法是在你的主類只使用b.setOnClickListener(this);讓你的活動實現onClickListener並且你有它。或者按照通常的方式設置巡迴聽衆。

該id用於xml引用,該對象被創建並且您使用此id來引用,在您的情況下,您創建了帶有ToggleButton所有屬性的視圖b。這是觀點。

相反,如果使用v.getId()只是用if(v == b)

+0

好的,但我使用for循環,並創建更多的按鈕,我不知道如何檢查我的開關/ case語句中的不同ID ... switch(v.getId()){case R.id.id_button:\t Log.d(「ONCLICK」,「Buttongedrückt」);}是不可能的,因爲我使用此行設置ID b.setId(id_button); –

+0

將視圖添加到ArrayList中...使用視圖組來檢查它們並檢查它上面的id。 – FabianCook

+0

在這種情況下,如果id_button是一個代表每個按鈕的遞增數字,爲什麼不使用Log.d(「Button」+ v.getId());? – FabianCook

6

只需使用b.setOnClickListener(this),其中this指的是實現OnClickListener的類。

編輯:

您可以使用ID資源來確定你的按鈕。有關更多信息,請參閱here。您可以將這些ID分配給編程生成的視圖,並在您的switch/case語句中檢查它們。

或者如@ SmartLemon說的,你可以檢查if (v == b),那麼你不需要打擾ID。

+0

好吧,這工作正常的一個按鈕,但我創建更多的按鈕在for循環與不同的ID。我怎麼能意識到這一點? –

+0

啊,好點。請參閱編輯。 – Magicode

+0

好的,但我不知道如何檢查他們在我的switch/case語句中...... switch(v.getId()){case R.id.id_button:\t Log.d(「ONCLICK」,「Buttongedrückt」);}'是不可能的,因爲我使用此行設置了ID'b.setId(id_button);' –

3

您已將idbutton設置爲id_button對不對?

添加onCreate方法:

b1.setOnClickListener(this);  

使用中的onClick方法低於ID:

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 
    if(v.getId() == R.id.id_button) 
    { 
    Log.d("Button 0","Button 0 pressed); 
     break; 
    } 
} 
+0

'R'文件是生成的文件,在運行時間之前生成,他不使用使用id_button的R.id.id_button hes。它只是一個局部變量。 – FabianCook

+0

他必須使用id。是的,我知道R是生成的文件。但他可以使用R.id.沒有問題,因爲ID在用戶點擊按鈕之前存儲在R中...... –

+0

但是他已經有了局部變量......如果在另一個文件中已經存在,那將是愚蠢的。那麼就會提出下一個事實,爲什麼在v和b比較時使用v.getId和b.getId? – FabianCook

3

,正如你在活動類實現onClickListener您可以通過使用此關鍵字來註冊該組件的點擊收聽當前對象。

class MyActivity extends Activity implements OnClickListener{ 
    private static final int id_button = 0; 

    public void onCreate(Bundle b){ 
     //add button 
     ToggleButton b = new ToggleButton(this); 
     // Setting the parameters 
     lefttextv.setLayoutParams(lleft); 
     b.setLayoutParams(bright); 
     //customize button 
     b.setId(id_button); 
     System.out.println(id_button); 
     b.setHeight(100); 
     b.setWidth(200); 
     // Adding to the RelativeLayout as a child 
     layouth.addView(lefttextv); 
     layouth.addView(b); 
     b.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     switch (v.getId()){ 
     case 0: Log.d("Button 0","Button 0 pressed); 
      break; 
     } 
    } 
} 
+0

v.getId()!= 0這裏它不工作 –

2

喜歡這種改變..

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 
    int i= b.getId(); 
    switch (v.getId()) 
    { 
     case i: 
      Log.d("Button 0","Button 0 pressed"); 
      break; 
    } 
} 
+0

這裏b應該在OnCreate()之外聲明來獲得訪問:) –