"startActivityForResult"-通俗易懂图文+代码全解析
2016-06-30 15:50
351 查看
介绍:
大家在面试的时候经常会经常被问到一个看似简单的问题,但是好多人容易出错,就是页面跳转获取值的问题,最典型的就是我们今天讲的这个"startActivityForResult",好,现在就开始我们的学习.
先看演示,后面再各自解释:
点击按钮后,跳到界面二:
勾选响应的选项后,点击选择按钮,就会关闭界面二,返回界面一:
完成任务.
下面开始重点介绍
2.我们新建两个界面
第一个界面:有提醒选择的按钮,下面是显示文字信息的文本控件界面一布局代码:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:onClick="select" android:text="请点击选择" android:layout_width="match_parent" android:layout_height="wrap_content"/> <TextView android:id="@+id/tv_select" android:textSize="20sp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="你选择的是 : "/> </LinearLayout>
第一个活动代码是:
public class MainActivity extends AppCompatActivity { private TextView mRuslt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mRuslt = (TextView) findViewById(R.id.tv_select); } public void select(View view) { Intent intent = new Intent(this, MainActivityB.class); //传给B的请求码,设置>=0的值即可 startActivityForResult(intent,101); } //一个或者多个"目标页面"关闭后,就会调用该方法. @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { //从意图里面获取了信息 mRuslt.setText("您选择的选项有 : \r\n"+intent.getStringExtra("info")); super.onActivityResult(requestCode, resultCode, intent); } }
第二个界面:有多个选择框,下面有个选择完毕的按钮
界面二布局代码:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="goodjobtome.com.startforresultt.MainActivity"> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:gravity="center_vertical" android:layout_height="wrap_content" > <CheckBox android:id="@+id/ck1" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:gravity="center_vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/ck1" android:text="第1项" android:textColor="#101210"/> </LinearLayout> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:gravity="center_vertical" android:layout_height="wrap_content" > <CheckBox android:id="@+id/ck2" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:gravity="center_vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/ck2" android:text="第2项" android:textColor="#101210"/> </LinearLayout> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:gravity="center_vertical" android:layout_height="wrap_content" > <CheckBox android:id="@+id/ck3" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:gravity="center_vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/ck3" android:text="第3项" android:textColor="#101210"/> </LinearLayout> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:gravity="center_vertical" android:layout_height="wrap_content" > <CheckBox android:id="@+id/ck4" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:gravity="center_vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/ck4" android:text="第4项" android:textColor="#101210"/> </LinearLayout> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:gravity="center_vertical" android:layout_height="wrap_content" > <CheckBox android:id="@+id/ck5" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:gravity="center_vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/ck5" android:text="第5项" android:textColor="#101210"/> </LinearLayout> <Button android:onClick="select" android:text="选好了" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout>
第二个活动代码是:
public class MainActivityB extends Activity { private TextView mRuslt; private CheckBox mCk1; private CheckBox mCk2; private CheckBox mCk3; private CheckBox mCk4; private CheckBox mCk5; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); initView(); } private void initView() { mCk1 = (CheckBox) findViewById(R.id.ck1); mCk2 = (CheckBox) findViewById(R.id.ck2); mCk3 = (CheckBox) findViewById(R.id.ck3); mCk4 = (CheckBox) findViewById(R.id.ck4); mCk5 = (CheckBox) findViewById(R.id.ck5); } //返回的时候再判断,避免了重复 public void select(View view) { StringBuilder sb = new StringBuilder(); if (mCk1.isChecked()) { sb.append("第1项"); sb.append("\r\n"); } if (mCk2.isChecked()) { sb.append("第2项"); sb.append("\r\n"); } if (mCk3.isChecked()) { sb.append("第3项"); sb.append("\r\n"); } if (mCk4.isChecked()) { sb.append("第4项"); sb.append("\r\n"); } if (mCk5.isChecked()) { sb.append("第5项"); sb.append("\r\n"); } Intent intent = new Intent(this, MainActivity.class); intent.putExtra("info", sb.toString()); //设置结果码和意图 setResult(100, intent); //注意必须finish()否则无效,因为关闭才有效果,如果只是startActivity跳转那么此页面没销毁,不会将值传过去,是必须建立在"销毁所选界面"的基础上,文档告诉我们,只有到activity结束的时候,才会返回消息 finish(); } }
总结
1.记住这三个步骤:界面一:
1.startActivityForResult(intent,requestCode);//我们的目的意图和请求码
2.重写的(int requestCode, int resultCode, Intent intent)方法
界面二:
3.返回给界面一信息的setResult方法(rusultCode,intent);文档告诉我们,只有到activity结束的时候,才会返回消息
2.升级必懂:
requestCode和resultCode的区别和联系
我们starActivityForResult的时候传过去的是请求码(>0),这个主要用来标记用的,顺便写个>0的就没事
界面设置结果回来的时候给回的是结果码
所以对于onActivityResult里的请求码和结果码,都是对应上面的,目的就是起到判断分析的作用,比如界面一有多个按钮,跳转不同的界面获取不同的值.
不同的界面返回了值,并设置不同的结果码,界面一就可以根据结果码判断或做不同的事情了.
上面说的请求码,说只要>0就行,那么存在的意义是什么呢,那么我们就说说他的具体作用吧:
一般的开发,设置成>0就都能满足需求了,我们只根据结果码判断.
但比如如下需求就用到了
界面一:两个按钮,跳到同一个界面
我们在onActivityResult里面怎么判断刚才是那个按钮点击发出的?
即刚才的按钮选择不同的请求码即可,然后就可以在这里判断了,代码如下:
//两按钮跳不同界面,不同的请求码 button1.setOnClickListener(new View.OnClickListener({ public void onClick(View v) { startActivityForResult (new Intent(MainActivity.this,NewActivity.class),1); } }); button2.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { startActivityForResult(newIntent(MainActivity.this,NewActivity.class),2); } }); @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch(requestCode){ case 1: //刚刚是1按钮点击的,可单独处理 case 2: //刚刚是2按钮点击的,可单独处理 } } }
相关文章推荐
- 关于block界面传值
- 界面间的传值
- UI界面传值
- iOS之界面传值(通知,属性,协议,NSUserDefaults,KVC)
- Android Activity之间跳转与传值
- Swift:界面传值指南
- 安卓两个活动间传递数据
- startActivityForResult用法详解
- 界面之间传值
- "Java基础"-Java,Android面试必问部分
- "适配器模式"-之Java,Android面试必问设计模式(5/9)
- "装饰模式"-之Java,Android面试必问设计模式(6/9)
- "策略模式"-之Java,Android面试必问设计模式(7/9)
- "观察者模式"-之Java,Android面试必问设计模式(8/9)
- "Java高级"-Java,Android面试必问部分
- activity请求码与结果码
- iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值) 推荐
- UINavigationController与简单的页面传值
- "Android-事件处理机制"之面试必问技能点汇总
- "Intent"-Android面试必问"精华技能点"汇总