之前 Android-Intent意图传递数据,的博客讲解了,一个Activity 跳转 到另外一个Activity 可以把数据带过去
Android还提供了一种方式,一个Activity 跳转 到另外一个Activity 可以把数据传递过去,然后还可以把数据返回过来,就需要startActivityForResult
在MyActivity1中执行startActivityForResult(intent, 请求码)
然后在MyActivity1重写onActivityResult方法,用于接收返回的信息
package liudeli.activity.intent.result; import android.app.Activity; import android.app.AlertDialog; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.EditText; import java.util.ArrayList; import java.util.List; import liudeli.activity.R; import liudeli.activity.intent.MyApplication; public class MyActivity1 extends Activity { private EditText etItemInfo; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my1); etItemInfo = findViewById(R.id.et_item_info); } public void startMyActivity2(View view) { // 绑定数据 List<String> list = new ArrayList<>(); for (int i=0; i< 30; i++) { list.add("我是一个条目 下标是: " + i); } // 把数据绑定给Application MyApplication myApplication = (MyApplication) getApplication(); myApplication.list = list; Intent intent = new Intent(this, MyActivity2.class); startActivityForResult(intent, 500); // 请求码 500 } /** * 用来接收 startActivityForResult --> Activity ->setResult(200, intent); * @param requestCode startActivityForResult(intent, 500); * startActivityForResult(intent, 400); * startActivityForResult(intent, 300); * startActivityForResult(intent, 310); * ...... * 如果没有requestCode请求码,就没法对业务逻辑进行划分处理 * 规范写法是,成对判断: requestCode == 500 && resultCode == 200 * * @param resultCode setResult(200, intent); * setResult(210, intent); * setResult(240, intent); * setResult(260, intent); * ...... * 如果没有resultCode结果码,就没法对业务逻辑进行划分处理 * 规范写法是,成对判断: requestCode == 500 && resultCode == 200 * @param data */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 不能用getIntent(),要用data 才能获取到item String item = data.getStringExtra("item"); /*Toast.makeText(this, "requestCode:" + requestCode + " ,resultCode:" + resultCode + " ,item:" + item , Toast.LENGTH_SHORT).show();*/ new AlertDialog.Builder(MyActivity1.this) .setMessage("requestCode:" + requestCode + " ,resultCode:" + resultCode + " ,item:" + item).setPositiveButton("我知道了", null).show(); etItemInfo.setText(item + ""); if (null != item) { // 设置光标放在最后 etItemInfo.setSelection(item.length()); } // 实际正规写法应该是这样: // requestCode和startActivityForResult保持一致 // resultCode和setResult(200) 200 保持一致 // 如果返回了intent 就需要判断 null != data if (requestCode == 500 && resultCode == 200 && null != data) { // ... 实际业务逻辑处理 } } }
MyActivity1的布局文件 activity_my1.xml
在这布局中,重点讲解了,weight 的使用,和理解
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:id="@+id/et_item_info" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="startMyActivity2" android:text="启动My2" android:layout_weight="0" /> <!-- 注意:⚠️ android:layout_weight="0" 默认是0,0代表的意思是:我先放入填充显示 Button layout_weight = "0" 先放入填充显示 EditText 设置比重为1,后放入显示,然后再 有多少空间给我填充,我就填充多少 所以说:多使用 比重 和 相对布局,有利于 屏幕的自适配 layout_weight 涉及到优先放入填充显示 --> </LinearLayout> </RelativeLayout>
MyActivity1的布局文件 activity_my1.xml 的布局预览:
MyActivity2返回数据,就需要用到 setResult(200, intent); + finish();
package liudeli.activity.intent.result; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import java.util.List; import liudeli.activity.R; import liudeli.activity.intent.MyApplication; public class MyActivity2 extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my2); // 取出数据 MyApplication myApplication = (MyApplication) getApplication(); List<String> list = myApplication.list; ListView listView = findViewById(R.id.listview); // 只有一个数据,简单的展示列表,就采用ArrayAdapter final ArrayAdapter arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, android.R.id.text1, list); listView.setAdapter(arrayAdapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 只返回结果码 // setResult(200); String item = (String) arrayAdapter.getItem(position); Intent intent = new Intent(); intent.putExtra("item", item); // 返回结果码,还返回数据,数据用Intent传输 setResult(200, intent); // 一定要finish(); 否则不结束当前MyActivity1,无法返回给MyActivity1 finish(); } }); } }
MyActivity2的布局文件 activity_my2.xml,主要就是一个ListView用来展示列表数据的
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="wrap_content"></ListView> </RelativeLayout>
效果: