美文网首页
3.1 Android基于监听的事件处理

3.1 Android基于监听的事件处理

作者: pifoo | 来源:发表于2015-10-20 16:27 被阅读284次

    1. 理解

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

    2. 五种不同的使用形式

    2.1. 匿名内部类做监听器
    2.2. 内部类作事件监听器
    2.3. 外部类作监听器
    2.4. 直接使用Activity作为事件监听器
    2.5. 直接绑定到标签

    2.1 匿名内部类作为事件监听器

    平时最常用的一种:直接setXxxListener后,重写里面的方法即可; 通常是临时使用一次,复用性不高!

    实现代码:

    layout/activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:fitsSystemWindows="true"
        tools:context=".MainActivity">
    
        <Button
            android:id="@+id/btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAllCaps="false"
            android:textColor="@color/colorAccent"
            android:text="@string/btn" />
    </RelativeLayout>
    
    

    MainActivity.java

    package io.pifoo.event;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
        private Button btn;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            btn = (Button)findViewById(R.id.btn);
            //匿名内部类做监听器
            btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(getApplicationContext(),"点击了按钮",Toast.LENGTH_LONG).show();
                }
            });
        }
    }
    

    运行结果:

    Paste_Image.png{100x100}

    2.2 内部类作事件监听器

    和上面的匿名内部类不同哦!
    使用优点:可以在该类中进行复用,可直接访问外部类的所有界面组件!

    实现代码

    layout/activity_main.xml

    同2.1
    

    MainActivity.java

    package io.pifoo.event;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
        private Button btn;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            btn = (Button)findViewById(R.id.btn);
            //直接new一个内部类对象作为参数
            btn.setOnClickListener(new BtnClickListener());
        }
        //定义一个内部类,实现View.OnClickListener接口,并重写onClick()方法 
        class BtnClickListener implements View.OnClickListener{
            @Override
            public void onClick (View v){
                Toast.makeText(getApplicationContext(), "点击了按钮", Toast.LENGTH_LONG).show();
            }
        }
    
    }
    

    2.3 外部类作监听器

    就是另外创建一个处理事件的Java文件,这种形式用的比较少!
    因为外部类不能直接访问用户界面类中的组件,要通过构造方法将组件传入使用;这样导致的结果就是代码不够简洁!

    实现代码

    ps:
    为了演示传参,这里用TextView代替Toast提示!

    layout/activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:fitsSystemWindows="true"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
        <Button
            android:id="@+id/btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAllCaps="false"
            android:textColor="@color/colorAccent"
            android:text="@string/btn" />
        <TextView
            android:id="@+id/txt"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>
    
    

    外部类 MyClick.java

    package io.pifoo.event;
    
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.TextView;
    
    /**
     * Created by pifoo on 15/10/15.
     */
    //外部类实现OnClickListener接口,并重写onClick()方法
    public class MyClick implements OnClickListener {
        private TextView textshow;
        //把文本框作为参数传入(外部类不能直接访问用户界面类中的组件,要通过构造方法将组件传入使用)
        public MyClick(TextView txt) {
            textshow = txt;
        }
        @Override
        public void onClick (View v){
            //点击后设置文本框显示的文字
            textshow.setText("点击了按钮!");
        }
    }
    
    

    MainActivity.java

    package io.pifoo.event;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.widget.Button;
    import android.widget.TextView;
    
    public class MainActivity extends AppCompatActivity {
        private Button btn;
        private TextView txt;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            btn = (Button)findViewById(R.id.btn);
            txt = (TextView)findViewById(R.id.txt);
    
            //直接new一个外部类对象,传入组件
            btn.setOnClickListener(new MyClick(txt));
        }
    }
    

    运行结果

    Paste_Image.png

    2.4 4.直接使用Activity作为事件监听器: Activity实现对应接口,重写相关方法

    只需要让Activity类实现XxxListener事件监听接口,在Activity中定义重写对应的事件处理器方法 。

    eg: Actitity实现了OnClickListener接口,重写了onClick(view)方法在为某些组件添加该事件监听对象时,直接setXxx.Listener(this)即可

    实现代码

    layout/activity_main.xml

    同2.3
    

    MainActivity.java

    package io.pifoo.event;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.TextView;
    
    //让Activity类实现OnClickListener接口
    public class MainActivity extends Activity implements OnClickListener {
        private Button btn;
        private TextView txt;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            btn = (Button)findViewById(R.id.btn);
            txt = (TextView)findViewById(R.id.txt);
    
            //直接写个this
            btn.setOnClickListener(this);
        }
        //重写接口中的抽象方法
        @Override
        public void onClick(View v) {
            txt.setText("点击了按钮");
        }
    }
    

    2.5 直接绑定到标签

    就是直接在xml布局文件中对应得Activity中定义一个事件处理方法
    eg: public void myClick(View source) ,source对应事件源(组件) ,
    接着布局文件中对应要触发事件的组建,设置一个属性:onclick = “myclick”即可

    实现代码

    layout/activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:fitsSystemWindows="true"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
        <Button
            android:id="@+id/btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAllCaps="false"
            android:textColor="@color/colorAccent"
            android:onClick="myClick"
            android:text="@string/btn" />
        <TextView
            android:id="@+id/txt"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>
    

    MainActivity.java

    package io.pifoo.event;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.TextView;
    
    public class MainActivity extends Activity{
        private TextView txt;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            txt = (TextView)findViewById(R.id.txt);
        }
    
        //自定义一个方法,传入一个view组件作为参数
        public void myClick(View source) {
            txt.setText("点击了按钮");
        }
    
    }
    

    小结

    本节给大家介绍了Android中的事件处理机制,例子中的是onClickListener点击事件,当然除了这个以外还有其他的事件,比如onItemClickListener,凡是需要通过setXxxListener这些,基本上都是基于事件监听的!
    另外这五种方式用的比较多的是:1,2,3,5几种,看具体情况而定~

    相关文章

      网友评论

          本文标题:3.1 Android基于监听的事件处理

          本文链接:https://www.haomeiwen.com/subject/fzozcttx.html