startActivity ForResult複数のActivity間で値を渡す際の注意すべき使い方
10134 ワード
例を挙げるともっとわかります.
1.Activityで新しく開いたActivityが閉じて戻ってきたデータを取得する
package com.google_acmer.activitys;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
private final static String TAG="MainActivity";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnOpen=(Button)this.findViewById(R.id.btnOpen);
btnOpen.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
// Activity
// ,
startActivityForResult(new Intent(MainActivity.this, OtherActivity.class), 1);
}
});
}
/**
* , Activity ( MainActivity ) onActivityResult
*
* requestCode , startActivityForResult()
* resultCode , Activity
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
String result = data.getExtras().getString("result");// Activity
Log.i(TAG, result);
}
}
2.新しいActivityが閉じる前に前のActivityにデータを返す必要がある
package com.google_acmer.activitys;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class OtherActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.other);
Button btnClose=(Button)findViewById(R.id.btnClose);
btnClose.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
// Intent
Intent intent = new Intent();
// Intent
intent.putExtra("result", "My name is gu");
//
OtherActivity.this.setResult(RESULT_OK, intent);
// Activity
OtherActivity.this.finish();
}
});
}
}//setResult()
リクエストコードの役割
startActivity ForResult(Intent intent,int requestCode)メソッドを使用して新しいActivityを開き、startActivity ForResult()メソッドにリクエストコード(2番目のパラメータ)を入力する必要があります.要求コードの値は、業務の必要に応じて自己設定され、要求ソースを識別するために使用される.たとえば、1つのActivityには2つのボタンがあり、この2つのボタンをクリックすると同じActivityが開きます.そのボタンが新しいActivityを開いても、この新しいActivityがオフになると、前のActivityのonActivity Result(int requestCode,int resultCode,Intent data)メソッドが呼び出されます.onActivity Result()メソッドでは、新しいActivityがそのボタンで開いていることを知り、対応するビジネス処理を行う必要がある場合は、次のようにします.
@Override public void onCreate(Bundle savedInstanceState) {
....
button1.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 1);
}
});
button2.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 2);
}
});
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(requestCode){
case 1:
// 1 ,
case 2:
// 2 ,
}
}
}
結果コードの役割
1つのActivityでは、startActivity ForResult()メソッドを使用して複数の異なるActivityを開いて異なるビジネスを処理する場合があります.これらの新しいActivityがオフになると、前のActivityのonActivity Result(int requestCode,int resultCode,Intent data)メソッドが呼び出されます.返されたデータがどの新しいActivityから来たかを知るには、onActivity Result()メソッドで次のようにします(ResultActivityとNewActivityは開く新しいActivityです):
public class ResultActivity extends Activity {
.....
ResultActivity.this.setResult(1, intent);
ResultActivity.this.finish();
}
public class NewActivity extends Activity {
......
NewActivity.this.setResult(2, intent);
NewActivity.this.finish();
}
public class MainActivity extends Activity { // Activity ResultActivity NewActivity
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(resultCode){
case 1:
// ResultActivity
case 2:
// NewActivity
}
}
}
startActivity ForResultを呼び出すとonActivity Resultがすぐに応答し、現在のページに戻るとonActivity Resultが応答しない問題について
私は長い間この問題に悩まされていたが、2回目はlaunchModeに植えられた......最後についに実験を通じてこの問題の所在を発見した!2つのケースがあります.1つ目はresultCode=0の場合、ActivityのlaunchModeを「singleTask」またはsingleInstanceに設定する必要があります.そうしないとエラーが発生します.これは、Taskの観点から見ると、Androidは異なるTask間のActivityではデータを伝達できないと考えているため、NEW_TASK IDですが、forResultメソッドを呼び出します.
2つ目:resultCode!=0の場合、ActivityのlaunchModeはstandardでなければなりません(launchMode属性を削除するとデフォルトではstandardモードになります).理由は同じです.