0

EditText と Button を含むカスタム ダイアログがあります。ダイアログ ニュートラル ボタンの onClick メソッドで、EditText に入力されたものから新しい文字列を作成したいと考えています。

私がやっているのは、メニューボタンが押されたときにメニューを膨らませることです。メニュー ボタンには、2 つのオプションを含む AlertDialogs が表示されます。オプションが AlertDialog で選択されると、別のオプションが作成され、名前を尋ねる EditText が含まれます。「String name = nameOfEditText.getText().toString();」を試行すると、null ポインター エラーが発生します。

ここにコードがあります

    // 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 sを作成する時点でアプリの強制が終了する理由を誰か教えてもらえますか?

これは 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)
4

2 に答える 2

1

ステートメントの後に EditText を定義しますmDialog.show();。Dialog オブジェクトを使用して、以下のように EditText ID を見つけます。

mBuilder.setView(layout);
Dialog mDialog = mBuilder.create();
mDialog.show();

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

これで、EditText を使用できるようになります。

Alert Dialog の代わりに、私のプロジェクトで使用したように、このコードを使用できます

    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();
                    }



            });
于 2012-05-25T05:27:25.397 に答える
0

同じ[この質問][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);
    }
}
于 2012-05-25T02:20:28.843 に答える