【问题标题】:onActivityResult not called when pressed back arrow on screen but only called when back button pressed in android?onActivityResult 在屏幕上按下后退箭头时不调用,但仅在android中按下后退按钮时调用?
【发布时间】:2016-09-27 03:44:59
【问题描述】:

我有两个活动,一个是父母,一个是孩子。我在android清单中设置了孩子的父母:

<activity android:name=".SecondActivity"
            android:parentActivityName=".MainActivity"
            ></activity>

家长:

package com.kofhearts.activityresulttest;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;

public class MainActivity extends AppCompatActivity {

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

    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // Check which request we're responding to

        Log.w("result", "result");
    }

    public void handleClick(View view){


        Intent intent = new Intent(this, SecondActivity.class);
        startActivityForResult(intent, 1);


    }



}

孩子:

package com.kofhearts.activityresulttest;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

public class SecondActivity extends AppCompatActivity {

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


}

当我在 android 中按下返回按钮时,在子活动中,onActivityResult 被调用,由日志消息表示。当我按下返回箭头时,不会调用 onActivityResult。为什么会这样,我怎样才能做到,无论采用哪种方法返回,onActivityResult 都会被调用?

更新:

对不起,我不是很清楚。当我说后退箭头时,我指的是应用栏中的箭头,而不是设备后退按钮。当我们在清单文件中设置活动的父级时,应用栏中的箭头会出现。谢谢!

【问题讨论】:

  • 后退箭头是什么意思?

标签: android


【解决方案1】:

是的,它没有被调用,因为 Up 按钮已经静态地拥有 Parent Activity 的信息。所以当你按下它应该只去那个父活动。

例如,您有 A、B、C 三个活动。

    B parent Activity is C

    <activity android:name=".SecondActivity"   android:parentActivityName=".ThirdActivity"/>

    programmatically you go From  A --> B  

        Intent intent=new Intent(MainActivity.this,SecondActivity.class);
            startActivityForResult(intent,1);

现在您按下(第二个)活动 B 的向上按钮(后退箭头),那么它不应该进入任何活动。因为它很困惑。关于清单文件父 Activity 是 ThirdActivity C,但关于 Stack 父 Activity 是 A。

  1. 向上和返回按钮之间存在一些差异。

  2. Up 按钮用于根据屏幕之间的层次关系在应用内导航。

  3. 当您按下向上按钮时,它会创建父 Activity 的“新实例”(这是此处未调用 OnActivityResult() 方法的唯一原因)

  4. 但“后退”按钮用于按时间倒序浏览用户最近使用过的屏幕历史记录。(此处使用的先前实例,而不是创建新实例。这只是在 MainActivity (Parent) 中调用 OnActivityResult() 方法的原因。

  5. 向上按钮可确保用户留在您的应用程序中,返回按钮可让用户返回主屏幕,甚至返回其他应用程序(因为它根据历史记录导航)。

  6. 如果您希望向上按钮的后退按钮具有相同的行为。你应该这样写。

      @Override
          public boolean onOptionsItemSelected(MenuItem item) {
              switch (item.getItemId()){
                 case android.R.id.home:
                super.onBackPressed();
                break;
           }
          return true;
         }
    

【讨论】:

    【解决方案2】:

    如果您在谈论收费栏后退按钮,这可能会有所帮助

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            toolbar.setNavigationOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //do something you want
                    finish();
                }
            });
        }
    

    【讨论】:

      【解决方案3】:

      覆盖 onOptionsItemSelected

          @Override
          public boolean onOptionsItemSelected(MenuItem item) {
              switch (item.getItemId()) {
                  case android.R.id.home:
                      Bundle bundle = new Bundle();
                      bundle.putString(FIELD_A, "Extra data");
      
                      Intent mIntent = new Intent();
                      mIntent.putExtras(bundle);
                      setResult(RESULT_OK, mIntent);
                      finish();
                      break;
              }
              return super.onOptionsItemSelected(item);
          }
      

      【讨论】:

        【解决方案4】:

        对我来说,这里的答案都不起作用。我终于在onOptionsItemSelected(MenuItem m)中追踪到return语句的错误。

        A 是 B 的父级。当通过按工具栏的后退箭头按钮从 Activity B 转到 Activity A 时,因此调用 B 的 onOptionsItemSelected 时不会触发 A 的 onActivityResult:

            public boolean onOptionsItemSelected(MenuItem mi){  
                Switch(mi.getItemId()){
        
                    case: android.R.id.home:
        
                    Intent intent = new Intent();
                    intent.putExtras(returnBundle);
                    this.setResult(Main.Magnificent_Result, intent);
        
                    finish();
                    break;
        
        
            }  
            super.onOptionsItemSelected(mi);
        

        但这确实会触发 A 中的 onActivityResult:

                    public boolean onOptionsItemSelected(MenuItem mi){  
                        Switch(mi.getItemId()){
        
                        case R.id.android.home:
        
                        Intent intent = new Intent();
                        intent.putExtras(returnBundle);
                        this.setResult(Main.Magnificent_Result, intent);
        
                        finish();
                        return true;   /// Note return statement 
        
        
            }  
            super.onOptionsItemSelected(mi);
        

        【讨论】:

          【解决方案5】:

          当您点击返回按钮时,使用 onBackPressed() 覆盖来执行代码。

          @Override
          public void onBackPressed()
          {
               // code here to show dialog
               super.onBackPressed();  // optional depending on your needs
          }
          

          【讨论】:

          • OP 不是在询问关于 backpress 的问题,似乎他的意思是应用工具栏中的后退按钮。
          • 啊,是的,我现在看到他的更新了。感谢您的提醒。似乎其他一些人得到了适当的答案。我稍后会修改或删除它。
          【解决方案6】:

          当你做setResult(RESULT_OK, mIntent)时,你应该完成这个活动,否则onActivityResult可能不起作用。

          【讨论】:

            【解决方案7】:

            当您的 SecondActivity 退出时,将使用给定的 requestCode 调用您的 onActivityResult() 方法

            尝试在 SecondActivity 中覆盖 onBackPressed()

            @Override
            public void onBackPressed() {
                Bundle bundle = new Bundle();
                bundle.putString(FIELD_A, "Extra data");//passes extra data to MainActivity 
            
                Intent mIntent = new Intent();
                mIntent.putExtras(bundle);
                setResult(RESULT_OK, mIntent);
                super.onBackPressed();
            }
            

            【讨论】:

            • 啊,我发现我打字太慢了。 @rissmon 打败了我。这对我来说似乎是一个很好的答案。
            • OP 不是在询问关于 backpress 的问题,似乎他的意思是应用工具栏中的后退按钮。
            猜你喜欢
            • 1970-01-01
            • 2021-04-20
            • 1970-01-01
            • 2012-12-26
            • 1970-01-01
            • 2016-03-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多