AS(三)view的点击事件解析

首先,参考博客:http://www.runoob.com/w3cnote/android-tutorial-listen-event-handle.html
参考书目:Android移动应用基础教程,传智播客高教产品研发部编著

1、为什么要知道事件处理机制?

   设计出一个精美的界面之后,要开始实现你所期待的功能,不然再精美的界面也只是徒有其表啊。
   比如,你在界面上画了一个按钮,希望点击按钮之后出现一个提示“你点击了按钮”,那么实现这个按钮的功能过程就是今天我要说的内容啦!

2、Android如何处理事件

引用http://www.runoob.com/w3cnote/android-tutorial-listen-event-handle.html这位大神的图来说明:

AS(三)view的点击事件解析_第1张图片

事件监听机制是一种委派式的事件处理机制,事件源(组件)事件处理委托给事件监听器,当事件源发生指定事件时,就通知指定事件监听器,执行相应的操作

3、五种实现方法和代码实例

 ********

a)用匿名内部类实现,比较适用于按钮较少的情况。

 核心代码:
 public class MainActivity extends Activity {    
private Button btnshow;    

@Override    
protected void onCreate(Bundle savedInstanceState) {    
    super.onCreate(savedInstanceState);    
    setContentView(R.layout.activity_main);    
    btnshow = (Button) findViewById(R.id.btnshow);    
    btnshow.setOnClickListener(new OnClickListener() {    
        //重写点击事件的处理方法onClick()    
        @Override    
        public void onClick(View v) {    
            //显示Toast信息    
            Toast.makeText(getApplicationContext(), "你点击了按钮", Toast.LENGTH_SHORT).show();    
        }    
    });    
}        

}

b)使用内部类实现:可以在该类中进行复用,可直接访问外部类的所有界面组件

 核心代码:
 public class MainActivity extends Activity {
private Button btnshow1;
private Button btnshow2;
private Button btnshow3;
private Button btnshow4;
private Button btnshow5;
private Button btnshow6;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btnshow1 = (Button) findViewById(R.id.button1);
    btnshow2 = (Button) findViewById(R.id.button2);
    btnshow3 = (Button) findViewById(R.id.button3);
    btnshow4 = (Button) findViewById(R.id.button4);
    btnshow5 = (Button) findViewById(R.id.button5);
    btnshow6 = (Button) findViewById(R.id.button6);
    //直接new一个内部类对象作为参数
    btnshow1.setOnClickListener(new BtnClickListener());
    btnshow2.setOnClickListener(new BtnClickListener());
    btnshow3.setOnClickListener(new BtnClickListener());
    btnshow4.setOnClickListener(new BtnClickListener());
    btnshow5.setOnClickListener(new BtnClickListener());
    btnshow6.setOnClickListener(new BtnClickListener());
}
//定义一个内部类,实现View.OnClickListener接口,并重写onClick()方法
class BtnClickListener implements View.OnClickListener
{
    @Override
    public void onClick(View v) {
        switch(v.getId()) {
            case R.id.button1:
            case R.id.button2:
            case R.id.button3:
            case R.id.button4:
            case R.id.button5:
                Toast.makeText(getApplicationContext(), "没有中奖噢", Toast.LENGTH_SHORT).show();
                break;
            case R.id.button6:
                Toast.makeText(getApplicationContext(), "Bravo,quelle chance !", Toast.LENGTH_SHORT).show();
                break;
        }
    }
}

}

c)用了内部类之后,logically,应该用外部类啦:外部类不能直接访问用户界面类中的组件,要通过构造方法将组件传入使用;这样导致的结果就是代码不够简洁!

TextviewClass.java:
public class TextviewClss implements View.OnClickListener {
private TextView txtshow;
public TextviewClss(TextView txt)
{
txtshow=txt;
}

@Override
public void onClick(View v) {
    txtshow.setText("您点了按钮哦");
}

}
OuterListener.java:
public class MainActivity extends Activity {
private Button btnshow;
private TextView txtshow;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btnshow =(Button) findViewById(R.id.button);
    txtshow=(TextView) findViewById(R.id.textView);
    btnshow.setOnClickListener(new TextviewClss(txtshow));
}

}

d)直接使用Activity作为事件监听器:只需要让Activity类实现XxxListener事件监听接口,在Activity中定义重写对应的事件处理器方法

public class MainActivity extends Activity implements View.OnClickListener{
private Button btnshow;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnshow=(Button)findViewById(R.id.button);
btnshow.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    Toast.makeText(getApplicationContext(), "点击了按钮", Toast.LENGTH_SHORT).show();
}

}
e)直接绑定到标签:就是直接在xml布局文件中对应得Activity中定义一个事件处理方法
方法就是在布局文件中添加一个属性:onclick = “myClick”
核心代码:
public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}
//自定义一个方法,传入一个view组件作为参数
public void myClick(View source)
{
    Toast.makeText(getApplicationContext(), "按钮被点击了", Toast.LENGTH_SHORT).show();
}

}
在activity_main.xml中添加:
android:onClick=”myClick”
**4、终于写完了,虽然是差不多对照博主的代码敲了一遍,但是收获很多。借此告诉大家,动手敲代码对理解程序帮助很大,结合理论看效果更佳。

你可能感兴趣的:(Android,studio)