寫了2個Activity,A、B,2個Activity之間可以相互跳轉。
1、A中有一個發送按鈕可實現傳值到B中,同時還有一個獨立的跳轉按鈕。
2、在B中有接收A傳值過來的的代碼
3、執行中,如果直接執行了跳轉按鈕,B的接收Intent代碼中,就會出現空指針異常,目前通過 try{}catch臨時確保能正常運行。
想請問:能否有方法可以讓B接收傳值的代碼能夠識別那個Intent才是傳值過來的,避免空指針異常出現。
A傳值代碼如下:
/*
* 1、獲取到界面中輸入的信息
* 2、將獲取到的值,傳遞到ReceiveActivity中。
* */
Button _OkSend = (Button)findViewById(R.id.buttonOkSend);
_OkSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText editText1 = (EditText)findViewById(R.id.editText);
name=editText1.getText().toString();
Log.i("YuryLog","SendActivity name: "+name);
EditText editText2 = (EditText)findViewById(R.id.editText2);
eatSomething = editText2.getText().toString();
Log.i("YuryLog","SendActivity eatSomething: "+eatSomething);
EditText editText3 = (EditText)findViewById(R.id.editText3);
copies = editText3.getText().toString();
Log.i("YuryLog","SendActivity copies: "+copies);
// 將值傳遞到ReceiveActivity中
Intent _intent = new Intent(SendActivity.this, ReceiveActivity.class) ;
_intent.putExtra("sendName",name);
_intent.putExtra("sendeatSomething",eatSomething);
_intent.putExtra("sendcopies",copies);
startActivity(_intent);
}
});
B接收代碼如下:
// 接收SendActivity中傳遞過來的值;
// 需要確定,只有SendActivity中傳遞過來的值才能觸發,否則第一次執行的時候會出現空指針異常;
try {
Intent _getIntent = this.getIntent();
if( _getIntent.getExtras().getString("sendName") != null){
Log.i("YuryLog","理論上只有點了確認鍵才執行");
receiveName = _getIntent.getExtras().getString("sendName");
receiveEatSomething = _getIntent.getExtras().getString("sendeatSomething");
receiveCopies = _getIntent.getExtras().getString("sendcopies");
Log.i("YuryLog",receiveName + receiveEatSomething + receiveCopies);
// 在界面中顯示接收到的值
// 獲取到TextView的id,再動態的更改它的值
TextView _textView =(TextView) findViewById(R.id.textView4);
TextView _textView2 =(TextView) findViewById(R.id.textView5);
_textView.setText(receiveName+": ");
_textView2.setText("來" + receiveCopies + "份" + receiveEatSomething);
}
}catch (Exception e){
e.printStackTrace();
}
萬分感謝各位能提供一個思路,謝謝。
首先,盡量不要用try{}catch去捕捉能用判斷規避的異常,那樣會影響效率,每次出現異常,虛擬機要抓錯誤調用堆棧。所以,最好的方式是通過判斷去規避。
按你的思路,可以先判斷getIntent.getExtras()是否為null。
Intent _getIntent = this.getIntent();
if( _getIntent.getExtras() != null){
Log.i("YuryLog","理論上只有點了確認鍵才執行");
receiveName = _getIntent.getExtras().getString("sendName");
receiveEatSomething = _getIntent.getExtras().getString("sendeatSomething");
receiveCopies = _getIntent.getExtras().getString("sendcopies");
......
要指出的是,上述代碼,最好使用getXXXExtra這類方法,它不會出現空指針(除了少數幾個,比方說getStringExtra)。
需要設定默認值的,在沒有值時它會返回默認值;沒有設置默認值的,在沒有值時會返回null,針對這類判空一下。
可以看下getBooleanExtra的源碼:
public boolean getBooleanExtra(String name, boolean defaultValue) {
return mExtras == null ? defaultValue :
mExtras.getBoolean(name, defaultValue);
}
而getExtras()在沒有值時會返回null,看下源碼:
public Bundle getExtras() {
return (mExtras != null)
? new Bundle(mExtras)
: null;
}
所以,最好不要用getIntent().getExtras()這種方式,換用getIntent().getXXXExtras(),這樣針對有設置默認值的就不需要判空了。
activity之間傳值,是沒有機制可以確定哪個activity傳過來的。這是考慮到代碼的可擴展性,解耦。要確定哪個activity發過來,在intent創建那裡多傳個布爾值就行,比方說下面的代碼。
發送
intent.putExtra("fromXXActivity", true);
接收
if (getIntent().getBooleanExtra("fromXXActivity", false)) {
......
// 這裡,你就可以安全的接收那個activity發過來的所有值。
}