简体   繁体   English

返回活动发送结果的活动返回时,startActivityForResult返回null

[英]startActivityForResult returning null when back navigation to activity sending result returns

I have 3 activities that start in a sequence.With the first activity needing a result from the last activity. 我有3个活动按顺序开始,第一个活动需要最后一个活动的结果。

I have it so that if Activity B is started for result (By activity A) then Activity B starts activity C for result. 我知道,如果活动B为结果而启动(按活动A),那么活动B就为结果启动了活动C。 Then once the result is captured at activity C it is finished which calls Activity B's onActivityResult which sets the result and finishes and Activity A's onActivityResult gets the final result. 然后,一旦在活动C处捕获了结果,就完成了,它调用活动B的onActivityResult来设置结果并完成,活动A的onActivityResult得到最终结果。

Activity A starts Activity B for a result which Activity C contains thus the sequence is like so 活动A启动活动B以获得活动C包含的结果,因此序列类似于

A->B->C (get result) C->B->A (result retrieved) A-> B-> C(获取结果)C-> B-> A(检索结果)

This works just fine if everything happens in sequence. 如果一切都按顺序进行,那么这很好。 However, If I navigate to activity C then press the toolbars back arrow and which leads me to activity B then navigate back to activity C and select the result. 但是,如果我导航到活动C,则按工具栏的后退箭头,然后将我带到活动B,然后导航回活动C,然后选择结果。 The result returned to activity A is null. 返回活动A的结果为空。

A->B->C->B->C(get result) C->B->A (result == null) A-> B-> C-> B-> C(获取结果)C-> B-> A(结果==空)

Activity A 活动A

public class AlertCreationActivity extends AppCombatActivity {

   // OnCreate methods left out to shorten code

    @OnClick(R.id.locationButton)
    public void locationButtonClicked() {
        Intent intent = new Intent(this, StateActivity.class);
        intent.putExtra(StateActivity.IS_STARTED_FOR_RESULT, StateActivity.STARTED_FOR_RESULT);
        startActivityForResult(intent, ALERT_CREATION_REQUEST_CODE);
    }

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

        if (requestCode == ALERT_CREATION_REQUEST_CODE && resultCode == RESULT_OK) {
            String title = data.getStringExtra(ALERT_CREATION_REQUEST_DATA);
            if ( ! title.isEmpty()) {
                mLocationButton.setVisibility(View.INVISIBLE);
                mLocationTextView.setText(title);
                mLocationTextView.setVisibility(View.VISIBLE);
            }
        }
    }
}

Activity B 活动B

public class StateActivity extends AppCompatActivity {
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == AlertCreationActivity.ALERT_CREATION_REQUEST_CODE) {
            Intent intent = new Intent();
            intent.putExtra(AlertCreationActivity.ALERT_CREATION_REQUEST_DATA, data.getStringExtra(AlertCreationActivity.ALERT_CREATION_REQUEST_DATA));
            setResult(RESULT_OK, intent);
            finish();
        }
    }
}

Activity B's adapter is where the next intent happens 活动B的适配器是发生下一个意图的地方

public class StateAdapter extends RecyclerView.Adapter<StateAdapter.StateViewHolder>  {

    // Other Adapter methods not shown

    public class StateViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        // Other View Holder methods not shown

        @Override
        public void onClick(View v) {
            State selectedState = getStateBy(mLocationLabel.getText().toString());

            // Save state ID
            LocationStorage storage = new LocationStorage(mActivity);
            storage.setSelectedStateId(selectedState.getId());
            storage.setSelectedStateName(selectedState.getName());

            Intent intent = new Intent(mActivity, SpotActivity.class);
            mActivity.startActivityForResult(intent, AlertCreationActivity.ALERT_CREATION_REQUEST_CODE);               

        }
    }
}

Activity C 活动C

public class SpotActivity extends AppCompatActivity {
     @Override
     protected void onCreate(Bundle savedInstanceState) {

         // Initialize actionbar and recyclerview adapter

         // a click on a recyclerview's list item triggers this method
         adapter.setSurfSpotSelectedListener(new SurfSpotSelectedListener() {
            @Override
            public void onSpotSelected(String spotName) {               
                Intent intent = new Intent();
                intent.putExtra(AlertCreationActivity.ALERT_CREATION_REQUEST_DATA, spotName);
                setResult(RESULT_OK, intent);
                finish();
            }
        });
     }
}

导航回activity C是什么意思?如果不启动C,则使用startActivityForResult启动B。

You should set your result by overriding OnBackPressed(), for example: 您应该通过覆盖OnBackPressed()来设置结果,例如:

    @Override
public void onBackPressed() {
    setResult(111, new Intent().putExtra("result", "from c"));
    super.onBackPressed();
}

For Actionbar, you should overriding onOptionsItemSelected(MenuItem item) 对于操作栏,您应该覆盖onOptionsItemSelected(MenuItem item)

 @Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        //here
        setResult(111, new Intent().putExtra("result", "from c"));
        this.finish();
    default:
        return super.onOptionsItemSelected(item);
    }
}

I ended up solving it by setting the setNavigationOnClickListener for the toolbar in Acitvity B andActivity C and calling onBackPressed() to mimic back navigation. 我最终通过为Acitvity B和Activity C中的工具栏设置setNavigationOnClickListener并调用onBackPressed()来模拟向后导航来解决了该问题。 Thanks for all your help Tiny Sunlight and Good Try. 感谢您的所有帮助Tiny Sunlight和Good Try。 Here is my Activity B & C. I hope this helps others. 这是我的活动B和C。希望这对其他人有帮助。

Activity B 活动B

public class StateActivity extends AppCompatActivity {

    @Bind(R.id.toolBar) Toolbar mToolbar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_spot_selection);
        ButterKnife.bind(this);

        setSupportActionBar(mToolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
            }
        });

        // Recyclerview and Adapter left out for brevity

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == AlertCreationActivity.ALERT_CREATION_REQUEST_CODE) {
            Intent intent = new Intent();
            intent.putExtra(AlertCreationActivity.ALERT_CREATION_REQUEST_DATA, data.getStringExtra(AlertCreationActivity.ALERT_CREATION_REQUEST_DATA));
            setResult(RESULT_OK, intent);
            finish();
        }
    }
}

Activity C 活动C

public class SpotActivity extends AppCompatActivity {

    @Bind(R.id.toolBar) Toolbar mToolbar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_spot_selection);
        ButterKnife.bind(this);

        setSupportActionBar(mToolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
            }
        });     

    // Setting up Recyclerview and Adapter omitted

        adapter.setSurfSpotSelectedListener(new SurfSpotSelectedListener() {
            @Override
            public void onSpotSelected(String spotName) {
                Intent intent = new Intent();
                intent.putExtra(AlertCreationActivity.ALERT_CREATION_REQUEST_DATA, spotName);
                setResult(RESULT_OK, intent);
                finish();
            }
        });
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM