2010-10-12 43 views
4

方案:我在XML在Android的佈局按鈕的通用監聽器?

<button android:id="@+id/firstbtn" 
    ... 
/> 
<button android:id="@+id/secbtn" 
    ... 
/> 
<button android:id="@+id/thirdbtn" 
    ... 
/> 
 
In Java one way to listen to them is 
Button firstbtn = (Button) findViewById(R.id.firstbtn); 
    firstbtn.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       Toast.makeText(getBaseContext(), 
         "You have clicked first button", 
         Toast.LENGTH_SHORT).show(); 
      } 
     }); 

爲第二BTN定義三個按鈕,相同的代碼必須用不同的ID重複??
我怎樣才能使它足夠通用,它可以聽所有的按鈕(說for循環),並在處理時,我應該能夠區分不同的btns。 (可能會獲得元素ID)

回答

5

您不必爲所有人重複相同的代碼。你可以嘗試一個通用的聽衆,如:

private OnClickListener mCorkyListener = new OnClickListener() { 
    public void Click(View v) { 
      // do something 
    } 
}; 

然後,所有你需要做的是登記所有三個按鈕使用此mCorkyListener。 即,內部的onCreate(),

Button firstbtn = (Button) findViewById(R.id.firstbtn); 
Button secondbtn = (Button) findViewById(R.id.secondbtn); 
Button thirdbtn = (Button) findViewById(R.id.thirdbtn); 

firstbtn.setOnClickListener(mCorkyListener); 
secondbtn.setOnClickListener(mCorkyListener); 
thirdbtn.setOnClickListener(mCorkyListener); 
+0

沒有必要分配變量,除非你要重新使用他們的東西:'(Button)findViewById(R.id.firstbtn))。setOnClickListener(mCorkyListener);' – Blrfl 2010-10-12 10:57:02

+0

好吧,所以沒有辦法獲得除findViewBId(id)以外的按鈕對象?我認爲可能有一種方法可以將按鈕對象中的所有按鈕都作爲按鈕對象數組來獲取,並且我可以遍歷它並向其中添加一個偵聽器,每次在XML中添加按鈕時都會避免添加Java代碼。 – sat 2010-10-12 11:07:30

+0

我不知道如何創建您的按鈕數組。無論如何,你可以通過使用view.getId() – kiki 2010-10-12 12:44:22

0

查找here爲代碼示例。你必須使用findViewById來「查找」你的r按鈕。

+0

知道你的mCorkyListener中點擊了哪個按鈕。這部分有用,我想知道如何匹配View.getId(),它是一個整數,帶有xml中使用的id名稱,這個例子。謝謝,但仍然在尋找更通用的答案。比如將所有btns作爲對象數組而不使用id並循環並將偵聽器附加到它。 – sat 2010-10-12 13:28:47

7

而不是一個巨大的findViewById調用,我更喜歡使用onClick="methodName" xml屬性。例如:

<LinearLayout ...> 
    <Button android:text="1" onClick="onButtonClicked" clickable="true" /> 
    <Button android:text="2" onClick="onButtonClicked" clickable="true" /> 
    <Button android:text="3" onClick="onButtonClicked" clickable="true" /> 
    <Button android:text="4" onClick="onButtonClicked" clickable="true" /> 
</LinearLayout> 

在活動在佈局顯示只需添加一個方法

public void onButtonClicked(View v){ 
    // do whatever needs to be done. For example: 
    Toast.makeText(getApplicationContext(), ((Button) v).getText() + " clicked", Toast.LENGTH_SHORT).show(); 
} 

你也可以把的onClick和點擊屬性放入res/styles.xml文件以節省更多打字:

<?xml version="1.0" encoding="UTF-8" ?> 
<resources> 
    <style name="clickable_button" > 
    <item name="android:onClick" >onButtonClicked</item> 
    <item name="android:clickable" >true</item> 
    </style> 
</resources> 

那麼你的佈局被簡化爲

<LinearLayout ...> 
    <Button android:text="1" style="@style/clickable_button" /> 
    <Button android:text="2" style="@style/clickable_button" /> 
    <Button android:text="3" style="@style/clickable_button" /> 
    <Button android:text="4" style="@style/clickable_button" /> 
</LinearLayout>