今天在项目中遇到这样一个问题,我使用startActivityForResult()进行页面跳转的时候,如果在正常点击事件中可以可以返回正确的resultCode,但是在虚拟按键,onBackPressed() 的监听事件里面无法返回正确的值。一直返回的是0。
首先说下正常的显示情况:
FirstActivity的xml文件:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.practiceproject.FirstActivity"> <Button android:id="@+id/bt_next" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="点击跳转到下一个页面" /> </RelativeLayout>
FirstActivity:
package com.practiceproject; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; public class FirstActivity extends AppCompatActivity implements View.OnClickListener { /** * 点击跳转到下一个页面 */ private Button mBtNext; private int NUMBER_VALUE=10; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_first); initView(); } private void initView() { mBtNext = (Button) findViewById(R.id.bt_next); mBtNext.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { default: break; case R.id.bt_next: startActivityForResult(new Intent(FirstActivity.this, SecondActivity.class),NUMBER_VALUE); break; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Log.e("====返回的值===", "==== "+resultCode ); } }
SecondActivity的xml文件:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/bt_back" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="点击返回上一个页面" /> </RelativeLayout>
SecondActivity:
package com.practiceproject; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; public class SecondActivity extends AppCompatActivity implements View.OnClickListener { /** * 点击返回上一个页面 */ private Button mBtBack; private int BACK_VALUE=12; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); initView(); } private void initView() { mBtBack = (Button) findViewById(R.id.bt_back); mBtBack.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { default: break; case R.id.bt_back: setResult(BACK_VALUE); finish(); //点击返回 break; } } }
打印的结果:
来看一下按下虚拟键之后返回的resultCode
首先我们FirstActivity不需要任何修改,只是SecondActivity里面添加一个虚拟按键监听事件,SecondActivity的代码如下所示。
这只是一种监听方式,还有其它的监听方式。
package com.practiceproject; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; public class SecondActivity extends AppCompatActivity implements View.OnClickListener { /** * 点击返回上一个页面 */ private Button mBtBack; private int BACK_VALUE = 12; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); initView(); } private void initView() { mBtBack = (Button) findViewById(R.id.bt_back); mBtBack.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { default: break; case R.id.bt_back: setResult(BACK_VALUE); finish(); //点击返回 break; } } /** * 添加按下返回虚拟键的监听事件 */ @Override public void onBackPressed() { super.onBackPressed(); setResult(BACK_VALUE); } }
来看一下打印的结果:
我也换过返回按钮的监听,还是返回的0.
为什么会出现这种问题呢?
因为就是安卓执行onBackPressed的时候,会默认把setResult方法设置一个值,并且这个值等于0.
如何解决这个问题?
把setResult方法放到前面去就解决了这个问题。