Android 将字符串值从自定义对话框传递到另一个活动

Android 将字符串值从自定义对话框传递到另一个活动,android,csv,android-alertdialog,gettext,getter,Android,Csv,Android Alertdialog,Gettext,Getter,自定义对话框用于接收用户输入,然后使用getter方法将这些值传递给另一个活动 但是,当我将值传递给将字符串值输出到CSV文件、shipName、analystName等的方法时,值在文件中显示为空,如下所示,”,尽管我在对话框中输入了值 我通过观察debug菜单的expression窗口中的字符串值、shipName和AnalyzerName来调试这个问题,但是这些值在expression窗口中永远不会更新 我由此推断,传递输入的方法I是不正确的 有人知道为什么输出的值是空的吗 这是正在使用的

自定义对话框用于接收用户输入,然后使用
getter
方法将这些值传递给另一个活动

但是,当我将值传递给将字符串值输出到
CSV
文件、
shipName
analystName
等的方法时,值在文件中显示为空,如下所示,
,尽管我在对话框中输入了值

我通过观察debug菜单的expression窗口中的字符串值、
shipName
AnalyzerName
来调试这个问题,但是这些值在expression窗口中永远不会更新

我由此推断,传递输入的方法I是不正确的

有人知道为什么输出的值是空的吗

这是正在使用的对话框类:

package ie.gmi.computing;



import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.renderscript.Sampler;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MyMessageDialog {

    private Context context;
    private EditText shipText, scientistNameText , scientistEmailText , volumeText , colourText ;

    private String shipString, scientistNameString , scientistEmailString , volumeString , colourString ;



    public AlertDialog displayMessage(Context context, String title, String message){
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle(title);
        builder.setMessage(message);
        LayoutInflater inflater = LayoutInflater.from(context);
        final View v = inflater.inflate(R.layout.custom_view, null);
        builder.setView(v);
        shipText = (EditText)v.findViewById(R.id.shipNameEditText);
        scientistNameText = (EditText)v.findViewById(R.id.scientistEditText);
        scientistEmailText = (EditText)v.findViewById(R.id.emailEditText);
        volumeText = (EditText)v.findViewById(R.id.volumeEditText);
        colourText  = (EditText)v.findViewById(R.id.colourEditText);
        builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {



            }
        });
        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });
        AlertDialog dialog= builder.create();
        dialog.show();
        Button tb = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
        tb.setOnClickListener(new CustomListener(dialog));

        return dialog;
    }


    //getter/setters to allow access to string values
    //in SearchResult class
    public EditText getShipText() {
        return shipText;
    }



    public void setShipText(EditText shipText) {
        this.shipText = shipText;
    }



    public EditText getScientistNameText() {
        return scientistNameText;
    }



    public void setScientistNameText(EditText scientistNameText) {
        this.scientistNameText = scientistNameText;
    }



    public EditText getScientistEmailText() {
        return scientistEmailText;
    }


    public void setScientistEmailText(EditText scientistEmailText) {
        this.scientistEmailText = scientistEmailText;
    }



    public String getShipString() {
        return shipString;
    }


    public void setShipString(String shipString) {
        this.shipString = shipString;
    }


    public String getScientistNameString() {
        return scientistNameString;
    }


    public void setScientistNameString(String scientistNameString) {
        this.scientistNameString = scientistNameString;
    }


    public String getScientistEmailString() {
        return scientistEmailString;
    }


    public void setScientistEmailString(String scientistEmailString) {
        this.scientistEmailString = scientistEmailString;
    }


    public String getVolumeString() {
        return volumeString;
    }


    public void setVolumeString(String volumeString) {
        this.volumeString = volumeString;
    }


    public String getColourString() {
        return colourString;
    }


    public void setColourString(String colourString) {
        this.colourString = colourString;
    }


    public EditText getVolumeText() {
        return volumeText;
    }



    public void setVolumeText(EditText volumeText) {
        this.volumeText = volumeText;
    }



    public EditText getColourText() {
        return colourText;
    }



    public void setColourText(EditText colourText) {
        this.colourText = colourText;
    }



    @SuppressLint("NewApi")
    class CustomListener implements View.OnClickListener {
        private final Dialog dialog;
        public CustomListener(Dialog dialog) {
            this.dialog = dialog;
        }
        @SuppressLint("NewApi")
        @Override
        public void onClick(View v) {


            if(shipText.getText().toString().isEmpty() && !shipText.getText().toString().equals(null)){
                shipText.setError("The Field is required");

            }else if(scientistNameText.getText().toString().isEmpty() && !scientistNameText.getText().toString().equals(null)){
                scientistNameText.setError("The Field is required");
            }else if(scientistEmailText.getText().toString().isEmpty() && !scientistEmailText.getText().toString().equals(null)){
                scientistEmailText.setError("The Field is required");
            }else if(volumeText.getText().toString().isEmpty() && !volumeText.getText().toString().equals(null)){
                volumeText.setError("The Field is required");
            }else if(colourText.getText().toString().isEmpty() && !colourText.getText().toString().equals(null)){
                colourText.setError("The Field is required");
            }else{
                shipText.setError(null);
                scientistNameText.setError(null);
                scientistEmailText.setError(null);
                volumeText.setError(null);
                colourText.setError(null);


                shipString = shipText.getText().toString();
                scientistNameString = scientistNameText.getText().toString();
                scientistEmailString = scientistEmailText.getText().toString();
                volumeString = volumeText.getText().toString();
                colourString = colourText.getText().toString();


                Toast.makeText(dialog.getContext(), "The Values you get from : " +
                        "\n Ship name value: " + shipText.getText().toString() +
                        "\n Scientist name value: " + scientistNameText.getText().toString() +
                        "\n email value: " + scientistEmailText.getText().toString() +
                        "\n sample volume value: " + volumeText.getText().toString() +
                        "\n sample colour value: " + colourText.getText().toString() , Toast.LENGTH_SHORT).show();

                dialog.dismiss();
            }
        }
    }
}
这就是我在SearchResult类中检索值的方式,当我选择设置按钮时:

public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.action_settings:

            MyMessageDialog dialog =new MyMessageDialog(); 
            dialog.displayMessage(SearchResult.this, "Sample Info", "Required");



            // store / use the values here
            shipName = dialog.getShipString();
            analystName = dialog.getScientistNameString();
            analystEmail = dialog.getScientistEmailString();
            sampleVolume = dialog.getVolumeString();
            sampleColour = dialog.getColourString();
            longitudeValue = String.valueOf(lng);
            latitudeValue = String.valueOf(lat);
            sampleMaterial = message;

            return true;

        default:
          return super.onOptionsItemSelected(item);
        } 
    } 

您的getter似乎没有在每个EditText视图上实际调用
getText()
方法。按照他们的方式修改它们(例如,
scientistNameText.getText()

PS,是的,Mike M可能确实写过异步性导致了这个问题。另一种解决方法是在每个EditText视图的代码中添加如下内容:

myEditTextView.addTextChangedListener(new TextWatcher() {

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub

            //Set the variable here that you call in your getter. Use `getText()` to get the string (e.g., myGetterVariable = myEditTextView.getText().


        }
    }

您的getter似乎没有在每个EditText视图上实际调用
getText()
方法。按照他们的方式修改它们(例如,
scientistNameText.getText()

PS,是的,Mike M可能确实写过异步性导致了这个问题。另一种解决方法是在每个EditText视图的代码中添加如下内容:

myEditTextView.addTextChangedListener(new TextWatcher() {

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub

            //Set the variable here that you call in your getter. Use `getText()` to get the string (e.g., myGetterVariable = myEditTextView.getText().


        }
    }

您的对话框显示是异步的;也就是说,
onOptionsItemSelected()
中的代码执行在调用
dialog.displayMessage()
后不会暂停,因此getter返回这些字段的初始值,在所有情况下都为空。在
CustomListener
onClick()
方法中设置了这些字段后,您应该创建一个接口,该接口由活动实现以接收回调,然后更新活动的变量

在dialog类中,我们创建一个接口。例如:

public class MyMessageDialog {
    public interface DialogCallback {
        public void onValuesSet();
    }
    ...
}
确保保存对上下文的引用:

public AlertDialog displayMessage(Context context, String title, String message){
    this.context = context;
    ...
}
onClick()
方法的末尾,设置字段值后:

((DialogCallback) context).onValuesSet();
活动需要实现我们创建的接口,对话框应该是类成员,字段将在接口的回调方法中设置:

public class SearchResult extends Activity 
    implements MyMessageDialog.DialogCallback {
    ...
    MyMessageDialog dialog;

    @Override
    public void onValuesSet()
    {
        shipName = dialog.getShipString();
        analystName = dialog.getScientistNameString();
        ...
    }
    ...
}

您的对话框显示是异步的;也就是说,
onOptionsItemSelected()
中的代码执行在调用
dialog.displayMessage()
后不会暂停,因此getter返回这些字段的初始值,在所有情况下都为空。在
CustomListener
onClick()
方法中设置了这些字段后,您应该创建一个接口,该接口由活动实现以接收回调,然后更新活动的变量

在dialog类中,我们创建一个接口。例如:

public class MyMessageDialog {
    public interface DialogCallback {
        public void onValuesSet();
    }
    ...
}
确保保存对上下文的引用:

public AlertDialog displayMessage(Context context, String title, String message){
    this.context = context;
    ...
}
onClick()
方法的末尾,设置字段值后:

((DialogCallback) context).onValuesSet();
活动需要实现我们创建的接口,对话框应该是类成员,字段将在接口的回调方法中设置:

public class SearchResult extends Activity 
    implements MyMessageDialog.DialogCallback {
    ...
    MyMessageDialog dialog;

    @Override
    public void onValuesSet()
    {
        shipName = dialog.getShipString();
        analystName = dialog.getScientistNameString();
        ...
    }
    ...
}
有人知道为什么输出的值是空的吗

因为从dialog类获取数据的所有语句都是在菜单选项部分的
dialog.displayMessage
之后执行的

如何通过单击
Ok
按钮从
MyMessageDialog
获取数据

1。将所有getter/setter方法返回类型更改为String,而不是从MyMessageDialog获取
EditText

2.使用
界面
创建一个事件侦听器,以便在活动中单击
确定
按钮时关闭警报事件。您可以将事件侦听器创建为:

3.
Ok
按钮单击警报时调用所有setter方法。调用所有setter方法后,调用事件侦听器方法在警报完成后执行活动中的事件:

      @Override
        public void onClick(DialogInterface dialog, int which) {
             setShipText(shipText.getText().toString());
             setScientistNameText(shipText.getText().toString());
             ....
             //..close alert and call event listener method
        }
有人知道为什么输出的值是空的吗

因为从dialog类获取数据的所有语句都是在菜单选项部分的
dialog.displayMessage
之后执行的

如何通过单击
Ok
按钮从
MyMessageDialog
获取数据

1。将所有getter/setter方法返回类型更改为String,而不是从MyMessageDialog获取
EditText

2.使用
界面
创建一个事件侦听器,以便在活动中单击
确定
按钮时关闭警报事件。您可以将事件侦听器创建为:

3.
Ok
按钮单击警报时调用所有setter方法。调用所有setter方法后,调用事件侦听器方法在警报完成后执行活动中的事件:

      @Override
        public void onClick(DialogInterface dialog, int which) {
             setShipText(shipText.getText().toString());
             setScientistNameText(shipText.getText().toString());
             ....
             //..close alert and call event listener method
        }

M、 你能给我一个代码示例吗?@BrianJ当然可以。不过,这需要我一秒钟的时间;我现在正在打电话。我将上述解决方案添加到我的项目中,但当单击“确定”时,
dialog.displayMessage(SearchResult.this,“示例信息”,“必需”)在这一行出现空指针异常我可能没有正确地实现您的解决方案..这就是我如何在两个类中实现代码的:您知道我在解决方案中哪里出了问题吗`@BrianJ您需要在
displayMessage()
方法中保存对上下文的引用:
this.Context=Context这不会导致与方法中的行arready冲突,
AlertDialog.Builder=new AlertDialog.Builder(上下文)