【问题标题】:Android getting RESULT_CANCELED when I specifically add RESULT_OK当我专门添加 RESULT_OK 时,Android 得到了 RESULT_CANCELED
【发布时间】:2016-02-06 22:07:31
【问题描述】:

这是我的问题,我的主视图只显示一个按钮,按下此按钮会显示另一个视图。此视图只有另一个按钮,当按下此按钮时,当前视图结束,控件返回上一个视图。

为了显示我使用 startActivityForResult 的第二个视图,我将代码放在这里。

private void startNewview() {       
    Intent it = new Intent(getApplicationContext(), newView.class);
    startActivityForResult(it,VIEW_ID);

}

调用的视图只有一个按钮事件,代码如下

Button b = (Button) findViewById(R.id.close);
    b.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            setResult(RESULT_OK);               
            finish();

        }
    });

最后是主视图中的onActivityResult方法,这里是代码

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == VIEW_ID && resultCode == RESULT_OK) {
        tv = (TextView) findViewById(R.id.tv);
        tv.setText("The result ok is  here :)");
    }

}

问题是 resultCode 总是 0 = RESULT_CANCELED 我不知道如何解决,谁能帮帮我?

非常感谢!

【问题讨论】:

标签: android


【解决方案1】:

这里,

@Override
public void onBackPressed() {
    setResult(Activity.RESULT_OK);
    finish();
}

确实可以通过按 BACK 按钮返回(RESULT_OK)。不要打电话

super.onBackPressed().

【讨论】:

    【解决方案2】:

    我无法解释您的代码中发生了什么,但我有一个项目示例可以执行此操作..

    只有一个按钮 btnFoo 的 FooActivity:

    @Override
    protected void onStart() {
        super.onStart();
    
        btnFoo.setOnClickListener( new View.OnClickListener() {
    
            @Override
            public void onClick(View v) {
                startActivityForResult(new Intent("xper.activity.ACTIVITY_BAR_INTENT"),1);
            }
        });
    }
    

    并且像这样在 AndroidManifest.xml 中添加了一个 BarActivity:

    <activity
        android:name = "BarActivity">
        <intent-filter>
            <action
                android:name = "xper.activity.ACTIVITY_BAR_INTENT"/>
            <category
                android:name = "android.intent.category.DEFAULT"/>
        </intent-filter>
    </activity>
    

    获取bar内intent的相应代码在btnBar(Button)的onClicEvent中:

    @Override
    protected void onStart() {
        super.onStart();
    
        btnBar.setOnClickListener( new View.OnClickListener() {
    
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("xper.activity.ACTIVITY_BAR_RESULT_INTENT");
                intent.putExtra("codBar", "bar");
                setResult(Activity.RESULT_OK, intent);
                finish();
    
            }
        });
    }
    

    现在,如果你没有很好地处理 onActivityResult() 事件,当你按下 Android 按钮“BACK”时,你会得到错误。

    如果Activity B中的Intent(意图)是给Activity A一些信息,如果你按下按钮返回,我不知道Activity B是否会入栈,但意图是'完成了。所以我做了以下事情:

    @Override
    public void onBackPressed() {
        // TODO Auto-generated method stub
        super.onBackPressed();
    
        //Intent intent = new Intent("xper.activity.ACTIVITY_BAR_RESULT_INTENT");
        //intent.putExtra("codBar", "bar");
        //setResult(Activity.RESULT_CANCELED, intent);
        setResult(Activity.RESULT_CANCELED);
        finish();
    }
    

    处理信息我在事件onActivityResult()中做了如下操作,在Bar Activity中查看检索到的信息:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(data != null) {
            Toast.makeText(this, "BAR\trequestCode == " + requestCode + "\tresultCode  == " + resultCode + "\tdata == " + data, 10000).show();
            btnFoo.setText("BAR\trequestCode == " + requestCode + "\tresultCode  == " + resultCode + "\tdata == " + data /*+ "extras == " + data.getExtras().getString("codBar")*/);
        } else {
            Toast.makeText(this, "BAR\trequestCode == " + requestCode + "\tresultCode  == " + resultCode, 10000).show();
            btnFoo.setText("BAR\trequestCode == " + requestCode + "\tresultCode  == " + resultCode);
        }
    
    }
    

    如果您有更多活动将信息返回给父活动,请执行以下操作:

    //put private static final int globals atributes with the respective name of the
    //activity to represent the requestCode for each activity you have like:
    private static final int ACTIVITY1 = 117;
    private static final int ACTIVITY2 = 118;
    ...
    private static final int ACTIVITYN = 215;
    
    //In the event onActivityResult() is better use the switch statement to handle each
    //specific activity to catch information
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        if(resultCode == Activity.RESULT_CANCELED) return; // breaks
        //if you decide to handle some information of Activity.RESULT_CANCELED
        //ignore the above condition that returns and handle it inside the switch statement
    
        switch(requestCode) {
        case ACTIVITY1:
        {
            //Dosomething
        } break;
        case ACTIVITY2:
        {
            //Dosomething
        } break;
        ...
        case ACTIVITYN:
        {
            //Dosomething
        } break;
        }
    }
    

    如果您无法执行此示例代码.. 请给我您的电子邮件,让我发送 FooBarActivity 项目

    【讨论】:

    • 实际上你的“onBackPressed()”在这里不起作用,除非我删除(不必要的)super.OnBackPressed()。
    • new Intent("xper.activity.ACTIVITY_BAR_INTENT"),1) 不匹配任何构造函数
    • 自此示例代码以来,API 似乎发生了很大变化(我相信我使用了 API v2.x)。我不再编写 Android 代码来更新此示例,但它运行良好。 @ChVas,检查您是否在 AndroidManifest.xml 中正确映射了操作 android:name = "xper.activity.ACTIVITY_BAR_INTENT"
    【解决方案3】:

    使用这个

      Intent returnIntent = new Intent();
      setResult(RESULT_OK,returnIntent); 
    

    而不是

    setResult(RESULT_OK);
    

    只有

    【讨论】:

    • 我已经尝试过该解决方案但不起作用,我得到了相同的结果:S
    • 你在setResult之后使用finish()吗
    猜你喜欢
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 2012-10-11
    • 2014-08-10
    • 2014-11-08
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    相关资源
    最近更新 更多