Android:创建常见对话框以及使用对话框实现登陆

1、  首先说一下“提示”——Toast

所谓的“提示”就是一种简易的消息提示框,不能被用户单击,根据代码中时间参数的设置,自动消失。

 

Toast的创建

方法一:makeText (Context context, int resId, int duration) 

方法二:makeText(Context context, CharSequence text, int duration)


参数:

第一个参数context表示:toast显示在哪个上下文,通常是当前Activity。

第三个参数duration表示:toast显示的时间。Toast默认有LENGTH_SHORT和LENGTH_LONG两常量,分别表示短时间显示和长时间显示。也可以自己设定时间,注意它的时间单位是:毫秒

对于第二个参数可以是字符串也可以是从资源文件string.xml 里面取得的提示信息 。

 

				// 创建toast对象,并显示.第二个参数是字符串
				Toast.makeText(MainActivity.this, "这是提示信息", Toast.LENGTH_LONG).show();
				//第二个参数是从资源文件string.xml 里面取提示信息 
				Toast.makeText(MainActivity.this,getString(R.string.hello) , Toast.LENGTH_SHORT).show();

2、创建对话框(dialog)

对于对话框的创建以及一些常用的格式,大家可以参考以下的链接

http://www.cnblogs.com/salam/archive/2010/11/15/1877512.html。这篇博客写的很好,对对话框的总结很面。

 

下面我在做一个延伸。问题是:弹出一个对话框,对话框有用户名和密码两个文本框,填入正确的用户名和密码然后点击确定进入另一个页面,错误的话提示错误。

 

下面就针对上面提出的问题开始解决之旅

 

上面的问题大部分是出现在系统登录时,那么就要求界面尽量的简洁。我要实现的界面如下所示

 

 

其实实现这个很简单,先说一下界面吧。这里需要两个Activity页面。其中一个activity_main.xml为空,用来承载对话框(dialog),而另一个login_activity.xml里面包含用户名和密码的输入框。简单点说就是将login_activity.xml镶嵌到dialog中显示。

好了先看一下布局文件

Login_activity.xml

<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" >

    <TextView
        android:id="@+id/tvuserName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="18dp"
        android:layout_marginTop="44dp"
        android:text="用户名:" />

    <EditText
        android:id="@+id/etuserName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/tvuserName"
        android:layout_alignBottom="@+id/tvuserName"
        android:layout_marginLeft="56dp"
        android:layout_toRightOf="@+id/tvuserName"
        android:ems="10" >

        <requestFocus />
    </EditText>

    <TextView
        android:id="@+id/tvPWD"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/tvuserName"
        android:layout_below="@+id/etuserName"
        android:layout_marginTop="42dp"
        android:text="密码:" />

    <EditText
        android:id="@+id/etPWD"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/tvPWD"
        android:layout_alignParentRight="true"
        android:ems="10" />

</RelativeLayout>

下面是java代码,主要是LoginActivity部分的代码

package com.example.testofdialog;

import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class LoginActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        setContentView(R.layout.activity_login);
        
        showWaiterAuthorizationDialog() ;
    }
    
  //显示对话框
    public void showWaiterAuthorizationDialog() {
    	
    	//LayoutInflater是用来找layout文件夹下的xml布局文件,并且实例化
		LayoutInflater factory = LayoutInflater.from(LoginActivity.this);
		//把activity_login中的控件定义在View中
		final View textEntryView = factory.inflate(R.layout.activity_login, null);
         
        //将LoginActivity中的控件显示在对话框中
		new AlertDialog.Builder(LoginActivity.this)
		//对话框的标题
       .setTitle("登陆")
       //设定显示的View
       .setView(textEntryView)
       //对话框中的“登陆”按钮的点击事件
       .setPositiveButton("登陆", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int whichButton) { 
        	   
  			//获取用户输入的“用户名”,“密码”
        	//注意:textEntryView.findViewById很重要,因为上面factory.inflate(R.layout.activity_login, null)将页面布局赋值给了textEntryView了
        	final EditText etUserName = (EditText)textEntryView.findViewById(R.id.etuserName);
            final EditText etPassword = (EditText)textEntryView.findViewById(R.id.etPWD);
            
          //将页面输入框中获得的“用户名”,“密码”转为字符串
   	        String userName = etUserName.getText().toString().trim();
   	    	String password = etPassword.getText().toString().trim();
   	    	
   	    	//现在为止已经获得了字符型的用户名和密码了,接下来就是根据自己的需求来编写代码了
   	    	//这里做一个简单的测试,假定输入的用户名和密码都是1则进入其他操作页面(OperationActivity)
   	    	if(userName.equals("1") && password.equals("1")){
   	    		//跳转到OperationActivity
				Intent intent = new Intent();
				intent.setClass(LoginActivity.this, OperationActivity.class);
				startActivity(intent);
				//关闭当前页面
				LoginActivity.this.finish();
   	    		
   	    	}else{
   	    		Toast.makeText(LoginActivity.this, "密码或用户名错误", Toast.LENGTH_SHORT).show();
   	    	}
           }
       })
       //对话框的“退出”单击事件
       .setNegativeButton("退出", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int whichButton) {
        	   LoginActivity.this.finish();
           }
       })
       
        //对话框的创建、显示
		.create().show();
	}
}

经过上面就达到了预期的效果。但是还有不足之处:点击对话框之外的地方对话框会消失;如果输入错误给出提示信息之后对话框也会消失,不能继续操作。

先说一下“点击对话框之外的地方对话框会消失”这个问题

其实Android系统中的dialog默认是非模态的,只有设置为模态的才可以解决上述问题。而这个方法也很简单就是.setCancelable(true);将true该false即可解决这个问题。

 

再来说一下“如果输入错误给出提示信息之后对话框也会消失,不能继续操作”这个问题

这里需要调用对话框的dismiss()方法。

最终的代码如下

package com.example.testofdialog;

import java.lang.reflect.Field;

import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class LoginActivity extends Activity {

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.activity_login);

		showWaiterAuthorizationDialog();
	}

	// 显示对话框
	public void showWaiterAuthorizationDialog() {

		// LayoutInflater是用来找layout文件夹下的xml布局文件,并且实例化
		LayoutInflater factory = LayoutInflater.from(LoginActivity.this);
		// 把activity_login中的控件定义在View中
		final View textEntryView = factory.inflate(R.layout.activity_login,
				null);

		// 将LoginActivity中的控件显示在对话框中
		new AlertDialog.Builder(LoginActivity.this)
		// 对话框的标题
				.setTitle("登陆")
				// 设定显示的View
				.setView(textEntryView)
				// 对话框中的“登陆”按钮的点击事件
				.setPositiveButton("登陆", new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int whichButton) {

						// 获取用户输入的“用户名”,“密码”
						// 注意:textEntryView.findViewById很重要,因为上面factory.inflate(R.layout.activity_login,
						// null)将页面布局赋值给了textEntryView了
						final EditText etUserName = (EditText) textEntryView
								.findViewById(R.id.etuserName);
						final EditText etPassword = (EditText) textEntryView
								.findViewById(R.id.etPWD);

						// 将页面输入框中获得的“用户名”,“密码”转为字符串
						String userName = etUserName.getText().toString()
								.trim();
						String password = etPassword.getText().toString()
								.trim();

						// 现在为止已经获得了字符型的用户名和密码了,接下来就是根据自己的需求来编写代码了
						// 这里做一个简单的测试,假定输入的用户名和密码都是1则进入其他操作页面(OperationActivity)
						if (userName.equals("1") && password.equals("1")) {
							// 跳转到OperationActivity
							Intent intent = new Intent();
							intent.setClass(LoginActivity.this,
									OperationActivity.class);
							startActivity(intent);
							// 关闭当前页面
							LoginActivity.this.finish();

						} else {
							Toast.makeText(LoginActivity.this, "密码或用户名错误",
									Toast.LENGTH_SHORT).show();

							try {
								// 注意此处是通过反射,修改源代码类中的字段mShowing为true,系统会认为对话框打开
								// 从而调用dismiss()
								Field field = dialog.getClass().getSuperclass()
										.getDeclaredField("mShowing");
								field.setAccessible(true);
								field.set(dialog, false);
								dialog.dismiss();

							} catch (Exception e) {

							}
						}
					}
				})
				// 对话框的“退出”单击事件
				.setNegativeButton("退出", new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int whichButton) {
						LoginActivity.this.finish();
					}
				})
				// 设置dialog是否为模态,false表示模态,true表示非模态
				.setCancelable(false)
				// 对话框的创建、显示
				.create().show();
	}
}
  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值