Activity A -----值-------> Activity B -----值-----> Activity A
場景:當A跳轉到B,再從B直接點擊返回按鈕時,報錯。
package com.itheima.smsSender; import android.os.Bundle; import android.telephony.gsm.SmsManager; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.app.Activity; import android.content.Intent; /** * * 短信發送器: 三個界面 --- 三個Activity --- listview * */ public class MainActivity extends Activity implements OnClickListener { private EditText et_number; private EditText et_content; private Button bt_select; private Button bt_sendSms; private Button bt_quickReply; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 獲取控件 et_number = (EditText) findViewById(R.id.et_number); et_content = (EditText) findViewById(R.id.et_content); bt_select = (Button) findViewById(R.id.bt_select); bt_sendSms = (Button) findViewById(R.id.bt_sendSms); bt_quickReply = (Button) findViewById(R.id.bt_quickReply); // 添加點擊事件 bt_select.setOnClickListener(this); bt_sendSms.setOnClickListener(this); bt_quickReply.setOnClickListener(this); } @SuppressWarnings("deprecation") @Override public void onClick(View v) { // TODO Auto-generated method stub int id = v.getId(); switch (id) { case R.id.bt_select: Intent contact_intent = new Intent(getApplicationContext(), ContactActivity.class); startActivityForResult(contact_intent, 7); break; case R.id.bt_sendSms: SmsManager manager = SmsManager.getDefault(); String destinationAddress = et_number.getText().toString().trim(); String data = et_content.getText().toString().trim(); manager.sendTextMessage(destinationAddress , null, data , null, null); break; case R.id.bt_quickReply: Intent quick_intent = new Intent(getApplicationContext(), QuickReplyActivity.class); startActivityForResult(quick_intent, 8); break; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case 7: String number = data.getStringExtra("number"); et_number.setText(number); break; case 8: String sms = data.getStringExtra("quickInfo"); et_content.setText(3); break; } } }
錯誤信息:
MainActivity程序73行報空指針異常。
String number = data.getStringExtra("number");
錯誤分析:
package com.itheima.smsSender; import java.util.ArrayList; import com.itheima.smsSender.adapter.MyAdapter; import com.itheima.smsSender.bean.Person; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; public class ContactActivity extends Activity { ArrayList<Person> persons = new ArrayList<Person>(); @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); //加載布局文件 setContentView(R.layout.activity_contact); //初始化數據 --- 改進用內容提供者獲取聯系人 for(int i=0;i<30;i++){ Person person = new Person("person"+i,"1854678925"+i); persons.add(person); } //獲取控件 ListView lv_contact = (ListView) findViewById(R.id.lv_contact); //添加適配器 lv_contact.setAdapter(new MyAdapter(persons,this)); //為適配器添加點擊事件 lv_contact.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // TODO Auto-generated method stub Intent intent = new Intent(); intent.putExtra("number", persons.get(position).phone); setResult(1, intent); finish(); } }); } }
當B直接點擊返回鍵返回到A時,未走上面34行的點擊事假,所以返回的Intent為初始值null,所以在走MainActivity的73行代碼回報空指針異常。requestCode一開始就被復制了,所以一定會匹配case。 解決辦法:
方法①:
protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); if (data == null) { //判斷數據是否為空,就可以解決這個問題 return; } else { switch (requestCode) { case 7: String number = data.getStringExtra("number"); et_number.setText(number); break; case 8: String sms = data.getStringExtra("quickInfo"); et_content.setText(3); break; } } }
方法②:由於沒有走點擊事件里的代碼,所以resultCode沒有被賦值,仍然為初始值0,所以不會走case:1或case:3,就不會報錯了。
protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); switch (resultCode) { case 1: String number = data.getStringExtra("number"); et_number.setText(number); break; case 3: String sms = data.getStringExtra("quickInfo"); et_content.setText(3); break; } } }