【问题标题】:onActivityResult() not called when Action Bar 'Up button' is clicked单击操作栏“向上按钮”时未调用 onActivityResult()
【发布时间】:2014-02-13 12:38:26
【问题描述】:

我正在尝试使用startActivityForResult(),我需要从一个片段开始一个活动,然后处理原始活动中的结果而不是启动它的片段(当返回时按下)。谁能告诉我这是否可能或我的问题是什么?

Activity_A承载Fragment_A,Fragment可以启动Activity_B。

片段_A:

   Intent intent = new Intent(mContext, Activity_B.class);
   intent.putExtra(EXTRA_CHOSEN_BUSINESS, mChosenBusiness);
   intent.putExtra(EXTRA_CHOSEN_POSITION, position);
   getActivity().startActivityForResult(intent, 1);

活动_B:

@Override
public void onBackPressed() {
    Intent intent = new Intent();
    intent.putExtra("myBoolean", wasUsingMap);
    setResult(RESULT_OK, intent);
    finish();
    super.onBackPressed();
}

活动_A:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1) {
        if(resultCode == RESULT_OK){
            mWasUsingMap = data.getBooleanExtra("myBoolean", false);
        }
    }
}

本例中的数据始终为空。

为了测试,我尝试不使用getActivity().startActivityForResult(intent, 1);,而仅使用startActivityForResult(intent, 1); 并将onActivityResult 放置在片段中(在this answer 之后的活动中调用超级onActivityResult),但数据仍然为空。如果可能的话,我无论如何都需要它在托管活动中。我也尝试了最佳答案here,但我仍然很难过..

(作为旁注,布尔值用于检测当用户按下返回时应显示哪个片段)。

【问题讨论】:

    标签: android-intent android-fragments onactivityresult


    【解决方案1】:

    我有一个类似的问题,解决方案实际上很容易实现(虽然很难找到......)

    在 FragmentA 调用中:

    startActivityForResult(intent, 1); //not getActivity().startActivityForResult(intent, 1);
    

    并覆盖 onActivityResult(在片段内)

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
    
            if (requestCode == 1) {
                if (resultCode == RESULT_OK){
                    //whatever
                }
                if (resultCode == RESULT_CANCELED) {
                    //whatever
                }
            }
        }
    

    然后,在 ActivityB 上执行以下操作:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    
        int id = item.getItemId();
        switch (id) {
            case android.R.id.home:
                Log.e("home button", "pressed");
                Intent returnIntent = new Intent();
                returnIntent.putExtra("result",mResult);
                setResult(RESULT_OK, returnIntent);
                finish();
                super.onBackPressed();
                return true;
            case R.id.others:
                //whatever
    
        }
    
        return super.onOptionsItemSelected(item);
    }
    

    【讨论】:

      【解决方案2】:
      super.onBackPressed();
      

      不应该是第一个语句,一旦被调用,方法体的其余部分就无法访问。

      编辑

      从一个片段,你应该像这样开始另一个活动:

      Intent intent = new Intent(getActivity(), Activity_B.class);
      // put data
      startActivityForResult(intent, 1);
      

      【讨论】:

      • 我发现是的,谢谢,虽然传入的数据仍然为空,但我在那行有一个断点,所以我知道它仍然是一团糟。现在会做出改变
      • 你为什么打电话给super.onActivityResult(requestCode, resultCode, data);?如果您决定自己消费 onActivityResult,则无需调用 super。
      • 编辑:抱歉,我误读了您的答案,很有趣。如果我调用 super.onBackPressed();首先它到达了语句的其余部分(它触发了一个断点),如果我最后调用它,onActivityResult 似乎根本没有被触发,所以现在我更加困惑:) 我相信超级 onActivityResult 是在那里测试其他答案 - 已删除但仍然损坏。不过谢谢,我会更新代码以反映这些重要的变化。
      • 如果你调用finish(),你不再需要调用onBackPressed。
      • 好的,我还需要一些其他行来强制将意图与数据一起发回吗?当我遇到放置 super.onBackPressed() 的断点时,下一个断点(在 onActivityResult 中)被数据击中。如果我保留代码原样但删除 super.onBackPressed() 处的断点,它不起作用 - 让我相信这是某种线程问题。如果我完全删除对 super.onBackPressed() 的调用(你是对的,这不是必需的),它也不会触发。
      【解决方案3】:

      我的问题与在操作栏中使用向上插入符号与使用后退按钮的逻辑有关。以前我在向上插入符号被击中时调用了 onBackPressed() ,但这不是必需的。

      结果相当令人困惑的是,硬件后退按钮成功返回了一个结果,其中包含上面的代码以及用户 Fremmedehenvendelser 建议的更改,但即使它也会输入 onBackPressed(),但 Up caret 却没有。

      当主插入符被击中时替换对 onBackPressed() 的调用(在 Activity_B 的父级中):

      @Override
      public boolean onOptionsItemSelected(MenuItem item) {
      
          if (mDrawerToggle.onOptionsItemSelected(item)) {
              return true;
          }
      
          if (item.getItemId() == android.R.id.home){
              onBackPressed();
          }
      
          // Handle your other action bar items...
          return super.onOptionsItemSelected(item);
      }
      

      有了这个(在 Activity_B 中)似乎对我很有效:

      @Override
      public boolean onOptionsItemSelected(MenuItem item) {
      
          if (item.getItemId() == android.R.id.home){
      
              getDrawerToggle().setDrawerIndicatorEnabled(true);
      
              Intent intent = new Intent();
              intent.putExtra("myBoolean", wasUsingMap);
              if (getParent() == null) {
                  setResult(RESULT_OK, intent);
              } else {
                  getParent().setResult(RESULT_OK, intent);
              }
      
              finish();
          }
      
          return super.onOptionsItemSelected(item);
      }
      

      有趣的是,getDrawerToggle().setDrawerIndicatorEnabled(true); 被调用似乎很重要,否则结果不会被发回(这一行也在 onBackPressed() 中)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-13
        • 1970-01-01
        相关资源
        最近更新 更多