还是先上一个应用开发需求:
实现一个 Android 应用,界面如下,
要求:
(1) 该界面为应用启动后看到的第一个界面
(2) 输入学号和密码的控件要求用TextInputLayout 实现
(3) 点击图片,弹出对话框如下图:
点击“拍摄”选项,弹出 Toast 信息“您选择了[拍摄]”;
点击“从相册选择”选项,弹出 Toast 信息“您选择了[从相册选择];点击“取消”按钮,弹出 Toast 信息“您选择了[取消]”。
(4)切换RadioButton的选项,弹出 Snackbar 提示“您选择了 xx”;
例如从选项“学生”切换到选项“教职工”,则提示“您选择了教职工”;
点击 Snackbar上的“确定”按钮,则弹出 Toast 信息“Snackbar的确定按钮被点击了”
(5) 点击登录按钮
依次判断学号是否为空,密码是否为空,用户名和密码是否正确(正确的学号和密码分别为“123456”,“6666”);不正确则给出错误信息,如学号和密码都正确则提示“登陆成功”,如图:
(6)点击注册按钮
如果切换选项时,RadioButton 选中的是“学生”,那么弹出 Snackbar 信息“学生注册功能尚未启用”,如果选中的是“教职工”,那么弹出 Toast 信息“教职工注册功能尚未启用”。
相关知识:
1、在java文件中引用布局文件中的控件
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)就可以了
第一个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>