Android学习笔记(四)页面跳转与页间传递数据
在理解了Android中视图文件与代码文件的关系之后,现在来尝试一下在一个App里面建立多个页面。对于App的第一个界面在新建项目的时候IDE就帮我们建立起来的,但是要新增页面的话,则需我们手动去建立,
1、在res的layout文件夹新增新页面的布局文件
2、在src相应的包中新增相应的类文件。重写onCreate方法后,setContentView方法传入R.layout.新布局文件名
3、在AndroidManifest.xml文件中增加新的activity的android:name属性则填入类文件的全名。如果新的页面是程序运行的页面,则要在activity内增加<intent-filter >节点。
页面跳转用到的是Intent这个类,调转调用的方法是startActivity或者是startActivityForResult。两者的区别在于前者是简单的跳转,后者是有参数返回的跳转。
下面则是一个单纯的跳转的核心代码,只展示了对Click事件处理的代码
1 @Override 2 public void onClick(View view) { 3 Intent intent=new Intent(); 4 intent.setClass(MainActivity.this, steptwopage.class); 5 startActivity(intent); 6 finish(); 7 }
首先构造一个Intent对象的实例,调用setClass设置跳转的定向,从当前Activity(在本例中是MainActivity)的this,跳转到目标Activity(本例中的steptwopage)的class中,当然这个设置也可以在Intent的构造函数中实现。最后调用startActivity开始跳转。finish()方法的调用相当于退出当前App。这个方法可有可无,差别就在于跳转到新页面后按“后退”按钮时是返回到上一个页面还是直接退出App。不过实际上还是有返回到上一个页面的,根据我的推断当前线程调用了startActivity方法之后,当前的操作就会被阻塞,当前页面会放到一个运行Activity的栈中,等到新的Activity的操作结束了,才从运行栈中把之前的Activity取出来,继续执行startActivity后面的代码。感觉这个应该跟winPhone的概念类似,这番推断是从winPhone中搬过来的。
带返回值的跳转用的是startActivityForResult方法,它的原型如下
void android.app.Activity.startActivityForResult(Intent intent, int requestCode)
这里调用了方法之后不能用finish(),因为从页面返回来的参数没经过处理,App就从finsih()退出了。如下面代码
1 @Override 2 public void onClick(View view) { 3 int GET_CODE=0; 4 Intent intent=new Intent(); 5 intent.setClass(MainActivity.this, steptwopage.class); 6 startActivityForResult(intent,GET_CODE); 7 }
要对返回的参数进行处理则需要重写onActivity方法,函数原型如下
protected void onActivityResult(int requestCode, int resultCode, Intent data)
requestCode则是之前调用startActivityForResult时传入的requestCode,resultCode则是从跳转的目标页面传回来的。一般有RESULT_CANCELED,RESULT_OK这些值。下面则是一个重写的示例
1 @Override 2 protected void onActivityResult(int requestCode, int resultCode, Intent data) 3 { 4 if(requestCode!=GET_CODE)return; 5 if(resultCode==RESULT_CANCELED) 6 this.lbResult.setText("RESULT_CANCELED"); 7 else if(data!=null) 8 { 9 this.lbResult.setText(data.getAction()); 10 } 11 }
那么在目标页面在返回时会做写什么处理呢?在目标页面主要调用了setResult方法,方法的原型如下
void android.app.Activity.setResult(int resultCode, Intent data)
resultCode的值代表了这次返回操作的意义,第二个Intent的对象用来存储返回的值。例如
setResult(RESULT_OK,(new Intent()).setAction(GetResultText())); finish();
调用了finish()才能结束当前的Activity,返回到之前的页面。
还有一个就是从当前Acitvity传参到目标页面。在原Activity里面利用Bundle类,调用putString方法设置。例如
1 @Override 2 public void onClick(View v) { 3 4 Intent intent=new Intent(); 5 intent.setClass(steptwopage.this, StepThreePage.class); 6 7 Bundle bundle=new Bundle(); 8 bundle.putString("content", txtNewpw.getText().toString()); 9 10 intent.putExtras(bundle); 11 12 startActivityForResult(intent,0); 13 }
然后在目标Activity的onCreate方法里面获取传过来的值,例如
1 content=getIntent().getExtras().getString("content"); 2 lbResult.setText(content);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步