如何从 AlertDialog 中的 EditText 检索值?

发布于 2024-11-28 04:45:52 字数 3729 浏览 2 评论 0原文

选择后,上下文菜单选项会弹出一个警报对话框。我希望用户在 AlertDialog 中的 EditText 中输入文本,并且当用户按下 PositiveButton 时,EditText 的值能够“返回”到主方法。以下是我的班级中的相关代码:

public class PassPlay extends ListActivity {
    public static final int PENALTY_ID = Menu.FIRST+1;
    public static final int FUMBLE_ID = Menu.FIRST+2;
    public static final int ADDLYDS_ID = Menu.FIRST+3;
    public static final int SAFETY_ID = Menu.FIRST+4;

    EditText ydsFromAlertDialog;

    String penYdsStr;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.passplay);

        ydsFromAlertDialog=(EditText)findViewById(R.id.passYdsLabel);

        registerForContextMenu(getListView());
    }

    public boolean onCreateOptionsMenu(Menu menu) {
        populateMenu(menu);
        return(super.onCreateOptionsMenu(menu));
    }

    public boolean onOptionsItemSelected(MenuItem item) {
        return(applyMenuChoice(item) || super.onOptionsItemSelected(item));
    }

    public boolean onContextItemSelected(MenuItem item) {
        return(applyMenuChoice(item) || super.onContextItemSelected(item));
    }

    private void populateMenu(Menu menu) {
        menu.add(Menu.NONE, PENALTY_ID, Menu.NONE, "Penalty");
        menu.add(Menu.NONE, FUMBLE_ID, Menu.NONE, "Fumble");
        menu.add(Menu.NONE, ADDLYDS_ID, Menu.NONE, "Additional Yards");
        menu.add(Menu.NONE, SAFETY_ID, Menu.NONE, "Safety");
    }

    private boolean applyMenuChoice(MenuItem item) {
        LayoutInflater factory = LayoutInflater.from(this);
        final View textEntryView;
        switch (item.getItemId()) {
        case PENALTY_ID:
            textEntryView = factory.inflate(R.layout.textdialog, null);
            new AlertDialog.Builder(this)
            .setView(textEntryView)
            .setIcon(android.R.drawable.ic_dialog_alert)
            .setTitle(R.string.timeout)
            .setPositiveButton(R.string.offense, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    //Actions for offensive timeout
                    EditText penaltyYds=(EditText)findViewById(R.id.ydsAssessedLabel);
                    penYdsStr = penaltyYds.getText().toString();
                    ydsFromAlertDialog.setText(penYdsStr);
                }
            })
            .setNeutralButton(R.string.defense, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    //Actions for defensive timeout  
                }
            })
            .setNegativeButton(R.string.cancel, null)
            .show();
            return true;
        case FUMBLE_ID:
            //Fumble window
            return true;
        case ADDLYDS_ID:
            //Additional Yards window
            return true;
        case SAFETY_ID:
            //Safety window
            return true;
        }

        return(false);
    }
}

主 XML 布局 (passplay.xml) 具有普通的 TextViews、EditTexts、CheckBoxes 等。我想将这些 EditTexts (ydsFromAlertDialog) 之一设置为分配在 AlertDialog ( EditText 惩罚Yds)。 AlertDialog 的 XML 布局 (textdialog.xml) 非常简单,只有一个 TextView 和一个 EditText。

当我运行该程序时,出现以下行错误,并显示“应用程序已意外停止”。

penYdsStr = penaltyYds.getText().toString();

总之,我想按菜单选项“Penalty”,有一个带有 EditText 的 AlertDialog,我在其中输入一个数字,当我按 PositiveButton 时,EditText ydsFromAlertDialog 的值将更改为对话框中输入的值。

实际上,我有一个包含 5 列的数据库表,其中 4 列将由普通字段填充,但第 5 列将由对话框中输入的值填充。我想如果我可以“返回”它以“与”其余值一起,我也可以将它保存到与其他值相同的表记录中。

如果您需要更多信息,请告诉我。谢谢你!

When selected, a context menu option brings up an AlertDialog. I want the user to enter text into an EditText in the AlertDialog, and when the user presses PositiveButton, the value of EditText is able to be "returned" to the main method. Here is the relevant code from my class:

public class PassPlay extends ListActivity {
    public static final int PENALTY_ID = Menu.FIRST+1;
    public static final int FUMBLE_ID = Menu.FIRST+2;
    public static final int ADDLYDS_ID = Menu.FIRST+3;
    public static final int SAFETY_ID = Menu.FIRST+4;

    EditText ydsFromAlertDialog;

    String penYdsStr;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.passplay);

        ydsFromAlertDialog=(EditText)findViewById(R.id.passYdsLabel);

        registerForContextMenu(getListView());
    }

    public boolean onCreateOptionsMenu(Menu menu) {
        populateMenu(menu);
        return(super.onCreateOptionsMenu(menu));
    }

    public boolean onOptionsItemSelected(MenuItem item) {
        return(applyMenuChoice(item) || super.onOptionsItemSelected(item));
    }

    public boolean onContextItemSelected(MenuItem item) {
        return(applyMenuChoice(item) || super.onContextItemSelected(item));
    }

    private void populateMenu(Menu menu) {
        menu.add(Menu.NONE, PENALTY_ID, Menu.NONE, "Penalty");
        menu.add(Menu.NONE, FUMBLE_ID, Menu.NONE, "Fumble");
        menu.add(Menu.NONE, ADDLYDS_ID, Menu.NONE, "Additional Yards");
        menu.add(Menu.NONE, SAFETY_ID, Menu.NONE, "Safety");
    }

    private boolean applyMenuChoice(MenuItem item) {
        LayoutInflater factory = LayoutInflater.from(this);
        final View textEntryView;
        switch (item.getItemId()) {
        case PENALTY_ID:
            textEntryView = factory.inflate(R.layout.textdialog, null);
            new AlertDialog.Builder(this)
            .setView(textEntryView)
            .setIcon(android.R.drawable.ic_dialog_alert)
            .setTitle(R.string.timeout)
            .setPositiveButton(R.string.offense, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    //Actions for offensive timeout
                    EditText penaltyYds=(EditText)findViewById(R.id.ydsAssessedLabel);
                    penYdsStr = penaltyYds.getText().toString();
                    ydsFromAlertDialog.setText(penYdsStr);
                }
            })
            .setNeutralButton(R.string.defense, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    //Actions for defensive timeout  
                }
            })
            .setNegativeButton(R.string.cancel, null)
            .show();
            return true;
        case FUMBLE_ID:
            //Fumble window
            return true;
        case ADDLYDS_ID:
            //Additional Yards window
            return true;
        case SAFETY_ID:
            //Safety window
            return true;
        }

        return(false);
    }
}

The main XML layout (passplay.xml) has your normal TextViews, EditTexts, CheckBoxes, etc. I want to set one of those EditTexts (ydsFromAlertDialog) to be assigned the value entered in the AlertDialog (EditText penaltyYds). The AlertDialog's XML layout (textdialog.xml) is very simple with one TextView and one EditText.

When I run the program, the following line errors out with "The application has stopped unexpectedly."

penYdsStr = penaltyYds.getText().toString();

So in summary, I want to press the menu option "Penalty", have an AlertDialog with an EditText where I enter a number, and when I press PositiveButton, the EditText ydsFromAlertDialog's value is changed to what was entered in the Dialog.

In reality, I have a database table with 5 columns, 4 of which will be populated by normal fields, but the 5th will be populated by the value entered in the Dialog. I figured if I can "return" it to "be with" the rest of the values, I'll be able to save it to same table record as the others, too.

Let me know if you need any more information. Thank you!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

放飞的风筝 2024-12-05 04:45:52

您必须从您膨胀的视图中获取 ydsAssessedLabel

EditText penaltyYds=(EditText)textEntryView.findViewById(R.id.ydsAssessedLabel);

You have to get the ydsAssessedLabel from the view you inflated

EditText penaltyYds=(EditText)textEntryView.findViewById(R.id.ydsAssessedLabel);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文