2010-10-12 89 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>