对话框中的 EditText 返回空字符串

EditText in dialog returning null string

我有这个 button 来显示一个 dialog,它又有一个 EditText 供用户写东西,然后点击 done 按钮保存它否则另一个 button 关闭 dialog。这里的问题是我无法获取用户写的 String 。它 returns 给我一个空刺,导致应用程序崩溃。这是代码:

我在单击按钮时调用 dialog

        //Write Review Dialog Box

    writeReviewBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.i("HAPPENED", "This Onclick is working");
            try{

                // Create custom dialog object                    
                final Dialog dialog = new Dialog(GetReviewActivity.this);
                // Include dialog's xml file                    
                dialog.setContentView(R.layout.write_review_activity);
                // Set dialog title                    
                dialog.setTitle("Your review is valuable");

                final EditText etWR = (EditText)findViewById(R.id.etWR);

                Button writeButton = (Button) dialog.findViewById(R.id.buttonWR);

                Button declineButton = (Button) dialog.findViewById(R.id.buttonNoThanks);

                dialog.show();

                //Done Button
                writeButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Log.i("HAPPENED: ","writeButton Block Is WORKING!");
                         Activity activity = GetReviewActivity.this;
                        activity.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                String Review = etWR.getText().toString();
                                StoreAReview(Review);
                            }
                        });
                    }
                });

                // if decline button is clicked, close the custom dialog
                declineButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        // Close dialog
                        dialog.dismiss();
                    }
                });

            }catch (Exception e){
                e.printStackTrace();
            }
        }
    });

final EditText etWR = (EditText)findViewById(R.id.etWR); 正在解析为 Activity#findViewById。但是您的对话框布局并未附加到您的 activity window,而是附加到对话框。所以你必须从对话框的视图中膨胀 EditText:

尝试

final EditText etWR = (EditText)dialog.findViewById(R.id.etWR);

而不是

final EditText etWR = (EditText)findViewById(R.id.etWR);

你应该初始化 EditText

 EditText etWR = (EditText)dailog.findViewById(R.id.etWR);

因为你的 EditText 来自 dailog。所以

你只是错过了 dialog.findViewById(R.id.etWR)

更改此行

 final EditText etWR = (EditText)findViewById(R.id.etWR);

到这个

final EditText etWR = (EditText)dialog.findViewById(R.id.etWR);

然后,添加点击事件代码

请参阅下面的示例,该示例非常有效。

Main.java

public class MainActivity extends Activity {

    final Context context = this;
    private Button button;
    private EditText result;

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // components from main.xml
        button = (Button) findViewById(R.id.buttonPrompt);
        result = (EditText) findViewById(R.id.editTextResult);

        // add button listener
        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {

                // get prompts.xml view
                LayoutInflater li = LayoutInflater.from(context);
                View promptsView = li.inflate(R.layout.prompts, null);

                AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                        context);

                // set prompts.xml to alertdialog builder
                alertDialogBuilder.setView(promptsView);

                final EditText userInput = (EditText) promptsView
                        .findViewById(R.id.editTextDialogUserInput);

                // set dialog message
                alertDialogBuilder
                        .setCancelable(false)
                        .setPositiveButton("OK",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog,
                                            int id) {
                                        // get user input and set it to result
                                        // edit text
                                        result.setText(userInput.getText());
                                    }
                                })
                        .setNegativeButton("Cancel",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog,
                                            int id) {
                                        dialog.cancel();
                                    }
                                });

                // create alert dialog
                AlertDialog alertDialog = alertDialogBuilder.create();

                // show it
                alertDialog.show();

            }

        });

    }

}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/buttonPrompt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Show Prompt Dialog" />

    <EditText
        android:id="@+id/editTextResult"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

    </EditText>

</LinearLayout>

promt.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout_root"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:padding="10dp" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Type Your Message : "
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <EditText
        android:id="@+id/editTextDialogUserInput"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <requestFocus />
    </EditText>

</LinearLayout>

就是这样。

以前遇到过这个问题。我尝试使用 Dialog 引用启动 EditText 但这没有用

final EditText etWR = (EditText)dialog.findViewById(R.id.etWR);

解法:

我是这样解决的:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    View dialogWR = getActivity().getLayoutInflater().inflate(R.layout.write_review_activity, null);
    etWR = (EditText) dialogWR.findViewById(R.id.etWR);
}