"startActivityForResult"-通俗易懂图文+代码全解析

介绍:

大家在面试的时候经常会经常被问到一个看似简单的问题,但是好多人容易出错,就是页面跳转获取值的问题,最典型的就是我们今天讲的这个"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按钮点击的,可单独处理
                }
          }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值