个人解读Activity之三

       这一节,我们讨论启动Activities并获取结果这个议题。不知道大家还记不记得,在上一节中我们已经实现了在一个Activity中启动另一个Activity,但是仅仅是调用了startActivity()这个方法来启动,之后就没管了,但是我们试想一下,假如你要从一个电话簿中选取一个联系人记录,然后在创建一个新的Activity来显示这个记录的详细信息,这就涉及到第二个Activity必须知道用户再第一个Activity中选中了哪一条记录,这就涉及到了两个Activities之间传递数据,像这种情况是时常遇到的!
      我们这里也用一个例子来实现我们的设想:在第一个Activity上面显示一个列表视图,显示几条记录!然后为每个条目设置监听器,但单击任何条目时候,在第二个Activity上面显示我们之前选中条目的详细信息!
      第一步:新建一个工程:ActivityRes;
      第二步:修改ActivityRes.java文件,如下所示:
      
/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.main);
        
        String[] str = {"WuHan", "QingDao", "YuCi"};
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,str);
        setListAdapter(adapter);
    }
    
    @Override
    protected void onListItemClick (ListView l, View v, int position, long id)
    {
    	super.onListItemClick(l, v, position, id);
    	switch(position)
    	{
    	case 0:
    		Bundle bundle = new Bundle();
    		bundle.putString("name", "WuHan");
    		bundle.putString("school", "XXX");
    		bundle.putString("student", "XXX");
    		Intent intent = new Intent(ResultActivity.this, SecondActivity.class);
    		intent.putExtras(bundle);
    		startActivity(intent);
    	}
    }
        第三步:创建第二个activity:SecondActivity,代码如下:
	private TextView TextView01;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView01 = (TextView)findViewById(R.id.TextView01);
        Intent intent = this.getIntent();
        Bundle bundle = intent.getExtras();
        TextView01.setText(bundle.getString("name")+":"+bundle.getString("school")+":"+bundle.getString("student"));

    }
         第四步:运行应用程序,可以看到如下结果:
   
       以上是两个Activity之间的数据传输,再来看看关于获取结果!
       有的时候,可能需要从启动的activity中获取一个结果。在这种情况下,我们应该调用startActivityForResult方法来启动activity而不是之前使用的startActivity()方法。为了从随后启动的Activity中获取到结果,我们必须完成onActivityResult()这个回调函数。当指定的activity启动完成后,他将会通过一个Intent对象返回一个结果到onActivityResult()方法中。
例如:我们需要从联系人中获取一条记录,以至于我们可以对这条记录进行其他的一些操作,我们可以像下面这样创建一个返回结果的Intent并且处理这个返回的结果!
       
private void pickContact() {
    // Create an intent to "pick" a contact, as defined by the content provider URI
    Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);
    startActivityForResult(intent, PICK_CONTACT_REQUEST);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // If the request went well (OK) and the request was PICK_CONTACT_REQUEST
    if (resultCode == Activity.RESULT_OK && requestCode == PICK_CONTACT_REQUEST) {
        // Perform a query to the contact's content provider for the contact's name
        Cursor cursor = getContentResolver().query(data.getData(),
        new String[] {Contacts.DISPLAY_NAME}, null, null, null);
        if (cursor.moveToFirst()) { // True if the cursor is not empty
            int columnIndex = cursor.getColumnIndex(Contacts.DISPLAY_NAME);
            String name = cursor.getString(columnIndex);
            // Do something with the selected contact's name...
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值