Android:startActivityForResult&;视图类和活动类的setResult

Android:startActivityForResult&;视图类和活动类的setResult,android,android-intent,view,android-activity,Android,Android Intent,View,Android Activity,我很困惑,不知道如何使用startActivityResults和setResults从以前的活动中获取数据。我有一个视图类和一个活动类 基本上,在我的视图类中,我有这个对话框,它将实际启动名为colorActivity类的活动类。当用户选择yes时,它也会将所选圆的名称传递给colorActivity类。在colorActivity类中,允许用户输入特定圆的颜色代码,我希望将颜色代码传递回view类。使用startActivityForResult和setResult方法将值从活动传回视图时遇

我很困惑,不知道如何使用startActivityResults和setResults从以前的活动中获取数据。我有一个视图类和一个活动类

基本上,在我的视图类中,我有这个对话框,它将实际启动名为colorActivity类的活动类。当用户选择yes时,它也会将所选圆的名称传递给colorActivity类。在colorActivity类中,允许用户输入特定圆的颜色代码,我希望将颜色代码传递回view类。使用startActivityForResult和setResult方法将值从活动传回视图时遇到问题。另外,之后如何利用提取的数据

我的代码如下所示

我的视图类中的Ontouchevent代码:

            @Override
            public boolean onTouchEvent(MotionEvent event) {

                x = event.getX();
                y = event.getY();


                switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:


                    for (int i = 0; i < circles.size(); i++) {


                        if (circles.get(i).contains(x, y)) {
                            circleID = i;

            Handler handler = new Handler();
                                handler.postDelayed(new Runnable() {
                                    @Override
                                    public void run() {
                                        AlertDialog.Builder builder = new Builder(
                                                getContext());
                                        final EditText text = new EditText(getContext());

                                        builder.setTitle("Adding colors to circles").setMessage(
                                                "Proceed to Enter color");
                                        builder.setPositiveButton("Yes",
                                                new DialogInterface.OnClickListener() {

                                                    public void onClick(DialogInterface di,
                                                            int i) {

                                                        Intent intent = new Intent(
                                                                getContext(),
                                                                colorActivity.class);

                                                         intent.putExtra("circlename", circleNameList.get(circleID));


    startActivityForResults(intent, 1); // error incurred here : The method startActivityForResult(Intent, int) is undefined for the type new DialogInterface.OnClickListener(){}
                                                    }

                                                });
                                        builder.setNegativeButton("No",
                                                new DialogInterface.OnClickListener() {

                                                    public void onClick(DialogInterface di,
                                                            int i) {
                                                    }

                                                });

                                        builder.create().show();
                                    }
                                }, 3000);
    break;

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 1) { // Please, use a final int instead of hardcoded
                                // int value
            if (resultCode == RESULT_OK) {
                 ccode = (String) data.getExtras().getString("colorcode");
        }

        }
    }

public static String getColorCode() {
        return ccode;
    }
试用

ActivityName.this.startActivityForResult(intent,int)
哦,还有一件小事,在你使用的代码中

startActivityForResults(intent,int)…将其替换为


startActivityForResult(intent,int)

更正其他代码以便运行程序后,您可以通过以下方式从“活动”
colorActivity
检索参数:

步骤1:从colorActivity返回一些值 步骤2:从主活动收集数据 重写onActivityResult(…)

参考资料


STARTACTIVITYFORRESULT现在已被弃用

除此之外,推荐的解决方案是使用

您可以使用以下代码,这些代码是用Kotlin语言编写的:

  • 创建结果启动程序:

     private var resultLauncher =
     registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
         if (result.resultCode == Activity.RESULT_OK) {
             val data: Intent? = result.data
             if (null != data && data.getBooleanExtra("REFRESH_PAGE", false)) {
                 //do your code here
             }
         }
     }
    
  • 使用上述结果启动器启动活动:

         val intent = Intent(this, XYZActivity::class.java)
         resultLauncher.launch(intent)
    
  • XYZActivity
    by返回结果

         val resultIntent = Intent()
         resultIntent.putExtra("REFRESH_PAGE", true)
         setResult(Activity.RESULT_OK, resultIntent)
         finish()
    

  • 你说:“这里发生的错误:”。。。在OnTouchEvent中,仍然会给你那个错误吗?或者正确启动了意图(活动colorActivity已打开)?@donnadulcinea错误表示类型new DialogInterface的方法startActivityForResult(Intent,int)未定义。OnClickListener(){}。。。我无法运行该程序,因为存在此错误。首先,尝试在调用中用getApplicationContext()替换getContext()(代码中没有报告)。然后,如果它起作用,我将帮助您取回结果。@donnadulcinea我已尝试用getApplicationContext()替换getContext(),但我也遇到了一个错误。错误表示“如果我使用startActivity,则类型new DialogInterface.OnClickListener(){}@donnadulcinea的getApplicationContext()方法未定义。”(intent,colorActivity可以成功启动。ActivityName引用了我的视图类?我已试用了colorActivity中的代码,但似乎使用setResult(Activity.RESULT\u OK,resultIntent)未传递该值);调试之后,我从onActivityResult获得的值为null。我已经更新了上面的代码,请注意以下几件事:(i)onActivityResult必须在MainActivity中重写,(ii)requestCode在request和answer中必须相同(在您的示例中为=1),(iii)将“参数名称”替换为您的值es.“circlename”.让我知道。我仍然得到空值:(我可以使用get方法来获取值,以便在我的视图类中使用它,对吗?我正在尝试我为您编写的代码,它可以工作。您可以尝试使用我链接的一些示例,然后替换您的代码来传递形状信息吗?在这一点上应该更容易。嗯,这很奇怪。但我也有一些似乎有效的经验对于每个人,而不是我(见我的问题)。如果你想分享你的完整项目粘贴到某个地方,我可以给它看一看,并帮助你。
     private var resultLauncher =
     registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
         if (result.resultCode == Activity.RESULT_OK) {
             val data: Intent? = result.data
             if (null != data && data.getBooleanExtra("REFRESH_PAGE", false)) {
                 //do your code here
             }
         }
     }
    
         val intent = Intent(this, XYZActivity::class.java)
         resultLauncher.launch(intent)
    
         val resultIntent = Intent()
         resultIntent.putExtra("REFRESH_PAGE", true)
         setResult(Activity.RESULT_OK, resultIntent)
         finish()