【问题标题】:Android: startActivityForResult & setResult for a view class and an activity classAndroid:视图类和活动类的 startActivityForResult & setResult
【发布时间】:2014-03-21 08:27:47
【问题描述】:

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

基本上,在我的视图类中,我有这个对话框,它实际上会启动名为 colorActivity 类的活动类。当用户选择是时,它也会将所选圆圈的名称传递给 colorActivity 类。在 colorActivity 类中,允许用户输入特定圆圈的颜色代码,我想将颜色代码传递回视图类。我在使用 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;
    }

在colorActivity中:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.add_ecolor);


        circlenametextview = (TextView)findViewById(R.id.circlenametextview);


        String circlename = super.getIntent().getStringExtra("circlename");
          circlenametextview.setText(circlename);//get the circle name


savebutton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {

                 Intent intent = new Intent(colorActivity.this, ?????);//how to return back to the view class?


               colorcode = colorEditText.getText().toString();// I am able to get value right up till this point
              Intent resultIntent = new Intent();
                   resultIntent.putExtra("colorcode", colorcode );

                   setResult(Activity.RESULT_OK, resultIntent);
                   finish();
            }// onclick

        });
        }

【问题讨论】:

  • 你在哪里说:“这里发生错误:”......在 OnTouchEvent 中,仍然给你那个错误吗?还是 Intent 启动正确(Activity colorActivity 开启)?
  • @donnadulcinea 错误说 The method startActivityForResult(Intent, int) is undefined for type new DialogInterface.OnClickListener(){} ...我无法运行程序,因为有这个错误..
  • 首先,尝试在调用中将 getContext() (您未在代码中报告)替换为 getApplicationContext()。然后,如果它有效,我会帮助你恢复你的结果。
  • @donnadulcinea 我尝试用 getApplicationContext() 替换 getContext() 但我也遇到了错误。错误说“方法 getApplicationContext() 未定义新 DialogInterface.OnClickListener(){} 类型”
  • @donnadulcinea 如果我使用 startActivity(intent, colorActivity 可以成功启动。

标签: android android-intent view android-activity


【解决方案1】:

在更正其他代码以便您可以运行程序之后,您可以通过这种方式从您的活动colorActivity 中检索参数:

Step1:从colorActivity返回一些值

Intent resultIntent = new Intent();
resultIntent.putExtra("NAME OF THE PARAMETER", valueOfParameter);
...
setResult(Activity.RESULT_OK, resultIntent);
finish();

第 2 步:从 Main Activity 收集数据

覆盖@onActivityResult(...)

@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) {
        String value = (String) data.getExtras().getString("NAME OF THE PARAMETER");

参考文献

【讨论】:

  • 我已经尝试了我的 colorActivity 中的代码,但似乎没有使用 setResult(Activity.RESULT_OK, resultIntent); 传递值。调试后我从 onActivityResult 得到的值为空。我已经更新了上面的代码,
  • 注意这几件事:(i) onActivityResult 必须在 MainActivity 中被覆盖,(ii) requestCode 在请求和回答中必须相同(在你的情况下 =1),(iii) 替换 "参数名称”随处可见您的价值,例如。 “圈名”。告诉我。
  • 我仍然得到空值:(我可以使用 get 方法来获取值,以便我可以在我的视图类中使用它吗?
  • 我正在尝试我为您编写的代码并且它有效。您可以尝试使用我链接的一些示例,然后替换您的代码来传递形状信息吗?在这一点上应该更容易了。
  • 嗯,这很奇怪。但我也有一些似乎对每个人都有效而不是对我有用的东西(见我的问题)。如果您想分享您的完整项目,请将其粘贴到某个地方,我可以看看并帮助您。
【解决方案2】:

STARTACTIVITYFORRESULT 现已弃用

替代它和推荐的解决方案是使用Activity Result API

您可以使用此代码,用 Kotlin 语言编写:

  1. 创建 ResultLauncher:

     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
             }
         }
     }
    
  2. 使用上述结果启动器启动 Activity:

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

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

【讨论】:

    【解决方案3】:

    尝试使用

    ActivityName.this.startActivityForResult(intent,int)
    

    哦,还有一件小事,在您使用的代码中

    startActivityForResults(intent,int) ..替换为

    startActivityForResult(intent,int)

    【讨论】:

    • ActivityName 指的是我的视图类?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 2012-10-17
    • 1970-01-01
    相关资源
    最近更新 更多