0

有两种处理点击事件的方法。

  1. 我们像这样在xml文件中定义它
<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="doSomethingMethod"
    android:text="Click Me" />
  1. 我们在活动类上实现 onclicklistener 并执行此操作

包 com.example.buttontest;

import android.os.Bundle;
import android.app.Activity; 
import android.util.Log; 
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener; 
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener
{   
Button button;  
Button another;         
@Override   protected void
    onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);       
button = (Button)findViewById(R.id.button1);        
another = (Button)findViewById(R.id.button2); 

button.setOnClickListener(this);

another.setOnClickListener(this);
}


@Override   
public void onClick(View v) {       
  // TODO Auto-generated
  method stub       
  if(v.getId()==R.id.button1) 
  {             
   Log.d("MYTAG", "First button was clicked");  
  }

  if(v.getId()==R.id.button2)       
   {            
    Log.d("MYTAG", "Second button was clicked");    
   }
 }  

}

我的问题为什么我们很难在第二种情况下调用方法?有什么区别?使用第二种情况的好处是什么?

如果您不明白这个问题,请告诉我,我会尝试更清楚地解释它。

谢谢。

4

3 回答 3

1

这比在 XML 中使用 onClick 要好 如果您的代码太长,请避免在 xml 中使用 onclick....

            Button b=new Button(getApplicationContext());
    b.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            // your code...
        }
    });
于 2013-09-09T11:23:51.720 回答
1

这些是完全相同的。android:onClick在 API 级别 4 中添加以使其更容易、更类似于 Javascript 网络,并从 XML 驱动一切。它在内部做的是OnClickListener在 Button 上添加一个,它调用您的DoIt方法。

以下是使用 aandroid:onClick="DoIt"在内部执行的操作:

Button button= (Button) findViewById(R.id.buttonId);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        DoIt(v);
    }
});

android:onClick像往常一样使用 XML 配置,您使用. 但这很容易通过在DoIt方法中添加测试来解决。

   Button mClickButton1 = findViewById(R.id.clickButton1);
   mClickButton1.setOnClickListener(this);
   Button mClickButton2 = findViewById(R.id.clickButton2);
    mClickButton2.setOnClickListener(this);
  // some where else in your code

   public void onClick(View v) {
      switch (v.getId()) {
          case: R.id.clickButton1 {
                // do something for button 1 click
              break;
            }
        case: R.id.clickButton2 {
            // do something for button 2 click
              break;
              }
       }
  }

正如我所解释的那样,这种方式在他看来更整洁,因为所有 onClick 计算都在一个地方处理,而不是拥挤 onCreate 方法。但我看到的缺点是:

1.意见本身,

2.onClick方法使用的可能位于onCreate中的任何其他对象都必须成为一个字段。

即使您android:onClick = "DoIt"在 XML 中定义,您也需要确保您的活动(或视图上下文)具有以完全相同的名称和视图作为参数定义的公共方法。Android 将您的定义与活动中的此实现联系起来。最后,实现将具有您在匿名内部类中编写的相同代码。因此,简而言之,您将拥有一个带有实现代码的公共方法,而不是在活动中拥有内部类和侦听器附件。

于 2013-09-09T11:28:35.570 回答
0

尝试这个,

package com.example.buttontest;


import android.os.Bundle;
import android.app.Activity; 
import android.util.Log; 
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener; 
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener
{   
Button button;  
Button another;         
@Override   protected void
    onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);   

button = (Button)findViewById(R.id.button1);        
another = (Button)findViewById(R.id.button2); 

button.setOnClickListener(this);

another.setOnClickListener(this);
}

@Override   
public void onClick(View v) {       
  // TODO Auto-generated
  method stub       
  if(v.getId()==R.id.button1) 
  {             
   Log.d("MYTAG", "First button was clicked");  
  }

  if(v.getId()==R.id.button2)       
   {            
    Log.d("MYTAG", "Second button was clicked");    
   }
 } 

}
于 2013-09-09T11:30:53.573 回答