首页 文章

在android的布局中按钮的通用监听器?

提问于
浏览
4

场景:我在xml中定义了三个按钮

<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)

4 回答

  • 0

    我宁愿使用 onClick="methodName" xml属性而不是一大堆 findViewById 调用 . 例如:

    <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和clickable属性放入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>
    
  • 7

    您无需为所有人重复相同的代码 . 您可以尝试使用通用侦听器,例如:

    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);
    
  • 5

    查看here代码示例 . 你必须使用 findViewById 来"find"你的按钮 .

  • 0

    您只需按照以下步骤轻松实现......

    您不必为每个按钮编写新的onClickListener ...只需将View.OnClickLister实现到您的Activity / Fragment ..它将实现名为onClick()的新方法,用于处理Button,TextView等的onClick事件 .

    1 - 在Activity / Fragment中实现OnClickListener()

    public class MainActivity extends Activity implements View.OnClickListener {
        }
    

    2 - 在Activity / Fragment中实现onClick()方法

    public class MainActivity extends Activity implements View.OnClickListener {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    
    @Override
    public void onClick(View v) {
      // default method for handling onClick Events..
    }
    }
    

    3-Implement OnClickListener()用于按钮

    @Override
          protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
    
           setContentView(R.layout.your_layout);
    
           Button one = (Button) findViewById(R.id.oneButton);
           one.setOnClickListener(this); // calling onClick() method
           Button two = (Button) findViewById(R.id.twoButton);
           two.setOnClickListener(this);
           Button three = (Button) findViewById(R.id.threeButton);
           three.setOnClickListener(this);
            }
    

    4 - 按ID查找按钮并实施您的代码

    @Override
           public void onClick(View v) {
    
           switch (v.getId()) {
    
            case R.id.oneButton:
            // do your code
            break;
    
            case R.id.twoButton:
            // do your code
            break;
    
             case R.id.threeButton:
            // do your code
            break;
    
            default:
            break;   }}
    

相关问题