【问题标题】:Pass the user input from an alert dialog to the activity and process it once the dialog dismisses in Android?将用户输入从警报对话框传递给活动并在对话框在Android中关闭时处理它?
【发布时间】:2013-06-21 01:26:51
【问题描述】:

我有一个要求用户输入的弹出对话框。

一旦用户输入他/她的输入,然后单击“确定”,我希望片段将用户输入传递回对话框后面的活动。

我读过一些关于onDismiss(DialogInterface dialog) 的内容。但是,作为 Java 和 Android 的新手,我无法正确实现它:

  1. 处理程序从未在我的代码中运行。

  2. 即使处理程序运行后,我仍然不知道如何从参数dialog 获取用户输入,因为它是DialogInterface 类型,我不知道如何处理。

下面是我的代码 sn-ps。

活动端:

    public class CalibrationActivity extends Activity implements SensorEventListener, DialogInterface.OnDismissListener {

    ...

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

            buttonInit();
            sensorInit();
        }


        private void buttonInit() {

            // start calibrating button
            startCalibratingButton = (Button) findViewById(R.id.button1);
            startCalibratingButton.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {

                    startCalibrationFlag = true;

                    Toast.makeText(CalibrationActivity.this, "Please walk " + Constant.CALIBRATION_STEP_NUMBER + " steps and press the 'Done Calibrating' button", Toast.LENGTH_SHORT).show();
                    startCalibratingButton.setEnabled(false);
                    doneCalibratingButton.setEnabled(true);
                }
            });

            // done calibrating button
            doneCalibratingButton = (Button) findViewById(R.id.button2);
            doneCalibratingButton.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {

                    startCalibrationFlag = false;

                    RequireDistanceDialogFragment requireDistanceDialogFragment = new RequireDistanceDialogFragment();
                    requireDistanceDialogFragment.setCancelable(false);
                    requireDistanceDialogFragment.show(getFragmentManager(), ALARM_SERVICE); // dialog pops up that leads the new user to calibrate

                // Error Here: "The method setOnDismissListener(new OnDismissListener(){}) is undefined for the type RequireDistanceDialogFragment"
                    requireDistanceDialogFragment.setOnDismissListener(new OnDismissListener() {

                        public void onDismiss(DialogInterface dialog) {
                            LoadingActivity.this.finish();
                        }
                    });

                }
            });

            startCalibratingButton.setEnabled(true);
            doneCalibratingButton.setEnabled(false);
        }

        // called when the dialog is dismissed
        public void onDismiss(DialogInterface requireDistanceDialogFragment) {

// Error Here: The method getDistanceEntered() is undefined for the type DialogInterface
                double userInput = requireDistanceDialogFragment.getDistanceEntered();
                processTheUserInputHere();

        }

    }

对话端:

package com.example.drsystem;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;
import android.text.Editable;
import android.text.InputType;
import android.widget.EditText;
import android.widget.Toast;

public class RequireDistanceDialogFragment extends DialogFragment {

    private Editable distance;
    private boolean distanceIsEntered = false;

    public Dialog onCreateDialog(Bundle savedInstanceState) {

        // Use the Builder class for convenient dialog construction
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        final EditText input = new EditText(getActivity());
        input.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);

        builder.setTitle("Distance is required to calibrate the stride length estimation.").setMessage("Distance (in m) for these " + Constant.CALIBRATION_STEP_NUMBER + " steps?").setView(input).setPositiveButton("Ok", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int whichButton) { // click ok

                distanceIsEntered = true;
                distance = input.getText();
            }
        }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int whichButton) { // click cancel

                Toast.makeText(getActivity(), "Calibration not done", Toast.LENGTH_SHORT).show();
            }
        });

        // Create the AlertDialog object and return it
        return builder.create();
    }

    // if the user has not entered the distance yet, the distance returned is -1
    public double getDistanceEntered() {

        if (distanceIsEntered)
            return Double.parseDouble(distance.toString());
        else
            return -1;
    }

}

你可以通过解决我遇到的 2 个问题来帮助我修改它

或者您可以提出新的方法来实现这一点。

【问题讨论】:

  • 使用 startActivityForResult(calibrationIntent, 0);并检查它是否有所不同,此链接可能会帮助您实现上述想法stackoverflow.com/questions/10407159/…
  • @ingsaurabh 有帮助。但问题是弹出对话框不是一个活动。所以当它完成时,onActivityResult() 不会被调用,对吗?
  • ok 之前在代码中写了 startActivity 所以我建议现在试试这个stackoverflow.com/questions/12622742/…

标签: android android-dialog android-dialogfragment


【解决方案1】:

对话框中的 onClickMethod 应将输入放入消息中

builder.setMessage("来自用户的消息");

您的 onDismiss 侦听器应该在对话框被杀死之前从对话框中获取数据

public void onDismiss(DialogInterface 对话框) { String messageFromUser = dialog.getMessage("你想要什么字符串"); LoadingActivity.this.finish(); }

你为什么要完成加载活动?

【讨论】:

  • 非常抱歉!我粘贴了错误的对话框代码 sn-p。请再检查一次。实际上我的对话并没有开始一个新的活动。请相应地修改您的答案。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-11
  • 2014-07-07
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
相关资源
最近更新 更多