onActivityResult在屏幕上按下后退箭头时没有调用,但只在android中按下后退按钮时调用?

时间:2016-09-27 03:45:00

标签: android

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

<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

更新:

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

7 个答案:

答案 0 :(得分:3)

是的,因为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的向上按钮(向后箭头),然后它不应该转到任何活动。因为它很困惑。关于清单文件父活动是ThirdActivity C,但关于Stack父活动是A。

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

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

  3. 当您按下向上按钮时,它会创建&#34;新实例&#34;父活动(仅此处未调用OnActivityResult()方法的原因)

  4. 但是Back按钮用于按照时间顺序反向导航用户最近使用过的屏幕历史。(此处使用的上一个实例,而不是创建新实例。这只是在MainActivity(Parent)中调用OnActivityResult()方法的原因。)

  5. “向上”按钮可确保用户保留在您的应用中,“后退”按钮可以将用户返回到主屏幕,甚至可以返回到其他应用(因为它会根据历史记录进行导航)。

  6. 如果您想要向上按钮的相同行为,请按向上按钮。你应该这样写。

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

答案 1 :(得分:1)

覆盖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);
    }

答案 2 :(得分:1)

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

 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 :(得分:0)

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

进行调用

尝试覆盖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();
}

答案 4 :(得分:0)

使用onBackPressed()重写可以在按下后退按钮时执行代码。

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

答案 5 :(得分:0)

执行setResult(RESULT_OK, mIntent)后,您应该完成此活动,否则onActivityResult可能无效。

答案 6 :(得分:0)

对我来说,这里的答案都没有奏效。我最终将错误跟踪到onOptionsItemSelected(MenuItem m)中的return语句。

A是B的父级。当按下工具栏的后退箭头按钮从活动B进入活动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);

但是这个DOES会触发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);