您的位置:首页 > 编程语言

"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按钮点击的,可单独处理
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息