android loginDemo +WebService用户登录验证
- <merge xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- tools:context=".LoginActivity" >
- <!-- Login progress -->
- <!-- merge与FrameLayout布局相同,都是帧布局,不同的是,当LayoutInflater遇到这个标签时,它会跳过它,并将<merge />内的元素添加到<merge />的父元素里。 -->
- <!-- 这个线性布局是验证等待对话框的根元素,这个线性布局包含一个环形进度条,和一个字符标签 -->
- <!-- 设置子元素在这个布局中心排布 -->
- <!-- 设置该布局在父布局及界面中心水平放置 -->
- <!-- 设置子布局纵向布局 -->
- <!-- 设置这个布局界面隐藏不可见 -->
- <LinearLayout
- android:id="@+id/login_status"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:gravity="center_horizontal"
- android:orientation="vertical"
- android:visibility="gone" >
- <ProgressBar
- style="?android:attr/progressBarStyleLarge"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginBottom="8dp" />
- <TextView
- android:id="@+id/login_status_message"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginBottom="16dp"
- android:fontFamily="sans-serif-light"
- android:text="@string/login_progress_signing_in"
- android:textAppearance="?android:attr/textAppearanceMedium" />
- </LinearLayout>
- <!-- Login form -->
- <!-- 根目录为滚动试图 -->
- <ScrollView
- android:id="@+id/login_form"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
- <!-- 线性纵向排布 -->
- <LinearLayout
- style="@style/LoginFormContainer"
- android:orientation="vertical" >
- <!--邮箱输入框 -->
- <!--hint:设置编辑框无输入显示,设置输入类型为Email型,设置为一行、单行模式 -->
- <EditText
- android:id="@+id/email"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:hint="@string/prompt_email"
- android:inputType="textEmailAddress"
- android:maxLines="1"
- android:singleLine="true" />
- <!-- 密码输入框 -->
- <!-- imeActionLabel设置编辑文本“下一步”的显示内容,imeActionId设置“下一步”的ID, 设置“完成”,设置输入格式显示***-->
- <EditText
- android:id="@+id/password"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:hint="@string/prompt_password"
- android:imeActionId="@+id/login"
- android:imeActionLabel="@string/action_sign_in_short"
- android:imeOptions="actionUnspecified"
- android:inputType="textPassword"
- android:maxLines="1"
- android:singleLine="true" />
- <!-- 提交按钮 -->
- <!--paddingLeft设置左边距 -->
- <Button
- android:id="@+id/sign_in_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="right"
- android:layout_marginTop="16dp"
- android:paddingLeft="32dp"
- android:paddingRight="32dp"
- android:text="@string/action_sign_in_register" />
- </LinearLayout>
- </ScrollView>
- </merge>
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_login);
- // Set up the login form.
- //获取引入的邮箱并显示
- mEmail = getIntent().getStringExtra(EXTRA_EMAIL);
- mEmailView = (EditText) findViewById(R.id.email);
- mEmailView.setText(mEmail);
- //在密码编辑界面判断软键盘的选择,做对应操作
- mPasswordView = (EditText) findViewById(R.id.password);
- mPasswordView
- .setOnEditorActionListener(new TextView.OnEditorActionListener() {
- @Override
- public boolean onEditorAction(TextView textView, int id,
- KeyEvent keyEvent) {
- if (id == R.id.login || id == EditorInfo.IME_NULL) {//判断软件盘选择的内容
- attemptLogin();
- return true;
- }
- return false;
- }
- });
- mLoginFormView = findViewById(R.id.login_form);
- mLoginStatusView = findViewById(R.id.login_status);
- mLoginStatusMessageView = (TextView) findViewById(R.id.login_status_message);
- //提交按键响应处理
- findViewById(R.id.sign_in_button).setOnClickListener(
- new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- attemptLogin();
- }
- });
- }
- public void attemptLogin() {
- if (mAuthTask != null) {
- return;
- }
- //设置输入框的错误提示为空
- mEmailView.setError(null);
- mPasswordView.setError(null);
- //获取输入框的邮箱和密码
- mEmail = mEmailView.getText().toString();
- mPassword = mPasswordView.getText().toString();
- boolean cancel = false;
- View focusView = null;
- // 设置密码输入框的格式(不能为空,不能小于4位)如果格式错误重新获得焦点,并提示错误内容
- if (TextUtils.isEmpty(mPassword)) {
- mPasswordView.setError(getString(R.string.error_field_required));
- focusView = mPasswordView;
- cancel = true;
- } else if (mPassword.length() < 4) {
- mPasswordView.setError(getString(R.string.error_invalid_password));
- focusView = mPasswordView;
- cancel = true;
- }
- // 设置邮箱格式
- if (TextUtils.isEmpty(mEmail)) {
- mEmailView.setError(getString(R.string.error_field_required));
- focusView = mEmailView;
- cancel = true;
- } else if (!mEmail.contains("@")) {
- mEmailView.setError(getString(R.string.error_invalid_email));
- focusView = mEmailView;
- cancel = true;
- }
- if (cancel) {
- //如果格式错误,输入框重新获得输入焦点
- focusView.requestFocus();
- } else {
- //如果输入的格式正确,显示验证等待对话框,并启动验证线程
- mLoginStatusMessageView.setText(R.string.login_progress_signing_in);
- showProgress(true);
- mAuthTask = new UserLoginTask();
- mAuthTask.execute((Void) null);
- }
- }
- @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)//指出应用程序的API版本
- private void showProgress(final boolean show) {
- //获取运行平台的版本与应用的版本对比实现功能的兼容性
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
- int shortAnimTime = getResources().getInteger(
- android.R.integer.config_shortAnimTime);//获取系统定义的时间
- mLoginStatusView.setVisibility(View.VISIBLE);//设置验证对话框为可显
- mLoginStatusView.animate().setDuration(shortAnimTime)//设置动画显示时间
- .alpha(show ? 1 : 0)//设置动画渐变效果
- .setListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- mLoginStatusView.setVisibility(show ? View.VISIBLE
- : View.GONE);//跟据参数控制该控件显示或隐藏
- }
- });
- mLoginFormView.setVisibility(View.VISIBLE);//设置输入界面可显
- mLoginFormView.animate().setDuration(shortAnimTime)
- .alpha(show ? 0 : 1)
- .setListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- mLoginFormView.setVisibility(show ? View.GONE
- : View.VISIBLE);
- }
- });
- } else {
- mLoginStatusView.setVisibility(show ? View.VISIBLE : View.GONE);//跟据参数控制该控件显示或隐藏
- mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
- }
- }
- public class UserLoginTask extends AsyncTask<Void, Void, Boolean> {
- @Override
- protected Boolean doInBackground(Void... params) {//后台运行线程
- try {
- //模拟用户验证耗时
- Thread.sleep(2000);
- } catch (InterruptedException e) {
- return false;
- }
- for (String credential : DUMMY_CREDENTIALS) {//遍历数组验证自定义用户及密码
- String[] pieces = credential.split(":");//分割字符串,将密码个邮箱分离开
- if (pieces[0].equals(mEmail)) {
- return pieces[1].equals(mPassword);
- }
- }
- return true;
- }
- @Override
- protected void onPostExecute(final Boolean success) {//线程结束后的ui处理
- mAuthTask = null;
- showProgress(false);//隐藏验证延时对话框
- if (success) {
- finish();
- } else {//密码错误,输入框获得焦点,并提示错误
- mPasswordView
- .setError(getString(R.string.error_incorrect_password));
- mPasswordView.requestFocus();
- }
- }
- //取消验证
- @Override
- protected void onCancelled() {
- mAuthTask = null;
- showProgress(false);
- }
- }
- }
注意事项:这个demo为模块界面,其本身不是系统的默认启动界面,要想程序正常工作,要在AndroidManifest.xml中添加如下代码
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
三、添加WebService用户登录验证代码
- /*******************************************/
- final static String SERVICE_NS = "http://tempuri.org/"; //Webservice所在命名空间
- final static String SERVICE_URL = "http://192.168.1.213:9006/WS_Base.asmx";//Webservice服务地址
- final static String methodName = "AuthenticateLogin";//要使用的接口函数
- private HttpTransportSE ht; //该对象用于调用WebService操作
- private SoapSerializationEnvelope envelope;//上一个类信息的载体
- private SoapObject soapObject; //将参数传递给WebService
- /**********************************************/
- public class UserLoginTask extends AsyncTask<String, Void, Boolean> {
- @Override
- protected Boolean doInBackground(String... params) {
- // TODO: attempt authentication against a network service.
- //set webservices attribute
- /***********************************************/
- //创建HttpTransportSE对象,该对象用于调用WebService操作
- ht = new HttpTransportSE(SERVICE_URL);
- ht.debug = true;
- //创建SoapSerializationEnvelope对象,它是HttpTransportSE调用WebService时消息
- //的载体;客户端需要传入的参数,需要通过SoapSerializationEnvelope对象的bodyOut属性
- //传给服务器;服务器响应生成的SOAP消息也通过该对象的bodyIn属性来获取。
- envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);//指明SOPA规范
- //创建SoapObject对象,创建对象时需要传入调用Web Service的命名空间、方法名。
- soapObject = new SoapObject(SERVICE_NS, methodName);
- /************************************************************/
- //SoapObject 对象的addProperty(String name,Object value)方法将参数传递给服务端
- //该方法的name参数指定参数名;value参数指定参数值。
- //如果方法存在多个参数,多次调用addProperty即可。
- soapObject.addProperty("userName",params[0]);
- soapObject.addProperty("password",params[1]);
- envelope.bodyOut = soapObject;
- //设置WebService的开发类型
- envelope.dotNet = true;
- try
- {
- //调用远程WebService,call()方法的参数意义 第一个参数:命名空间+方法名,
- //第二个参数:SoapSerializationEnvelope对象
- ht.call(SERVICE_NS+methodName, envelope);
- if(envelope.getResponse()!=null)
- {
- //SoapSerializationEnvelope对象的bodyIn属性返回一个SoapObject对象,
- //该对象就代表了WebService的返回消息。
- //WebService在服务器端返回值是String类型的数值的时候使用Object代替SoapObject
- SoapObject result = (SoapObject)envelope.bodyIn;
- Object detail1 = (Object) result.getProperty(0);
- return detail1.toString().equals("true");
- }
- return false;
- }
- catch (IOException e)
- {
- e.printStackTrace();
- }
- catch (XmlPullParserException e) {
- // TODO: handle exception
- e.printStackTrace();
- }
- return false;
- }
- @Override
- protected void onPostExecute(final Boolean success) {
- mAuthTask = null;
- showProgress(false);
- if (success) {
- finish();
- } else {
- mPasswordView
- .setError(getString(R.string.error_incorrect_password));
- mPasswordView.requestFocus();//设置密码框获得焦点
- }
- }
- @Override
- protected void onCancelled() {
- mAuthTask = null;
- showProgress(false);
- }
- }
总结:“关于android loginDemo +WebService用户登录验证”实验中遇到的问题及知识点总结
1.View.VISIBLE,常量值为0,意思是可见的2.View.INVISIBLE,常量值是4,意思是不可见的3.View.GONE,常量值是8,意思是不可见的,并且不占用布局空间
转载于:https://www.cnblogs.com/android-blogs/p/5912585.html
android loginDemo +WebService用户登录验证相关推荐
- 使用SSH框架实现用户登录验证
今天,写一个非常简单的通过struts+hibernate+spring的集成来实现用户登录验证的例子,让大家了解一下三者是如何是整合的. 我们可以通过myeclipse的向导,生成相应的环境搭建,如 ...
- ajax登录验证的原理,ajax用户登录验证-get和post提交方式,与工作原理—2018-8-15...
ajax用户登录验证: 实例 html> Ajax实战:表单验证 用户登录 邮箱: 密码: 提交 let btn = document.getElementsByTagName('button' ...
- python登录验证程序_Python模拟用户登录验证
本文实例为大家分享了Python模拟用户登录验证的具体代码,供大家参考,具体内容如下 1.功能简介 此程序模拟用户登录验证的过程,实现用户名输入.黑名单检测.用户有效性判别.密码输入及验证等.用户在3 ...
- php 语法验证_PHP用户登录验证模块
这篇文章介绍的内容是关于PHP用户登录验证模块 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 实现用户登录 >>>1 创建登录表单 登录表单的HTML代码如下: U ...
- android studio 微信登录界面,如何使用Android Studio开发用户登录界面
满意答案 zhou9081 2016.05.21 采纳率:51% 等级:7 已帮助:411人 如何使用Android Studio开发用户登录界面,具体解决方案如下: 解决方案1: <:t ...
- JavaWeb 实验 Servlet用户登录验证
实验2.2 Servlet用户登录验证 实验内容: 编写JSP程序,实现用户提交登录表单给Servlet,由Servlet 查询数据库(模拟查询,不用真的连接数据库查询),对用户是否存在进行验证. 实 ...
- 数据库用户登录验证及注册功能实现
数据库用户登录验证及注册功能实现 1.mysql数据库安装 2.解决navicat连接mysql的密码错误问题 3.创建数据库.用户表.插入数据 (1)进入mysql数据库 (2) 创建数据库dnn_ ...
- 基于 JSP + Servlet 的用户登录验证
综合案例--基于 JSP + Servlet 的用户登录验证 [例6-1] 实现一个简单的用户登录验证程序,如果用户名是 abc ,密码是 123,则显示欢迎用户的信息,否则显示"用户名或密 ...
- php链接mysql实例之用户登录验证以及使用cookie登录
这篇博客实现用户登录验证以及使用cookie登录,它承接了前面的几个博客: 1. php连接mysql实例之新用户注册实现 2. php连接mysql实例之后台列表显示已注册的用户信息 3. php连 ...
- 使用filter过滤器实现简单用户登录验证(不用配置web.xml文件)
一.filter过滤器的作用 如果想要获取中文字符,或者是显示提交的中文,就需要添加以下代码,来防止乱码的情况发生. request.setCharacterEncoding("utf-8& ...
最新文章
- 超想做一个网络游戏!有兴趣的人进来讨论讨论!
- 计算机缓存Cache机制理解
- WCF安全之ASP.NET兼容模式
- 用康托展开实现全排列(STL、itertools)
- mysql查询所有姓王的信息_MySQL的查询练习
- Office 365 On MacOS 系列——安装 O365 其他组件
- 多程序集版本冲突问题
- 异常:java.lang.IllegalStateException: No instances found of configserver(里面是一个微服务名)
- 2019-12-11 转载TCP/IP编程常用C语言头文件
- 什么叫做形态学图像处理_【视觉】机器视觉技术和无人天车有什么关系?
- 文本在线查重系统的设计与实现(毕业设计)
- 对象关系Lookup与Master-Detail
- es提示 MaxNewSize (1048576k) is equal to or greater than the entire heap (1048576k). A new max genera
- 如何从Mixamo下载人物模型的动画
- 多重比较和多重比较陷阱
- OSI七层模型就这???
- 搭建Win XP下iPhone开发环境
- 比较犹太人和中国人做生意的模式
- fcitx输入法字体太小解决方案
- 快手2020校园招聘秋招笔试--工程C试卷
热门文章
- 开发人员的U盘,最好是128G
- Python中,如何使用ImageDraw在Image上绘制粗线?
- 图形界面下,如何查看LINUX隐藏的文件、目录
- 由大脑工作原理,探讨向菩萨求聪明的灵验的科学原理
- 想起“不能什么都是你来干”
- 桃养人,杏害人,樱桃树下埋死人
- mysql8 json_table_新特性解读 | MySQL 8.0 json到表的转换
- VS C++ string转int int转string
- 开始菜单单如何打开计算机程序,什么是开始菜单
- 怎么让图片一直转圈_半夜跟着导航开进山路,货车绕了3小时仍原地转圈,小两口快急哭...