android - 呼ばれない - startactivityforresult 引数




Androidで `startActivityForResult`を管理するには? (6)

私の活動では、 startActivityForResultによって主アクティビティから2番目のアクティビティが呼び出されていstartActivityForResult 。 私の2番目のアクティビティには、このアクティビティを終了するいくつかのメソッドがありますが(結果がないかもしれないかもしれませんが)、そのうちの1人だけが結果を返します。

たとえば、主なアクティビティから2番目のアクティビティを呼び出します。 このアクティビティでは、カメラを持っているかどうかなど、ハンドセットのいくつかの機能をチェックしています。 それがなければ私はこの活動を終了します。 また、 MediaRecorderMediaPlayer準備中に問題が発生した場合は、このアクティビティを終了します。

そのデバイスにカメラがあり、録画が完全に完了している場合、ユーザーが完了ボタンをクリックするとビデオを録画した後、結果(録画されたビデオのアドレス)がメインアクティビティに返されます。

メインアクティビティの結果を確認するにはどうすればよいですか?


主な活動からどのように結果を確認するのですか?

Activity.onActivityResult()をオーバーライドしてから、そのパラメータをチェックする必要があります。

  • requestCodeは、これらの結果を返すアプリを識別します。 これは、 startActivityForResult()を呼び出すときに定義されます。
  • resultCodeは、このアプリが成功したか、失敗したか、または何か別のものかどうかを知らせます
  • dataはこのアプリから返された情報を保持します。 これはnullかまいません。

@ Nishantの回答を補完するために、活動結果を返すための最良の方法は次のとおりです。

Intent returnIntent = getIntent();
returnIntent.putExtra("result",result);
setResult(RESULT_OK,returnIntent);
finish();

私は問題を抱えていた

new Intent();

それから、正しい方法で

getIntent();

現在の意図を得る


onActivityResult間違ったrequestCodeに問題がある人

あなたのFragmentからstartActivityForResult()を呼び出す場合は、そのフラグメントを所有するアクティビティによってrequestCodeが変更されます。

あなたのアクティビティで正しいresultCodeを取得したい場合は、これを試してください:

変化する:

startActivityForResult(intent, 1); に:

getActivity().startActivityForResult(intent, 1);


全体のプロセスをコンテキストで見るには、補足的な答えがあります。 詳細は私の完全な答えを見てください。

MainActivity.java

public class MainActivity extends AppCompatActivity {

    // Add a different request code for every activity you are starting from here
    private static final int SECOND_ACTIVITY_REQUEST_CODE = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    // "Go to Second Activity" button click
    public void onButtonClick(View view) {

        // Start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        startActivityForResult(intent, SECOND_ACTIVITY_REQUEST_CODE);
    }

    // This method is called when the second activity finishes
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // check that it is the SecondActivity with an OK result
        if (requestCode == SECOND_ACTIVITY_REQUEST_CODE) {
            if (resultCode == RESULT_OK) { // Activity.RESULT_OK

                // get String data from Intent
                String returnString = data.getStringExtra("keyName");

                // set text view with string
                TextView textView = (TextView) findViewById(R.id.textView);
                textView.setText(returnString);
            }
        }
    }
}

SecondActivity.java

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
    }

    // "Send text back" button click
    public void onButtonClick(View view) {

        // get the text from the EditText
        EditText editText = (EditText) findViewById(R.id.editText);
        String stringToPassBack = editText.getText().toString();

        // put the String to pass back into an Intent and close this activity
        Intent intent = new Intent();
        intent.putExtra("keyName", stringToPassBack);
        setResult(RESULT_OK, intent);
        finish();
    }
}

アンドロイドでよくある問題
それは3つの部分に分解することができます
1)アクティビティBを開始する(アクティビティAで発生する)
2)要求されたデータを設定する(活動Bで起こる)
3)要求されたデータを受信する(アクティビティAで起こる)

1)startActivity B

Intent i = new Intent(A.this, B.class);
startActivity(i);

2)要求されたデータを設定する

この部分では、特定のイベントが発生したときにデータを返信するかどうかを決定します。
例:アクティビティBには、EditTextと2つのボタンb1、b2があります。
ボタンb1をクリックすると、アクティビティAにデータが戻されます。
ボタンb2をクリックしてもデータは送信されません。

データの送信

b1......clickListener
{
   Intent resultIntent = new Intent();
   resultIntent.putExtra("Your_key","Your_value");
   setResult(RES_CODE_A,resultIntent);
   finish();
}

データを送信しない

b2......clickListener
    {
       setResult(RES_CODE_B,new Intent());
       finish();
    }

ユーザーが戻るボタンをクリックする
デフォルトでは、結果はActivity.RESULT_CANCEL応答コードで設定されます

3)検索結果

そのオーバーライドonActivityResultメソッド

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if (resultCode == RES_CODE_A) {

     // b1 was clicked 
   String x = data.getStringExtra("RES_CODE_A");

}
else if(resultCode == RES_CODE_B){

   // b2 was clicked

}
else{
   // back button clicked 
}
}

ユーザーインターフェイスをアクティビティー結果で更新したい場合は、 this.runOnUiThread(new Runnable() {}を使用することはできませんthis.runOnUiThread(new Runnable() {}これを行うと、UIは新しい値で更新されず、代わりに次のようになります。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == RESULT_CANCELED) {
        return;
    }

    global_lat = data.getDoubleExtra("LATITUDE", 0);
    global_lng = data.getDoubleExtra("LONGITUDE", 0);
    new_latlng = true;
}

@Override
protected void onResume() {
    super.onResume();

    if(new_latlng)
    {
        PhysicalTagProperties.this.setLocation(global_lat, global_lng);
        new_latlng=false;
    }
}

これは愚かだが、かなりうまくいく。





startactivityforresult