【问题标题】:Why am I getting errors when getting EditText content from my custom dialog?为什么从我的自定义对话框中获取 EditText 内容时会出现错误?
【发布时间】:2012-05-25 02:04:08
【问题描述】:

我有一个自定义对话框,其中包含 EditText 和 Button。在我的对话框中性按钮的 onClick 方法中,我想根据输入到 EditText 中的内容创建一个新字符串。

我正在做的是在按下菜单按钮时膨胀菜单。菜单按钮显示带有 2 个选项的 AlertDialogs。当在 AlertDialog 中选择一个选项时,会创建另一个选项,其中包含一个 EditText 询问名称。当我尝试“String name = nameOfEditText.getText().toString();”时出现空指针错误

这里是代码

    // creation of the dialog
    Builder mBuilder = new AlertDialog.Builder(this);
LayoutInflater inflater = (LayoutInflater)                 this.getSystemService(LAYOUT_INFLATER_SERVICE);
View layout= inflater.inflate(R.layout.custom_dialog, (ViewGroup) findViewById(R.id.RelativeLayout1));

mBuilder.setNeutralButton("Add", new AddOnClickListener());
mBuilder.setView(layout);
Dialog mDialog = mBuilder.create();
mDialog.show();

    nameOfLocalEditText = (EditText) findViewById(R.id.name);

    Button dialogButton = (Button) mDialog.findViewById(R.id.button1);
dialogButton.setOnClickListener(new OnClickListener() {
        @Override
    public void onClick(View v) {
            Intent imp = new Intent();
            imp.setType("file/*");
        imp.setAction(Intent.ACTION_GET_CONTENT);
        imp.addCategory(Intent.CATEGORY_OPENABLE);
        startActivityForResult(imp, 0);
            }
});

现在是 AddOnClickListener() 方法。 nameOfLocalEditText 是包含这些方法的类的本地 EditText。

    private final class AddOnClickListener implements DialogInterface.OnClickListener {
    public void onClick(DialogInterface dialog, int which) {
        String s = nameOfLocalEditText.getText().toString();
    }
}

谁能告诉我为什么我的应用程序强制在制作 String 时关闭?

这是 custom_dialog 的 xml

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

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="16dp"
            android:text="Get File" />

        <EditText
            android:id="@+id/editText1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/button1"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="18dp"
            android:ems="10" >

        <requestFocus />
        </EditText>
    </RelativeLayout>

这是 logcat 错误信息

   05-24 23:27:27.166: E/AndroidRuntime(595): FATAL EXCEPTION: main
   05-24 23:27:27.166: E/AndroidRuntime(595): java.lang.NullPointerException
   05-24 23:27:27.166: E/AndroidRuntime(595): at         com.akonwi.listSyllabi.ListSyllabiActivity$AddOnClickListener.onClick(ListSyllabiActivity.ja va:145)
   05-24 23:27:27.166: E/AndroidRuntime(595):   at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
   05-24 23:27:27.166: E/AndroidRuntime(595):   at android.os.Handler.dispatchMessage(Handler.java:99)
   05-24 23:27:27.166: E/AndroidRuntime(595):   at android.os.Looper.loop(Looper.java:137)
   05-24 23:27:27.166: E/AndroidRuntime(595):   at android.app.ActivityThread.main(ActivityThread.java:4424)
   05-24 23:27:27.166: E/AndroidRuntime(595):   at java.lang.reflect.Method.invokeNative(Native Method)
   05-24 23:27:27.166: E/AndroidRuntime(595):   at java.lang.reflect.Method.invoke(Method.java:511)
   05-24 23:27:27.166: E/AndroidRuntime(595):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
   05-24 23:27:27.166: E/AndroidRuntime(595):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
   05-24 23:27:27.166: E/AndroidRuntime(595):   at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

    标签: android android-edittext


    【解决方案1】:

    mDialog.show(); 语句之后定义 EditText。并使用您的 Dialog 对象查找您的 EditText id,如下所示:

    mBuilder.setView(layout);
    Dialog mDialog = mBuilder.create();
    mDialog.show();
    
    nameOfLocalEditText = (EditText) mDialog.findViewById(R.id.name);
    

    现在你应该可以使用 EditText了。

    您可以使用我在项目中使用的代码来代替警报对话框

        Dialog myDialog;
    myDialog = new Dialog(Activity_ShoppingList.this);
                myDialog.requestWindowFeature(Window.FEATURE_LEFT_ICON);
                myDialog.setContentView(R.layout.custom_dialog);
                myDialog.setTitle("Endre/Slett ingrediens");
                myDialog.setCancelable(true);
                myDialog.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, R.drawable.edit);
                myDialog.show();
    
                edtName = (EditText)myDialog.findViewById(R.id.edtname);
                edtqty = (EditText)myDialog.findViewById(R.id.edtqty);
                edtType = (EditText)myDialog.findViewById(R.id.edtType);
    
                edtName.setText(rName);
                edtqty.setText(rAmm);
                edtType.setText(rType);
    
    
                 btnNew = (Button) myDialog.findViewById(R.id.btnDelete);
                btnNew.setOnClickListener(new OnClickListener() {
    
                    @Override
                    public void onClick(View v) {
    
    
                            // TODO Auto-generated method stub
    
                            myDbHelper.DeleteSelDataBase(rName);
                            new AsyncButtonClk().execute(); 
                            myDialog.dismiss();
                        //Toast.makeText(getApplicationContext(), "Row Id : " + Global.shopping_name.get(ARG2) , Toast.LENGTH_SHORT).show();
                        }
    
    
    
                });
    

    【讨论】:

    • 谢谢。现在我的偏好是使用 AlertDialog,这样我就可以使用中性按钮。我的自定义对话框中已经有一个按钮,用于发送用户查找文件。我希望中性按钮从 AlertDialog 组件中获取数据
    【解决方案2】:

    同样的[这个问题][1]

    试试这个

      nameOfLocalEditText = (EditText)layout.findViewById(R.id.name);
      layout.addView(nameOfLocalEditText);
    

    更新:参考[这个链接][2]你可以试试

      final Dialog dialog = new Dialog(context);
      dialog.setContentView(R.layout.custom);
    

    使用 dialog.setContentView 代替膨胀布局应该可以工作。

    现在我的偏好是使用 AlertDialog,这样我就可以拥有 中性按钮。我的自定义对话框中已经有一个按钮可以发送 用户查找文件。我想要中性按钮获取数据 来自 AlertDialog 组件

    这段代码对我有用:

     // creation of the dialog
        Builder mBuilder = new AlertDialog.Builder(this);
        LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
        View layout = inflater.inflate(R.layout.custom_dialog,
                (ViewGroup) findViewById(R.id.RelativeLayout1));
    
        mBuilder.setNeutralButton("Add", new AddOnClickListener());
        mBuilder.setView(layout);
        Dialog mDialog = mBuilder.create();
        mDialog.show();
    
        nameOfLocalEditText = (EditText) layout.findViewById(R.id.editText1);
    
        Button dialogButton = (Button) layout.findViewById(R.id.button1);
        dialogButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent imp = new Intent();
                imp.setType("file/*");
                imp.setAction(Intent.ACTION_GET_CONTENT);
                imp.addCategory(Intent.CATEGORY_OPENABLE);
                startActivityForResult(imp, 0);
            }
        });
    
       private final class AddOnClickListener implements DialogInterface.OnClickListener {
        public void onClick(DialogInterface dialog, int which) {
            String s = nameOfLocalEditText.getText().toString();
            Log.d(TAG, s);
        }
    }
    

    【讨论】:

    • 我试过了。而且我仍然遇到错误。我觉得这可能与我的其他程序有关。我有一个列表活动,其中包含我为列表制作的类和适配器。填充列表后,由于某种原因不会出现对话框。但是现在列表是空的
    • 你能从你的 logcat 中显示错误吗?我想也许你忘记了 addView,我已经更新了我的答案。
    • 我的自定义布局中有一个按钮,用于响应此类中的方法。当在对话框中单击该按钮时,它会强制关闭。我宁愿设置 AlertDialog 并使用中性按钮,因为我认为它看起来更好
    • 即使我使用常规对话框,当我使用 getText().toString() 方法时仍然会出现错误
    • @akonwi 你能发布你在这个对话框中的源代码吗?你把它放在listview的onClick事件中,不是吗?
    猜你喜欢
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 2011-10-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    相关资源
    最近更新 更多