实验3:Android组件通信
来源:互联网 发布:傲剑绿色版升级数据 编辑:程序博客网 时间:2024/06/01 13:49
编程实现:
(1)功能描述:
- 主界面上有一个“登录”按钮,点击“登录”按钮后打开一个新的Activity
- 新的Activity上面有输入用户名和密码的控件,在用户关闭这个Activity后,将用户输入的用户名和密码传递到主界面中
(2)编程要点:
- 主界面的Activity命名为MainActivity;启动新的Activity命名为UserLoginActivity
- 分别使用显式启动和隐式启动的方式,启动新的Activity
- 用户名中不能出现“@”等符号,同时长度不超过12个字符;密码使用密码文本显示方式,即显示为“******”方式,同时只能为数字*
- 返回的用户名和密码要以Toast的方式显示出来
- MainActivity和UserLoginActivity中各个生命周期的回调函数中要以Log.i方式显示日志信息
代码片:
MainActivity.java
package com.example.experiment3_4_1;import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.util.Log;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;public class MainActivity extends Activity{ public static final String TAG="MainActivity"; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); Log.d(TAG,"onCreate"); setContentView(R.layout.activity_main); Button button01=(Button)findViewById(R.id.button01); Button button02=(Button)findViewById(R.id.button02); button01.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v){ //显式启动 Intent intent01=new Intent(MainActivity.this,UserLoginActivity.class); startActivityForResult(intent01,1); } }); button02.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v){ //隐式启动 Intent intent02=new Intent("com.example.activitytest.ACTION_START"); startActivityForResult(intent02,1); } }); } protected void onActivityResult(int requestCode,int resultCode,Intent data){ switch(requestCode){ case 1: if(resultCode==RESULT_OK){ String returnedData=data.getStringExtra("data_return"); Toast.makeText(getApplicationContext(),returnedData.toString(), Toast.LENGTH_LONG).show(); } break; default: } /* super.onActivityResult(requestCode,resultCode,data); if(resultCode==RESULT_OK){ Uri uriData=data.getData(); Toast.makeText(getApplicationContext(),uriData.toString(), Toast.LENGTH_LONG).show(); } else{ Toast.makeText(getApplicationContext(),"用户名和密码为空", Toast.LENGTH_LONG).show(); } */ } @Override protected void onStart(){ super.onStart(); Log.i(TAG,"onStart"); } @Override protected void onResume(){ super.onResume(); Log.i(TAG,"onResume"); } @Override protected void onPause(){ super.onPause(); Log.i(TAG,"onPause"); } @Override protected void onStop(){ super.onStop(); Log.i(TAG,"onStop"); } @Override protected void onDestroy(){ super.onDestroy(); Log.i(TAG,"onDestroy"); } @Override protected void onRestart(){ super.onRestart(); Log.i(TAG,"onRestart"); } @Override public boolean onCreateOptionsMenu(Menu menu){ // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main,menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item){ // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id=item.getItemId(); if(id==R.id.action_settings){ return true; } return super.onOptionsItemSelected(item); }}
UserLoginActivity.java
package com.example.experiment3_4_1;import java.util.regex.Matcher;import java.util.regex.Pattern;import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.text.InputFilter;import android.text.Spanned;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.view.Window;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class UserLoginActivity extends Activity { public static final String TAG="MainActivity"; EditText editText1; EditText editText2; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); Log.d(TAG,"onCreate"); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.userlogin); editText1=(EditText)findViewById(R.id.username); setEditTextInhibitInputSpecialChat(editText1); editText2=(EditText)findViewById(R.id.password); } @Override public void onBackPressed(){ String username=editText1.getText().toString(); String password=editText2.getText().toString(); String uriString="用户名:"+username+"\n"+"密码:"+password; Intent intent=new Intent(); intent.putExtra("data_return",uriString); //Uri data=Uri.parse(uriString); //Intent intent=new Intent(null,data); if((username==null||username.length()<=0)&&(password==null||password.length()<=0)){ Toast.makeText(getApplicationContext(),"用户名和密码为空", Toast.LENGTH_LONG).show(); finish(); } else{ setResult(RESULT_OK,intent); finish(); } } public static void setEditTextInhibitInputSpecialChat(EditText editText){ InputFilter filter=new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { String specialChat="[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]"; Pattern pattern = Pattern.compile(specialChat); Matcher matcher = pattern.matcher(source.toString()); if(matcher.find()||source.equals(" ")||dend>11) return ""; else return null; } }; editText.setFilters(new InputFilter[]{filter}); } @Override protected void onStart(){ super.onStart(); Log.i(TAG,"onStart"); } @Override protected void onResume(){ super.onResume(); Log.i(TAG,"onResume"); } @Override protected void onPause(){ super.onPause(); Log.i(TAG,"onPause"); } @Override protected void onStop(){ super.onStop(); Log.i(TAG,"onStop"); } @Override protected void onDestroy(){ super.onDestroy(); Log.i(TAG,"onDestroy"); } @Override protected void onRestart(){ super.onRestart(); Log.i(TAG,"onRestart"); }}
代码分析:
- 因为题目要求返回数据给上一个活动,所以采用startActivityForResult()的方法启动活动。startActivty()方法接受两个参数,第一个参数是Intent,第二个参数是请求码。例如:这里的请求码只要是一个唯一值就可以,这里传入了1。
startActivityForResult(intent01,1);
- 因为是使用startActivityForResult()方法来启动UserLoginActivity的,在UserLoginActivity被销毁之后会回调上一个活动的onActivityResult()方法,所以需要在MainActivity中重写这个方法来得到返回的数据。
protected void onActivityResult(int requestCode,int resultCode,Intent data){ switch(requestCode){ case 1: if(resultCode==RESULT_OK){ String returnedData=data.getStringExtra("data_return"); Toast.makeText(getApplicationContext(),returnedData.toString(), Toast.LENGTH_LONG).show(); } break; default: } }
- 在UserLoginActivity中注册点击事件,并在点击事件中添加返回数据的逻辑。我们先是构建了一个Intent,紧接着把要传递的数据存放在Intent中,然后调用了setResult()方法。这个方法专门用于向上一个活动返回数据。setResult()方法接受两个参数,第一个参数用于向上一个活动返回处理结果,一般只用RESULT_OK或RESULT_CANCELED这两个值,第二个参数则是把带有数据的Intent传递回去,然后再调用finish()方法销毁当前活动。
- 因为题目没有说明如何关闭UserLoginActivity,因此我选择采用Android自带的返回键来退出,即通过Back键回到MainActivity。所以需要重写onBackPressed()方法。
@Override public void onBackPressed(){ String username=editText1.getText().toString(); String password=editText2.getText().toString(); String uriString="用户名:"+username+"\n"+"密码:"+password; Intent intent=new Intent(); intent.putExtra("data_return",uriString); //Uri data=Uri.parse(uriString); //Intent intent=new Intent(null,data); if((username==null||username.length()<=0)&&(password==null||password.length()<=0)){ Toast.makeText(getApplicationContext(),"用户名和密码为空", Toast.LENGTH_LONG).show(); finish(); } else{ setResult(RESULT_OK,intent); finish(); } }
- 因为题目要求用户名中不能出现特殊符号,同时长度不超过12字符。这时我们可以使用系统提供的输入过滤器InputFilter来过滤特殊字符。而在做长度限制时最简单的方法就是在EditText中设置maxLength属性。但是maxLength和InputFilter会起冲突。InputFilter()方法中dend参数即对长度进行限制。因此我们让dend>11,就成功限制输入长度为12个字符。注意:end是限制每次输入长度的,而dend是限制总的输入长度的。
public static void setEditTextInhibitInputSpecialChat(EditText editText){ InputFilter filter=new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { String specialChat="[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]"; Pattern pattern = Pattern.compile(specialChat); Matcher matcher = pattern.matcher(source.toString()); if(matcher.find()||source.equals(" ")||dend>11) return ""; else return null; } }; editText.setFilters(new InputFilter[]{filter}); }
- Toast的用法是通过静态方法makeText()创建出一个Toast对象,然后调用show()方法将Toast显示出来。makeText()方法需要传入三个参数。第一个参数是Context,第二个参数是Toast显示的文本内容,第三个参数是Toast显示的时长,有两个内置常量可以选择Toast.LENGTH_SHORT和Toast.LENGTH_LONG。
Toast.makeText(getApplicationContext(),returnedData.toString(),Toast.LENGTH_LONG).show();
运行图片:
阅读全文
0 0
- 实验3:Android组件通信
- Android组件通信--Intent
- Android通信组件Intent
- android intent 组件通信
- Android组件间通信
- Android四大组件通信
- Android组件之间通信
- Android组件通信
- Android组件通信
- Android的组件通信:intent
- Android组件之间的通信
- 【Android四大组件】bundle通信
- Android进程间通信、线程间通信、组件间通信
- Android学习-----Android组件通信PendingIntent
- Android学习-----Android组件通信PendingIntent
- Android移动终端设计实验一+基本组件应用实验
- Android系统的组件的通信
- Android组件间通信库EventBus学习
- 一些实用的免费接口
- 用递归的思想求斐波那契数
- 西南科技大学OJ题 数字转换成字符0613
- open-vmdk在linux编译时候 zlib.h的头文件问题 以及在windows使用zlib的资料查找记录
- IDEA 调试Web请求(Tomcat为例)
- 实验3:Android组件通信
- 面试实战酷跑demo
- java多线程相关问题(待解决)
- 分享一个Java生成二维码工具类
- java正则表达式中Group的理解
- BZOJ1003(ZJOI2006)[物流运输]--最短路+DP
- Spark2.2任务提交运行机制及源码解析
- 被包含的页面,要与当前页<%@ page/>内容要一致,不允许contentType="text/html; charset=UTF-8",有空格
- java位移运算符