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

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

实现一个 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>


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值