Android Api Demos登顶之路(十五)Receive Result

这个demo主要演示了如何从其它的activity中返回预期的结果。要实现这个功能,主要有三个步骤需要注意。
1.在主activity启动子activity时使用startActivityForResult()方法,而不是使用startActivity()方法。
2.使用了startActivityForResult()方法就必须重写onActivityResult(int requestCode, int resultCode, Intent data) 并在这个中实现对返回的结果的处理。
3.在子activity中使用setResult()方法设置返回的结果。
主布局文件activity_main.xml

<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="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Press the button to get an activity result which will be displayed here:" />
      <TextView
        android:id="@+id/tv_result"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:layout_weight="1"
        android:background="#ff00ff88" />

      <Button 
          android:onClick="click"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_gravity="center_horizontal"
          android:text="Get Result"/>
</LinearLayout>

子布局文件send_result.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView 
        android:padding="5dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Pick a result to send or BACK to cancel"/>
    <Button 
        android:id="@+id/bt_corky"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_gravity="center_horizontal"
        android:text="Corky"/>
    <Button 
        android:id="@+id/bt_violet"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_gravity="center_horizontal"
        android:text="Violet"/>
</LinearLayout>

MainActivity类

public class MainActivity extends Activity {
    private static final int GET_CODE = 0;
    private TextView tv_result;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_result=(TextView) findViewById(R.id.tv_result);
        //设置textView的显示模式为允许在原有文本的基础上追加新的文本
        tv_result.setText(tv_result.getText(), BufferType.EDITABLE);
    }

    public void click(View v){
        //显示声明意图
        Intent intent=new Intent(this, SendResult.class);
        //启动activity并要求返回结果,GET_CODE为请求码
        startActivityForResult(intent, GET_CODE);
    }

    //使用startActivityForResult获取返回的结果,就必须重写onActivityResult方法
    //在该方法中对返回值进行处理
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        /*
         * 首先对请求码进行判断,当需要启动多个activity,并且需要获取每个activity返回的结果,
         * 此时就需要用请求码来区分不同的子activity返回的结果。
         * 本例只开启了一个子activity,请求码的作用不是很明显
         */
        if(requestCode==GET_CODE){
            /*
             * Editable 是一个接口类型,对它的实例化对象作出任何改变都是对原有的实例化对象操作的,
             * 内存地址还是原来的那个。简单地说就是可以灵活地、动态地追加文本内容。
             * 本例就是说只有一个textView的文本对象,我们对文本所做的修改都是对这个对象所做的修改
             * 修改内容会直接体现在这个文本对象上,而不需要再做对textView的赋值操作
             */
            Editable text=(Editable) tv_result.getText();
            /*判断结果码,结果码通过有两种RESULT_CANCELED和RESULT_Ok,前者表示子activity
             * 被取消,没有返回预的结果,后者表示返回预期的结果
             * */

            if(resultCode==RESULT_CANCELED){
                text.append("(Cancelled)");
            }else{
                text.append("(Okay");
                text.append(Integer.toString(resultCode));
                text.append(")");
                if(data!=null){
                    text.append(data.getAction());
                }
            }
            text.append("\n");
        }
    }
}

子activity类SendResult

public class SendResult extends Activity implements OnClickListener {
    private Button bt_corky, bt_violet;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.send_result);
        bt_corky = (Button) findViewById(R.id.bt_corky);
        bt_violet = (Button) findViewById(R.id.bt_violet);
        bt_corky.setOnClickListener(this);
        bt_violet.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.bt_corky:
            sendResultCorky();
            break;
        case R.id.bt_violet:
            sendResultViolet();
            break;
        default:
            break;
        }
    }

    /**
     * 设定返回的结果并finish掉自己
     */
    private void sendResultViolet() {
        setResult(RESULT_OK, new Intent().setAction("Violet"));
        finish();
    }

    private void sendResultCorky() {
        setResult(RESULT_OK, new Intent().setAction("Corky"));
        finish();
    }
}

别忘了在配置文件中配置子activity。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值