安卓开发(3):事件处理

来源:互联网 发布:小狐仙软件 编辑:程序博客网 时间:2024/05/16 10:46

还是先上一个应用开发需求:

实现一个 Android 应用,界面如下,


要求:

(1)  该界面为应用启动后看到的第一个界面

(2)  输入学号和密码的控件要求用TextInputLayout实现

(3)  点击图片,弹出对话框如下图: 


点击“拍摄”选项,弹出 Toast 信息“您选择了[拍摄]”;

点击“从相册选择”选项,弹出 Toast 信息“您选择了[从相册选择];点击“取消”按钮,弹出 Toast 信息“您选择了[取消]”。

 

(4)切换RadioButton的选项,弹出 Snackbar 提示“您选择了 xx”;

例如从选项“学生”切换到选项“教职工”,则提示“您选择了教职工”; 



点击 Snackbar上的“确定”按钮,则弹出 Toast 信息“Snackbar的确定按钮被点击了”

 

(5) 点击登录按钮

依次判断学号是否为空,密码是否为空,用户名和密码是否正确(正确的学号和密码分别为“123456”,“6666”);不正确则给出错误信息,如学号和密码都正确则提示“登陆成功”,如图: 


(6)点击注册按钮

如果切换选项时,RadioButton 选中的是“学生”,那么弹出 Snackbar 信息“学生注册功能尚未启用”,如果选中的是“教职工”,那么弹出 Toast 信息“教职工注册功能尚未启用”。


相关知识:

1、在java文件中引用布局文件中的控件 

上一个实验我们把布局文件弄好后,是怎么展示的?其实是在MainActivity.java中实现展示的(并不是自动展示的):
然后怎么在java代码中绑定一个个部件呢?要是学过web的人就会很轻易的想到用id,给每个部件打上印记(在同一个布局中的部件id要唯一):
接着就可以在代码中这样引用你在本activity中加载的布局组件:

2、弹出 Toast信息

在需要弹出 Toast 信息的地方,写上: 

三个参数分别为context,text,duration。context 是一个上下文类型,写上使用这个方法的 java 类名加上.this 即可,text是 Toast 要显示的信息,duration 是 Toast 显示的时间长度,有 Toast.LENGTH_SHORT 和 Toast.LENGTH_LONG 可选,最后记得调用 show()方

法将 Toast 显示出来。 

3、事件处理

这里主要用到的事件处理方法一共三个,一个是 ImageView的点击事件,mImage.setOnClickListener(),一个是 Button的单击事件,mButton.setOnClickListener(),一个是 RadioGroup 的切换事件,mRadioGroup.setOnCheckedChangeListener(),它们的作用从命名上可以很容易看出来。

然后像这样添加参数:

把触发事件的逻辑写在onClick中就可以了。

4、简单对话框的使用

Android 中最基本的对话框是 AlertDialog,之所以说它最简单,是因为布局和使用的方法都很简单,布局是写好的,标题,通过 setTitle()方法设置,图标,通过 setIcon()方法设置,显示在中间的主要信息,通过setMessage()方法显示,等等。显示一个 AlertDialog 的基本步骤如下:

1、创建AlertDialog.Builder对象

2、调用上面的方法进行设置

3、 如果需要设置取消按钮,方法如下:


类似的确定按钮是setPositiveButton

4、 调用 AlertDialog.Builder的 create()方法创建 AlertDialog 对象,再调用 AlertDialog 对象的 show()方法将对话框显示出来。

   5、 要想增加像列表那样的一行行信息,可以用setItem()来弄。

5、Snackbar

Google在 2015年的 IO 大会上发布了较之前更为详细的 Material Design 规范和全新的Android DesignSupport Library,Snackbar 就是其中的一个控件,可以用来代替 Toast 信息,除了用户体验更好以外,功能也更强大。先来看一下语法: 


make 方法中的三个参数分别是根布局,要显示的消息和时长,这个方法是必须的,之后的方法都不是必须的。定义完之后调用 show()方法就可以显示 Snackbar 了。

setAction 方法使该 Snackbar右侧按钮可以被点击并处理一些事件,两个参数分别是按钮显示的文本以及处理点击事件的逻辑,形式与 Button 一样。

setActionTextColor()是设置右侧按钮文本的颜色,setDuration()方法可以定义 Snackbar 弹出时间长度,单位为 ms,当右侧按钮被点击之后,Snackbar 会立刻消失。

静态的 Snackbar 如下图:

  

6、TextInputLayout

TextInputLayout 也是 Android DesignSupport Library中的一个控件,用于接受用户输入,与 EditText 配合使用有更好的用户体验, TextInputLayout 集合了输入提示,报错等功能,并且自带动画效果。下面来看一下怎么实现:首先是 xml 布局: 输入TextInputLayout就会自动补全


一个 TextInputLayout 中只能包含一个 EditText,如果想要在预览中看到 TextInputLayout 布局的话,需要在修改对应的 build.gradle 文件中的配置: 




然后Sync Now

在代码中像普通部件那样引用TextInputLayout,然后从它引用包含的EditText:


还可以设置提示信息:


在需要关闭提示时用setErrorEnabled(false)就可以了


7、怎么设置不会默认选中页面中的第一个输入框呢

第一个TextInputLayout 是默认被选中的,但是要想设置所有的都不被选中,就要设置父组件可以被选中,就是在它的父组件中加属性:


代码:

MainActivity.java

package com.example.administrator.lab2;import android.content.DialogInterface;import android.content.Intent;import android.support.design.widget.Snackbar;import android.support.design.widget.TextInputLayout;import android.support.v7.app.AlertDialog;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.ImageView;import android.widget.RadioGroup;import android.widget.Toast;import static android.widget.RadioGroup.*;public class MainActivity extends AppCompatActivity {    private ImageView sysu;    private RadioGroup RBGroup;    private Button reg;    private Button log;    private TextInputLayout sid;    private TextInputLayout pas;    private void RadioClick(RadioGroup RBG) {        RBG.setOnCheckedChangeListener(new OnCheckedChangeListener() {            @Override            public void onCheckedChanged(RadioGroup group, final int checkedId) {                final String m;                if(checkedId==R.id.id1) {                    m="您选择了学生";                }else {                    m="您选择了教职工";                }                Snackbar.make(group,m,Snackbar.LENGTH_SHORT)                        .setAction("确定",new View.OnClickListener() {                            @Override                            public void onClick(View view) {                                Toast.makeText(MainActivity.this,"Snackbar的确定按钮被点击了",Toast.LENGTH_SHORT)                                        .show();                            }                        })                        .setActionTextColor(getResources().getColor(R.color.colorPrimary))                        .setDuration(5000)                        .show();            }        });    }    private void ImageClick(ImageView ima) {        final String[] items={"拍摄","从相册选择"};        final AlertDialog.Builder alertDialog=new AlertDialog.Builder(this);        alertDialog.setTitle("上传头像").setItems(items,new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialogInterface,int i) {                Toast.makeText(MainActivity.this,"您选择了["+items[i]+"]",Toast.LENGTH_SHORT).show();            }        }).setNegativeButton("取消",                new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialogInterface,int i) {                        Toast.makeText(MainActivity.this,"您选择了[取消]",Toast.LENGTH_SHORT).show();                    }                }).create();        ima.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                alertDialog.show();            }        });    }    private void init() {        sysu=(ImageView) findViewById(R.id.sysuimag);        ImageClick(sysu);        RBGroup=(RadioGroup) findViewById(R.id.id0);        RadioClick(RBGroup);        reg=(Button) findViewById(R.id.regist);        log=(Button) findViewById(R.id.signn);        sid=(TextInputLayout) findViewById(R.id.studid);        pas=(TextInputLayout)findViewById(R.id.pasword);        reg.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                final String m;                if(RBGroup.getCheckedRadioButtonId()==R.id.id1) {                    m="学生注册功能尚未启用";                } else {                    m="教职工注册功能尚未启用";                }                Snackbar.make(view,m,Snackbar.LENGTH_SHORT)                        .setAction("确定",new View.OnClickListener() {                            @Override                            public void onClick(View view) {                                Toast.makeText(MainActivity.this,"Snackbar的确定按钮被点击了",Toast.LENGTH_SHORT)                                        .show();                            }                        })                        .setActionTextColor(getResources().getColor(R.color.colorPrimary))                        .setDuration(5000)                        .show();                //Intent mIntent=new Intent(MainActivity.this,Activity2.class);                //startActivity(mIntent);            }        });        log.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                if(sid.getEditText().getText().toString().length()==0) {                    sid.setError("学号不能为空");                    pas.setErrorEnabled(false);                }else if(pas.getEditText().getText().toString().length()==0){                    pas.setError("密码不能为空");                    sid.setErrorEnabled(false);                } else {                    sid.setErrorEnabled(false);                    pas.setErrorEnabled(false);                    final String m;                    if(sid.getEditText().getText().toString().equals("123456")                            &&pas.getEditText().getText().toString().equals("6666")) {                        m="登陆成功";                    }else{                        m="学号或密码错误";                    }                    Snackbar.make(view,m,Snackbar.LENGTH_SHORT)                            .setAction("确定",new View.OnClickListener() {                                @Override                                public void onClick(View view) {                                    Toast.makeText(MainActivity.this,"Snackbar的确定按钮被点击了",Toast.LENGTH_SHORT)                                            .show();                                }                            })                            .setActionTextColor(getResources().getColor(R.color.colorPrimary))                            .setDuration(5000)                            .show();                }            }        });    }    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        init();    }}


activity_main.xml

<?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:focusable="true"    android:focusableInTouchMode="true"    tools:context="com.example.administrator.lab2.MainActivity">    <TextView        android:id="@+id/titl"        android:layout_height="wrap_content"        android:layout_width="wrap_content"        android:text="中山大学学生信息系统"        android:textSize="20sp"        android:textColor="@color/primary_black"        app:layout_constraintLeft_toLeftOf="parent"        app:layout_constraintRight_toRightOf="parent"        app:layout_constraintTop_toTopOf="parent"        android:layout_marginTop="20dp"/>    <ImageView        android:id="@+id/sysuimag"        android:layout_width="120dp"        android:layout_height="120dp"        android:src="@mipmap/sysu"        app:layout_constraintLeft_toLeftOf="parent"        app:layout_constraintRight_toRightOf="parent"        app:layout_constraintTop_toBottomOf="@+id/titl"        android:layout_marginTop="20dp"        />    <android.support.design.widget.TextInputLayout        android:id="@+id/studid"        android:layout_width="330dp"        android:layout_height="wrap_content"        app:layout_constraintTop_toBottomOf="@+id/sysuimag"        app:layout_constraintRight_toRightOf="parent"        app:layout_constraintLeft_toLeftOf="parent"        android:layout_marginTop="20dp"        >        <EditText            android:id="@+id/studid1"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:inputType="number"            android:hint="请输入学号"            android:textColor="@color/primary_black"            android:textSize="18sp"            />    </android.support.design.widget.TextInputLayout>    <android.support.design.widget.TextInputLayout        android:id="@+id/pasword"        android:layout_width="330dp"        android:layout_height="wrap_content"        app:layout_constraintTop_toBottomOf="@+id/studid"        app:layout_constraintRight_toRightOf="parent"        app:layout_constraintLeft_toLeftOf="parent"        android:layout_marginTop="20dp"        >        <EditText            android:id="@+id/pasword1"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:inputType="textPassword"            android:hint="请输入密码"            android:textColor="@color/primary_black"            android:textSize="18sp" />    </android.support.design.widget.TextInputLayout>    <RadioGroup        android:id="@+id/id0"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:orientation="horizontal"        app:layout_constraintLeft_toLeftOf="parent"        app:layout_constraintRight_toRightOf="parent"        app:layout_constraintTop_toBottomOf="@+id/pasword"        android:layout_marginTop="20dp"        >        <RadioButton            android:id="@+id/id1"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:checked="true"            android:text="学生"            android:textSize="18sp" />        <RadioButton            android:id="@+id/id2"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:textSize="18sp"            app:layout_constraintLeft_toRightOf="@id/id1"            android:layout_marginLeft="10dp"            android:text="教职工"/>    </RadioGroup>    <RadioGroup        android:id="@+id/buttonG"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:orientation="horizontal"        app:layout_constraintLeft_toLeftOf="parent"        app:layout_constraintRight_toRightOf="parent"        app:layout_constraintTop_toBottomOf="@+id/id0"        android:layout_marginTop="20dp"        >        <Button            android:id="@+id/signn"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:textSize="18sp"            android:background="@drawable/buttonbg"            android:textColor="@color/primary_white"            android:text="登陆"/>        <Button            android:id="@+id/regist"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:textSize="18sp"            app:layout_constraintLeft_toRightOf="@id/signn"            android:layout_marginLeft="10dp"            android:background="@drawable/buttonbg"            android:textColor="@color/primary_white"            android:text="注册"/>    </RadioGroup></android.support.constraint.ConstraintLayout>


原创粉丝点击