zoukankan      html  css  js  c++  java
  • Android开发2:事件处理及实现简单的对话框(Toast,AlertDialog,Snackbar,TextInputLayout的使用)

    前言

      啦啦啦~又要和大家一起学习Android开发啦,博主心里好激动哒~

      在上篇博文中,我们通过线性布局和基础组件的使用,完成了一个简单的学生课外体育积分电子认证系统的界面,本篇博文,将和大家一起熟悉Button、RadioButton、EditText等基本控件,探讨能够处理这些控件的基本事件,学会弹出基本的对话框,能够定制对话框中的内容,能对确定和取消按钮的事件做处理。

     

    基础知识

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

      在上一次实验中,在onCreateView(Bundle savedInstanceState) 方法中调用 setContentView()方法将布局加载进来。如果需要用到布局中的某些控件的话,首先需要给控件一个 id:

      

      定义 id 的语法和引用资源类似,@+id/id 名称,在同一个布局文件中不允许有重复的 id, 即使是不同控件也不行,但是不同的布局文件中可以使用同一个 id之后在 java 文件中将布局加载之后,也就是 setContentView()之后,使用 findViewById() 方法可以获得该控件:

      

       findViewById()方法带一个参数,就是刚刚定义的那个 id,参数形式为 R.id.XXX,其中 XXX 就是刚刚定义的那个 id,由于 findViewById()方法返回的是一个 View 类型,所以需要 强制类型转换为 Button 类型。

       获得这个 Button 之后,就可以对这个 Button 进行后续的操作了。 

     

    2、弹出 Toast 信息

    Toast在APP开发中会经常用到,自己在开发测试中也会用到,测试在还会Logcat窗口显示。 


    Toast的主要方法: 
    cancel 方法:关闭Toast视图 
    getDuration 方法:获取持续时间 
    getGravity 方法:获取Toast视图的位置 
    makeText 方法:生成标准Toast 
    setView 方法:设置显示的View物件 
    getView 方法:获取View对象 
    setGravity 方法:设置显示位置 
    getXOffset 方法:获取水平方向偏移量 
    getYOffset 方法:获取垂直方向偏移量 
    setDuration 方法:设置持续时间 
    setText 方法:设置显示的文本內容 
    show 方法:显示提示

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

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

    主要包含3种形式的Toast: 
    1、标准形式 
    2、设置位置形式 
    3、带图片的Toast

    函数代码如下:

    MainActivity .java

    import java.io.InputStream;
    import android.os.Bundle;
    import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.view.Gravity;
    import android.view.Menu;
    import android.view.View;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.Toast;
    
    @SuppressLint("ShowToast")
    public class MainActivity extends Activity {
        Toast   toast;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            //初始化Toast的主要作用是,在点击按钮是可以先立刻消除上一个toast
            toast=Toast.makeText(getApplicationContext(), "", 0);;
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
    
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    
        public void Button1(View v){
            toast.cancel(); 
            toast=Toast.makeText(getApplicationContext(), "系统默认的样式", 1);
    
            toast.show();
        }  
    
        public void Button2(View v){
            //清除上一个toast,不会有显示延迟,更加美观。不知道这种方法是否好,如果好请留言,学习学习。
            toast.cancel(); 
            toast=Toast.makeText(getApplicationContext(), "设置Toast显示的位置", 1);
            toast.setGravity(Gravity.CENTER, 0, 0);
    
            toast.show();
            }
        public void Button3(View v){
            toast.cancel(); 
            toast=Toast.makeText(getApplicationContext(), "设置Toast显示图片和位置", 1);
            toast.setGravity(Gravity.CENTER, 0, 0);
            LinearLayout LinearToast = (LinearLayout) toast.getView();
            LinearToast.setOrientation(LinearLayout.HORIZONTAL);
            ImageView image = new ImageView(getApplicationContext());
            //为了美观,将图片缩小为原来的一半
            InputStream is =this.getResources().openRawResource(R.drawable.ic_launcher); 
            BitmapFactory.Options options=new BitmapFactory.Options(); 
            options.inJustDecodeBounds = false; 
            options.inSampleSize = 2;   //width,hight设为原来的二分一 
            Bitmap btp =BitmapFactory.decodeStream(is,null,options);
            image.setImageBitmap(btp);
            LinearToast.addView(image,0);
            toast.show();
        }
    
    }

    3、事件处理

    下面以 Button 为例简单介绍一下事件处 理。

      要处理事件,首先要将与该事件有关的控件引入进来,比如要判断用户名是否为空,那么 除了 Button 需要引入外(因为 Button 是触发事件的主体),还需要引入用户名的输入框。 引入之后,button.setOnClickListener()中做处理,这里的 button 是一个变量名,记得 换成自己定义的变量名。

      

     

    onClick 方法带的 view 参数是触发这个单击事件的控件的引用,在这个例子中,view 就是 触发事件的 Button,在 onClick()方法中做事件的处理,例如判断用户名是否为空:

    关于EditText,Button,RadioGroup各自有的一些方法建议查看API 文档,不在这里一一说明了。

    4、简单对话框的使用

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

    AlertDialog.Builder创建对话框的几个常用方法:

    setTitle() :设置标题
    setIcon() :设置图标
    setMessage():设置提示内容
    setView() : 设置自定义视图
    setItems() :设置对话框要显示的一个list
    setMultiChoiceItems() :设置对话框显示的复选框
    setNeutralButton() :普通按钮

    setPositiveButton() :添加"Yes"按钮
    setNegativeButton() :添加"No"按钮
    create() : 创建对话框

    show() :显示对话框

        显示 一 个 AlertDialog 的基本步骤如下:

      (1)创建 AlertDialog.Builder 对象

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

      (3)如果需要设置取消按钮,方法原型如下:

      

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

      如果不是很明白可以参考下方的实验代码加以理解啦~

     

    拓展知识

    1、Snackbar

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

      

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

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

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

    放一下静态的 Snackbar,实验材料中的 apk 安装启动后,点击拓展启动 的界面用的都是 Snackbar,可以看一下动态效果。

    在 api 为 19 的模拟器下,按钮显示不出来,可能是不支持,换了api 22 的模拟器就好了。

     

    2、TextInputLayout

    TextInputLayout 也是 Android Design Support Library 中的一个控件,用于接受用户输 入,与 EditText 配合使用有更好的用户体验,先放几张图:

      一般登录注册界面都需要EditText这个控件来让用户输入信息,同时我们一般会设置一个标签(使用TextView)和EditText的hint属性来提示用户输入的内容,而设计库中高级组件TextInputLayout则专门为EditText设计的,即通过使用TextInputLayout包裹EditText实现当用户开始输入时hint属性值将显示在EditText上面作为一个提示标签,这个过程还带有动画效果,这样就避免了用户输入时输入提示消失的情况,同时,还可以更好地向用户提示错误输入信息。

    TextInputLayout的两个功能:

    给EditText添加一个带有动画效果的提示标签(利用EditText的hint属性的值作为提示标签内容);

    处理错误输入,将错误输入提示信息显示在EditText附近,便于提示用户更好地完成输入。

    即:

    (1) 实现浮动标签提示效果

      TextInputLayout和FrameLayout一样都是一个ViewGroup,而TextInputLayout包裹的是EditText,并且会将EditText的Android:hint属性值作为提示标签,所以,使用非常简单,可以看到,TextInputLayout 集合了输入提示,报错等功能,并且自带动画效果。

    (2) 显示错误输入信息

      TextInputLayout使得我们在验证输入数据是可以更加方便地显示错误输入提示,这样可以使得输入更加友好。

    对于处理错误信息,TextInputLayout提供了两个方法:

    setError(String message):设置错误提示信息,这个信息将会显示在EditText附近。

    setErrorEnabled(boolean enabled):设置错误信息不可以用,也就是移除setError(String message)添加的错误提示信息。

    当我们开始在EditText中输入信息的时候,EditText的hint属性值将会显示在EditText上面,并且带有一个动画效果,显示为一个浮动标签。而且,当输入的数据格式不对时,还会显示错误提示在EditText下面。

     

    下面来看一下怎么实现:

    首先是 xml 布局:

     

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

     

     

    在 dependencies 中加上 compile 'com.android.support:design:24.0.0',然后再同步项 目,就可以显示了:

     

    在修改了 build.gradle 文件之后,也可以点击 Sync Now同步项目。

    然后在 java 文件中引入 TextInputLayout,通过 TextInputLayout 获取 EditText 中的内 容:

     

     

    TextInputLayout 有特色的一点是可以显示提示信息:

    首先允许使用提示信息 ,然后显示提示信息,如果想使提示信息消失,设置setErrorEnabled(false)即可。

    其它方法的话自行查阅 API 文档。

    如果不是很明白可以参考下方的实验代码加以理解啦~

     

    实验内容

    实现一个 Android 应用,界面呈现如下效果(界面设计上的要求与实验一相同): 要求:

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

    (2)点击登录按钮:

    如果用户名为空,弹出 Toast 信息“用户名不能为空”; 如果密码为空,弹出 Toast 信息“密码不能为空”; 如果用户名输入为“Android”,密码为“123456”,弹出如下对话框:

    点击“确定”,弹出 Toast 信息——对话框“确定”按钮被点击。,点击“取消”,弹出 Toast 信息——对话框“取消”按钮被点击。

    否则,弹出如下对话框:

    确定和取消按钮点击后效果参见上一个对话框 点击注册按钮:

    如果 RadioButton 选中的是“学生”,那么弹出 Toast 信息“学生身份注册功能尚未开 启”,如果选中的是“教师”,那么弹出 Toast 信息“教师身份注册功能尚未开启”,以 此类推。

    RadioButton 选择项切换:选择项切换之后,弹出 Toast 信息“XX 身份被选中”,例如从 学生切换到教师,弹出 Toast 信息“教师身份被选中”。

    实验步骤

    1、基础内容的实现

    在 java 文 件 中 将 布 局 加 载 之 后 , 在 setContentView() 之 后 , 使 用 findViewById()方法可以获得该控件,并声明设置其他类型的元素和类型:

      此次实验用到的事件处理方法一共两个,一个是 Button 的 单 击 事 件 button.setOnClickListener() , 一 个 是 RadioGroup 的 切 换 事 件 radioGroup.setOnCheckedChangeListener()。我们设置 Button 的 单 击 事 件, button.setOnClickListener() 和 RadioGroup 的 切 换 事 件 , radioGroup.setOnCheckedChangeListener()。 处理事件时将与该事件有关的控件引入进来,比如要判断用户名是否为空,那么 除了 Button 需要引入外(因为 Button 是触发事件的主体),还需要引入用户名 的输入框。 引入之后在 SetOnClickListener()中做处理。

      在需要弹出 Toast 信息的地方,写上 Toast 的相关代码。这个方法带三个 参数 context,text,duration。context 是一个上下文类型,写上使用 这个 方法的 java 类名加上.this 即可,text 是 Toast 要显示的信息,duration 是 Toast 显示的时间长度,有 Toast.LENGTH_SHORT 和 Toast.LENGTH_LONG 可 选,最后调用 show() 方法将 Toast 显示出来。

     

      Android 中最基本的对话框是 AlertDialog,它的布局和使用的方法都很简 单,布局是写好的,标题通过 setTitle()方法设置,图标通过 setIcon()方法 设置,显示在中间的主要信息通过 setMessage()方法显示。


      创建 AlertDialog.Builder 对象调用上面的方法进行设置调用 AlertDialog.Builder的create() 方法创建 AlertDialog 对象 , 再调用 AlertDialog 对象的 show()方法将对话框显示出来:

     

    2、拓展内容的实现:

      在基础实验上的结构和初始声明的基础上,在听取大神们的完成经验后,先完成 TextInputLayout 部分的内容。首先,按照要求,在 xml 布局文件中对 EditText 部 分 进 行 修 改 , 使 用 TextInputLayout 。 TextInputLayout 和 FrameLayout 一样都是一个 ViewGroup,而 TextInputLayout 包裹的是 EditText, 并且会将 EditText 的 Android:hint 属性值作为提示标签用 TextInputLayout 包裹 EditText 并给 EditText 设置了 hint 属性后,这个 EditText 就带有了浮动 提示标签的效果:

    然后在修改对应的 build.gradle 文件中的配置。


      在 java 文件中引入 TextInputLayout,通过 TextInputLayout 获取 EditText 中的内容。在这之前需要对我们需要的两个元素进行声明:

      


      然后获取 EditText 中的内容:


      在登录按钮的监听事件中按照要求实现所需功能:

      

      此外需要注意的是:TextInputLayout 使得我们在验证输入数据是可以更加 方便地显示错误输入提示,这样可以使得输入更加友好。

      对于处理错误信息,TextInputLayout 提供了两个方法: setError(String message):设置错误提示信息,这个信息将会显示在EditText 附近。

      setErrorEnabled(boolean enabled):设置错误信息不可以用,也就是移除 setError(String message)添加的错误提示信息。

      显示提示信息 , 符合要求需使提示信息消失,可以在相应位置设置 setErrorEnabled(false)。

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


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

      

      完成实验~

     

    实验完整代码

      如下(两个部分的XML布局代码相同,都和上次实验的布局代码相同):

    (1)基础部分

    content_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorWhite"
        android:orientation="vertical">
    
        <TextView
            android:id="@+id/SYSUTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="20dp"
            android:text="@string/sysu"
            android:textSize="20sp"
            android:textStyle="bold" />
    
        <ImageView
            android:id="@+id/sysuImage"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:layout_gravity="center"
            android:layout_marginBottom="20dp"
            android:layout_marginTop="20dp"
            android:contentDescription="@string/app_name"
            android:src="@mipmap/sysu" />
    
    
        <android.support.design.widget.TextInputLayout
            android:id="@+id/more_username"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp">
    
            <EditText
                android:id="@+id/editTextUsername"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center_horizontal"
                android:hint="@string/username2"
                android:inputType="textPersonName" />
    
        </android.support.design.widget.TextInputLayout>
    
    
        <android.support.design.widget.TextInputLayout
            android:id="@+id/more_password"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp">
    
            <EditText
                android:id="@+id/editTextPassword"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center_horizontal"
                android:hint="@string/password2"
                android:inputType="textPassword" />
    
        </android.support.design.widget.TextInputLayout>
    
    
        <RadioGroup
            android:id="@+id/radio"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="10dp"
            android:orientation="horizontal">
    
            <RadioButton
                android:id="@+id/radioStu"
                style="@style/radioButtonStyle"
                android:checked="true"
                android:text="@string/student" />
    
            <RadioButton
                android:id="@+id/radioTeacher"
                style="@style/radioButtonStyle"
                android:text="@string/teacher" />
    
            <RadioButton
                android:id="@+id/radioCorporation"
                style="@style/radioButtonStyle"
                android:text="@string/corporation" />
    
            <RadioButton
                android:id="@+id/radioManager"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/manager"
                android:textSize="@dimen/etWordSp" />
    
        </RadioGroup>
    
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="20dp"
            android:orientation="horizontal">
    
            <Button
                android:id="@+id/login"
                style="@style/Button"
                android:layout_marginRight="5dp"
                android:text="@string/signIn" />
    
            <Button
                android:id="@+id/register"
                style="@style/Button"
                android:text="@string/register" />
    
        </LinearLayout>
    
    </LinearLayout>

    MainActivity.java

    package com.example.yanglh6.myapplication1;
    
    import android.content.DialogInterface;
    import android.os.Bundle;
    import android.support.v7.app.AlertDialog;
    import android.support.v7.app.AppCompatActivity;
    import android.text.TextUtils;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.RadioButton;
    import android.widget.RadioGroup;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
        private RadioGroup radio = null;
        private RadioButton radioStu = null;
        private RadioButton radioTeacher = null;
        private RadioButton radioCorporation = null;
        private RadioButton radioManager = null;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.content_main);
            Button buttonLogin = (Button) findViewById(R.id.login);
            Button buttonRegister = (Button) findViewById(R.id.register);
            final EditText editTextUsername = (EditText) findViewById(R.id.editTextUsername);
            final EditText editTextPassword = (EditText) findViewById(R.id.editTextPassword);
            radio = (RadioGroup) findViewById(R.id.radio);
            radioStu = (RadioButton) findViewById(R.id.radioStu);
            radioTeacher = (RadioButton) findViewById(R.id.radioTeacher);
            radioCorporation = (RadioButton) findViewById(R.id.radioCorporation);
            radioManager = (RadioButton) findViewById(R.id.radioManager);
    
            buttonLogin.setOnClickListener(new Button.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (TextUtils.isEmpty(editTextUsername.getText().toString())) {
                        Toast.makeText(MainActivity.this, "用户名不能为空", Toast.LENGTH_SHORT).show();
                    } else if (TextUtils.isEmpty(editTextPassword.getText().toString())) {
                        Toast.makeText(MainActivity.this, "密码不能为空", Toast.LENGTH_SHORT).show();
                    } else if (editTextUsername.getText().toString().equals("Android") && editTextPassword.getText().toString().equals("123456")) {
                        new AlertDialog.Builder(MainActivity.this)
                                .setTitle("提示")
                                .setMessage("登录成功")
                                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialogInterface, int i) {
                                        Toast.makeText(MainActivity.this, "对话框"确定"按钮被点击", 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()
                                .show();
    
                    } else {
                        new AlertDialog.Builder(MainActivity.this)
                                .setTitle("提示")
                                .setMessage("登录失败")
                                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialogInterface, int i) {
                                        Toast.makeText(MainActivity.this, "对话框"确定"按钮被点击", 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()
                                .show();
                    }
                }
    
            });
    
            radio.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(RadioGroup group, int checkedId) {
                    if (checkedId == radioStu.getId()) {
                        Toast.makeText(MainActivity.this, "学生身份被选中", Toast.LENGTH_SHORT).show();
                    }
                    if (checkedId == radioTeacher.getId()) {
                        Toast.makeText(MainActivity.this, "教师身份被选中", Toast.LENGTH_SHORT).show();
                    }
                    if (checkedId == radioCorporation.getId()) {
                        Toast.makeText(MainActivity.this, "社团身份被选中", Toast.LENGTH_SHORT).show();
                    }
                    if (checkedId == radioManager.getId()) {
                        Toast.makeText(MainActivity.this, "管理者身份被选中", Toast.LENGTH_SHORT).show();
                    }
                }
            });
    
            buttonRegister.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    RadioGroup radioGroup = (RadioGroup) findViewById(R.id.radio);
                    int checkedId = radioGroup.getCheckedRadioButtonId();
                    if (checkedId == R.id.radioStu) {
                        Toast.makeText(MainActivity.this, "学生身份注册功能尚未开启", Toast.LENGTH_SHORT).show();
                    } else if (checkedId == radioTeacher.getId()) {
                        Toast.makeText(MainActivity.this, "教师身份注册功能尚未开启", Toast.LENGTH_SHORT).show();
                    } else if (checkedId == radioTeacher.getId()) {
                        Toast.makeText(MainActivity.this, "社团身份注册功能尚未开启", Toast.LENGTH_SHORT).show();
                    } else if (checkedId == radioCorporation.getId()) {
                        Toast.makeText(MainActivity.this, "管理者身份注册功能尚未开启", Toast.LENGTH_SHORT).show();
                    }
                }
            });
    
        }
    }

    (2)拓展部分

    MainActivity.java

    package com.example.yanglh6.myapplication1;
    
    import android.os.Bundle;
    import android.support.design.widget.Snackbar;
    import android.support.design.widget.TextInputLayout;
    import android.support.v7.app.AppCompatActivity;
    import android.text.TextUtils;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.RadioButton;
    import android.widget.RadioGroup;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
        private RadioGroup radio = null;
        private RadioButton radioStu = null;
        private RadioButton radioTeacher = null;
        private RadioButton radioCorporation = null;
        private RadioButton radioManager = null;
        private TextInputLayout usernameText;
        private TextInputLayout passwordText;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.content_main);
    
            usernameText = (TextInputLayout) findViewById(R.id.more_username);
            passwordText = (TextInputLayout) findViewById(R.id.more_password);
            Button buttonLogin = (Button) findViewById(R.id.login);
            final Button buttonRegister = (Button) findViewById(R.id.register);
            final EditText editTextUsername = (EditText) findViewById(R.id.editTextUsername);
            final EditText editTextPassword = (EditText) findViewById(R.id.editTextPassword);
            radio = (RadioGroup) findViewById(R.id.radio);
            radioStu = (RadioButton) findViewById(R.id.radioStu);
            radioTeacher = (RadioButton) findViewById(R.id.radioTeacher);
            radioCorporation = (RadioButton) findViewById(R.id.radioCorporation);
            radioManager = (RadioButton) findViewById(R.id.radioManager);
    
            buttonLogin.setOnClickListener(new Button.OnClickListener() {
                @Override
                public void onClick(View view) {
                    String usernameEdit = usernameText.getEditText().getText().toString().trim();
                    String passwordEdit = passwordText.getEditText().getText().toString().trim();
                    if (TextUtils.isEmpty(editTextUsername.getText().toString())) {
                        usernameText.setErrorEnabled(true);
                        usernameText.setError("用户名不能为空");
                        return;
                    } else {
                        usernameText.setErrorEnabled(false);
                    }
                    if (TextUtils.isEmpty(editTextPassword.getText().toString())) {
                        passwordText.setErrorEnabled(true);
                        passwordText.setError("密码不能为空");
                        return;
                    } else {
                        passwordText.setErrorEnabled(false);
                    }
                    if (editTextUsername.getText().toString().equals("Android") && editTextPassword.getText().toString().equals("123456")) {
                        Snackbar.make(getWindow().getDecorView(), "登录成功", Snackbar.LENGTH_SHORT)
                                .setAction("按钮", new View.OnClickListener() {
                                    @Override
                                    public void onClick(View v) {
                                        Toast.makeText(MainActivity.this, "Snackbar的按钮被点击了", Toast.LENGTH_SHORT).show();
                                    }
                                })
                                .show();
                    } else {
                        Snackbar.make(getWindow().getDecorView(), "登录失败", Snackbar.LENGTH_SHORT)
                                .setAction("按钮", new View.OnClickListener() {
                                    @Override
                                    public void onClick(View v) {
                                        Toast.makeText(MainActivity.this, "Snackbar的按钮被点击了", Toast.LENGTH_SHORT).show();
                                    }
                                })
                                .show();
    
                    }
                }
            });
    
            radio.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(RadioGroup group, int checkedId) {
                    if (checkedId == radioStu.getId()) {
                        Snackbar.make(getWindow().getDecorView(), "学生身份被选中", Snackbar.LENGTH_SHORT)
                                .setAction("按钮", new View.OnClickListener() {
                                    @Override
                                    public void onClick(View v) {
                                        Toast.makeText(MainActivity.this, "Snackbar的按钮被点击了", Toast.LENGTH_SHORT).show();
                                    }
                                })
                                .setDuration(5000)
                                .show();
                    }
                    if (checkedId == radioTeacher.getId()) {
                        Snackbar.make(getWindow().getDecorView(), "教师身份被选中", Snackbar.LENGTH_SHORT)
                                .setAction("按钮", new View.OnClickListener() {
                                    @Override
                                    public void onClick(View v) {
                                        Toast.makeText(MainActivity.this, "Snackbar的按钮被点击了", Toast.LENGTH_SHORT).show();
                                    }
                                })
                                .setDuration(5000)
                                .show();
                    }
                    if (checkedId == radioCorporation.getId()) {
                        Snackbar.make(getWindow().getDecorView(), "社团身份被选中", Snackbar.LENGTH_SHORT)
                                .setAction("按钮", new View.OnClickListener() {
                                    @Override
                                    public void onClick(View v) {
                                        Toast.makeText(MainActivity.this, "Snackbar的按钮被点击了", Toast.LENGTH_SHORT).show();
                                    }
                                })
                                .setDuration(5000)
                                .show();
                    }
                    if (checkedId == radioManager.getId()) {
                        Snackbar.make(getWindow().getDecorView(), "管理者身份被选中", Snackbar.LENGTH_SHORT)
                                .setAction("按钮", new View.OnClickListener() {
                                    @Override
                                    public void onClick(View v) {
                                        Toast.makeText(MainActivity.this, "Snackbar的按钮被点击了", Toast.LENGTH_SHORT).show();
                                    }
                                })
                                .setDuration(5000)
                                .show();
                    }
                }
            });
    
            buttonRegister.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    RadioGroup radioGroup = (RadioGroup) findViewById(R.id.radio);
                    int checkedId = radioGroup.getCheckedRadioButtonId();
                    if (checkedId == R.id.radioStu) {
                        Snackbar.make(getWindow().getDecorView(), "学生身份注册功能尚未开启", Snackbar.LENGTH_SHORT)
                                .setAction("按钮", new View.OnClickListener() {
                                    @Override
                                    public void onClick(View v) {
                                        Toast.makeText(MainActivity.this, "Snackbar的按钮被点击了", Toast.LENGTH_SHORT).show();
                                    }
                                })
                                .setDuration(5000)
                                .show();
                    } else if (checkedId == radioTeacher.getId()) {
                        Snackbar.make(getWindow().getDecorView(), "教师身份注册功能尚未开启", Snackbar.LENGTH_SHORT)
                                .setAction("按钮", new View.OnClickListener() {
                                    @Override
                                    public void onClick(View v) {
                                        Toast.makeText(MainActivity.this, "Snackbar的按钮被点击了", Toast.LENGTH_SHORT).show();
                                    }
                                })
                                .setDuration(5000)
                                .show();
                    } else if (checkedId == radioCorporation.getId()) {
                        Snackbar.make(getWindow().getDecorView(), "社团身份注册功能尚未开启", Snackbar.LENGTH_SHORT)
                                .setAction("按钮", new View.OnClickListener() {
                                    @Override
                                    public void onClick(View v) {
                                        Toast.makeText(MainActivity.this, "Snackbar的按钮被点击了", Toast.LENGTH_SHORT).show();
                                    }
                                })
                                .setDuration(5000)
                                .show();
                    } else if (checkedId == radioManager.getId()) {
                        Snackbar.make(getWindow().getDecorView(), "管理者身份注册功能尚未开启", Snackbar.LENGTH_SHORT)
                                .setAction("按钮", new View.OnClickListener() {
                                    @Override
                                    public void onClick(View v) {
                                        Toast.makeText(MainActivity.this, "Snackbar的按钮被点击了", Toast.LENGTH_SHORT).show();
                                    }
                                })
                                .setDuration(5000)
                                .show();
                    }
                }
            });
        }
    }

    对话框总结

      1、Toast:在需要弹出 Toast 信息的地方,写上 Toast 的相关代码。这个 方法带三个参数 context,text,duration。context 是一个上下文类型,写上 使用 这个方法的 java 类名加上.this 即可,text 是 Toast 要显示的信息, duration 是 Toast 显 示 的 时 间 长 度 , 有 Toast.LENGTH_SHORT 和 Toast.LENGTH_LONG 可选,最后调用 show() 方法将 Toast 显示出来。

      2、AlertDialog 的构造方法全部是 Protected 的,所以不能直接通过 new 一个 AlertDialog 来创建出一个 AlertDialog。

    要创建一个 AlertDialog,就要用到 AlertDialog.Builder 中的 create()方法。

    使用 AlertDialog.Builder 创建对话框需要了解以下几个方法:

    setTitle:为对话框设置标题

    setIcon:为对话框设置图标

    setMessage:为对话框设置内容

    setView: 给对话框设置自定义样式

    setItems:设置对话框要显示的一个 list,一般用于显示几个命令时

    setMultiChoiceItems :用来设置对话框显示一系列的复选框

    setNeutralButton:普通按钮

    setPositiveButton:给对话框添加"Yes"按钮

    setNegativeButton:对话框添加"No"按钮

    create:创建对话框

    show:显示对话框

      3、Snackbar 是 Android design support library 中的另一个组件。使 用 Snackbar,可以在屏幕底部快速的显示一条消息,大体与 Toast 相同,但多了几分灵活性:

    一小段时间之后、或者用户与屏幕触发交互,Snackbar 会自动消失; 可以包含一个可选的操作;

    把 Snackbar 划出屏幕,可以弃用;

    作为一条上下文敏感的消息,也是 UI 的一部分,并在屏幕内所有元素的上 层显示,而不是像 Toast 消息一样位于屏幕中央;

    一个时刻只能有唯一一个 Snackbar 显示。 make()方法的第一个参数是一个 view,snackbar 会找到一个父 view,以

    寄存所赋的 snackbar 值。Snackbar 会沿着 view 的树状路径,找到第一个合适 的布局或窗口视图,作为父 view。

    持续时间属性与 Toast 的相同,可选 LENG_SHORT 或者 LENGTH_LONG。

    设 置 Action 行 为 事 件 , 使 用 的 方 法 是 public Snackbar setAction (CharSequence text, View.OnClickListener listener); Action 的字体颜色 默认使用系统主题中的如<item name="colorAccent">#ff0000</item>

    可以通过代码去改变 Action 的字体颜色:Snackbar setActionTextColor (int color)。

      4、TextInputLayout

      一般登录注册界面都需要 EditText 这个控件来让用户输入信息,同时我们 一般会设置一个标签(使用 TextView)和 EditText 的 hint 属性来提示用户输 入的内容,而设计库中高级组件 TextInputLayout 则专门为 EditText 设计的, 即通过使用 TextInputLayout 包裹 EditText 实现当用户开始输入时 hint 属性值 将显示在 EditText 上面作为一个提示标签,这个过程还带有动画效果,这样就 避免了用户输入时输入提示消失的情况,同时,还可以更好地向用户提示错误输 入信息。TextInputLayout 的两个功能:

        给 EditText 添加一个带有动画效果的提示标签(利用 EditText 的 hint 属 性的值作为提示标签内容);

        处理错误输入,将错误输入提示信息显示在 EditText 附近,便于提示用户 更好地完成输入。

    源码下载

    源码下载点击这里~

    1、本实验实验环境:

    操作系统 Windows 10 

    实验软件 Android Studio 2.2.1

    虚拟设备:Nexus_5X

    API:23

    2、贴代码的时候由于插入代码框的大小问题,代码格式不太严整,望见谅~

  • 相关阅读:
    ajax专题
    luogu P1346 电车 最短路
    luogu P1462 通往奥格瑞玛的道路 最短路
    luogu P1328 生活大爆炸版石头剪刀布
    luogu P1315 联合权值 枚举
    luogu P1156 垃圾陷阱 背包问题
    luogu P1217 回文质数 枚举
    luogu P3650 滑雪课程设计 枚举
    luogu1209 修理牛棚 贪心
    luogu P1223 排队接水 贪心
  • 原文地址:https://www.cnblogs.com/yanglh6-jyx/p/Android_Activity_Toast_AlertDialog_Snackbar_TextInputLayout.html
Copyright © 2011-2022 走看看