【问题标题】:can i wait for two different results with StartActivityForResult()我可以用 StartActivityForResult() 等待两个不同的结果吗
【发布时间】:2019-03-27 09:10:59
【问题描述】:

您好,我想问一下是否可以使用StartActivityForResult() 等待 2 个不同的结果。我想要完成的是:

我有一个 ListView,当我单击一个项目时,我开始另一个活动。我有 2 个按钮。其中一种是保存列表项名称的更改,另一种是删除单击的项目。我不确定如何检测我按下了哪些按钮。

【问题讨论】:

标签: c# android xamarin startactivityforresult


【解决方案1】:

为了更清楚起见,我将调用第一个 activity(带有列表的那个)-ListActivity,以及新的 activity(带有按钮的那个)-ButtonActivity

要检测在ButtonActivity 中按下的按钮,请向类中添加一个实现,如下所示:

public class ButtonActivity extends AppCompatActivity implements View.OnClickListener

然后实现方法onClick(View v),像这样:

@Override
public void onClick(View v) {
    int id = v.getId();
    switch (id) {
        case R.id.your_save_button_id: {
            Intent data = new Intent();
            data.putExtra("item_to_save", item);
            setResult(CommonStatusCodes.SUCCESS, data);
            finish();
            break;
        }

        case R.id.your_delete_button_id: {
            Intent data = new Intent();
            data.putExtra("item_to_delete", item);
            setResult(CommonStatusCodes.SUCCESS, data);
            finish();
            break;
        }
        default: {
            break;
        }
    }

}

在你的ListActivity

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == "request_code_for_button_activity") {
        if (resultCode == CommonStatusCodes.SUCCESS) {
            if (data != null) {
                if (data.getStringExtra("item_to_delete") != null) {
                    //DELETE YOUR ITEM HERE
                } else if (data.getStringExtra("item_to_save") != null) {
                    //SAVE YOUR ITEM HERE
                }
            }
        }
    } else {
        super.onActivityResult(requestCode, resultCode, data);
    }
}

【讨论】:

    【解决方案2】:

    解决方案:

    首先,用startActivityForResult(your_intent, 1);开始你的活动

    第二,在您的下一个活动中(您有 2 个按钮):

    在保存按钮的点击监听器中,将结果代码作为“1”传递,如图所示:

    setResult(1);
    finish();
    

    在删除按钮的点击监听器中,将 resultcode 传递为“2”,如图所示:

    setResult(2);
    finish();
    

    最后,在您之前的活动/片段的onActivityResult()

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1 && resultCode == 1) {
            ....
            (Save Button Pressed)
            ....
        }
        else if (requestCode == 1 && resultCode == 2) {
            ....
            (Delete Button Pressed)
            ....
        }
    }
    

    就是这样。我自己项目中的工作示例。

    【讨论】:

    • 这和SetResult(Result.Ok, intent)SetResult(Result.Canceled, intent)一样吗?
    • 是的,但是此解决方案中没有使用意图。这个setResult(..) 是一个活动方法。 @GeorgiYakov 到目前为止,这是我看到的所有解决方案中最简单的。
    • 是的,如果您的开场活动是您自己的,则此方法有效。但是如果你打开选择图像活动,你不能设置结果代码。
    • 但是需要向主页发送一些数据,我不能没有意图。
    • @GeorgiYakov 对不起,我弄错了.. 看来你可以写意图.. SetResult(Result.Ok, intent) 对这个解决方案也是正确的.. 使用 onActivityResult() 中的数据从以前的按钮中获取结果.
    【解决方案3】:

    是的。第二个参数 REQUEST_ID 是用来告诉你是哪个请求表单。

    单击按钮 1 时,您调用

    startActivityForResult(intent, REQUEST_1)
    

    当按钮 2 被点击时,你调用

    startActivityForResult(intent, REQUEST_2)
    

    在回调中,您将其作为第一个参数:

    onActivityResult(requestCode: Int...)
    

    如果 requestCode == REQUEST_1,它来自按钮 1。

    【讨论】:

    • 问题是我从主页调用StartActivityForResult() 并选择了请求号。当我选择其中一个 to 按钮并设置结果时,它将转到相同的 requestCode
    • 回调中的请求代码仅供您在有很多请求时告诉您哪个请求,不应在其他地方使用。 startActivityForRequest (intent, R.id.button1) 和 startActivityForRequest (intent, R.id.button2),并在 onActivityResult 中检查: if (requestCode == R.id.button1) ... else ... 这清楚吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多