7

アラートダイアログボックス内にある編集テキストフィールドにテキスト検証を追加しようとしています。ユーザーに名前の入力を求めます。

入力した内容が空白またはnullの場合、トーストのメッセージエラーを作成する以外に何も実行されないように、検証を追加したいと思います。

これまでのところ:

    AlertDialog.Builder alert = new AlertDialog.Builder(this);
    alert.setTitle("Record New Track");
    alert.setMessage("Please Name Your Track:");
    // Set an EditText view to get user input
    final EditText trackName = new EditText(this);
    alert.setView(trackName);
    alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {

            String textString = trackName.getText().toString(); // Converts the value of getText to a string.
            if (textString != null && textString.trim().length() ==0)
            {   

                Context context = getApplicationContext();
                CharSequence error = "Please enter a track name" + textString;
                int duration = Toast.LENGTH_LONG;

                Toast toast = Toast.makeText(context, error, duration);
                toast.show();


            }
            else 
            {

                SQLiteDatabase db = waypoints.getWritableDatabase();
                ContentValues trackvalues = new ContentValues();
                trackvalues.put(TRACK_NAME, textString);
                trackvalues.put(TRACK_START_TIME,tracktimeidentifier );
                insertid=db.insertOrThrow(TRACK_TABLE_NAME, null, trackvalues);

            }

ただし、これはアラートダイアログを閉じてからトーストを表示するだけです。アラートダイアログを引き続き画面に表示したい。

ありがとう

4

6 に答える 6

4

のパラメータとして指定されているため、のクローズを停止するオプションが提供されていないDialogように思われるため、を再作成する必要があると思います。DialogInterfaceonClick()Dialog

また、いくつかのヒントがあります。

を使ってみてくださいActivity.onCreateDialog()Activity.onPrepareDialog()そしてもちろんActivity.showDialog()。これらはダイアログの使用法をはるかに簡単にし(少なくとも私にとっては)、ダイアログの使用法はメニューの使用法のように見えます。これらの方法を使用すると、ダイアログをより簡単に再度表示することもできます。

ヒントをあげたいと思います。それはあなたの質問に対する答えではありませんが、答えの中でこれを行うことははるかに読みやすくなります。

オブジェクトへの参照を保持する代わりに、次のAlertDialog.Builder()ようにすることができます。

new AlertDialog.Builder(this)
.setTitle("Record New Track")
.setMessage("Please Name Your Track:")
//and some more method calls
.create();
//or .show();

参照と多くの入力を節約します;)。(ほぼ?)オブジェクトをAlertDialog.Builder返すすべてAlertDialog.Builderのメソッド。メソッドを直接呼び出すことができます。

同じことがToastsにも当てはまります:

Toast.makeText(this, "Please enter...", Toast.LENGTH_LONG).show();
于 2010-04-05T20:36:18.317 に答える
4

クラス内にアラートを表示する新しいメソッドを作成し、アラートを作成するためのすべてのコードをその1つのメソッドに配置します。次に、トーストを呼び出した後、そのメソッドを呼び出します。そのメソッドにcreateAlert()という名前を付けたとすると、次のようになります。

  createAlert(){

 AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle("Record New Track");
alert.setMessage("Please Name Your Track:");
// Set an EditText view to get user input
final EditText trackName = new EditText(this);
alert.setView(trackName);
alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {

        String textString = trackName.getText().toString(); // Converts the value of getText to a string.
        if (textString != null && textString.trim().length() ==0)
        {   

            Context context = getApplicationContext();
            CharSequence error = "Please enter a track name" + textString;
            int duration = Toast.LENGTH_LONG;

            Toast toast = Toast.makeText(context, error, duration);
            toast.show();
            createAlert();



        }
        else 
        {

            SQLiteDatabase db = waypoints.getWritableDatabase();
            ContentValues trackvalues = new ContentValues();
            trackvalues.put(TRACK_NAME, textString);
            trackvalues.put(TRACK_START_TIME,tracktimeidentifier );
            insertid=db.insertOrThrow(TRACK_TABLE_NAME, null, trackvalues);

        }
}
于 2011-11-22T04:18:13.967 に答える
3

.setPositiveButtonを使用する代わりに、テキストボックスと[OK]ボタンを含むカスタムxmlレイアウトを作成する必要があります。次に、データを検証してダイアログを閉じるために、ボタンにクリックリスナーを追加できます。

CreateDialogで使用する必要があります。

protected Dialog onCreateDialog(int id) 
{
            LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

if (id==EDIT_DIALOG)
{
            final View layout = inflater.inflate(R.layout.edit_dialog, (ViewGroup) findViewById(R.id.Layout_Edit));

            final Button okButton=(Button) layout.findViewById(R.id.Button_OkTrack);
            final EditText name=(EditText) layout.findViewById(R.id.EditText_Name);
            okButton.setOnClickListener(new View.OnClickListener() 
            {
                public void onClick(View v) {
                    String textString = trackName.getText().toString(); 
                    if (textString != null && textString.trim().length() ==0)
                    {
                        Toast.makeText(getApplicationContext(), "Please enter...", Toast.LENGTH_LONG).show();
                    } else
                        removeDialog(DIALOG_EDITTRACK);
                }
            });            
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setView(layout);
            builder.setTitle("Edit text");

            AlertDialog submitDialog = builder.create();            
            return submitDialog;
}
于 2010-10-24T21:53:56.720 に答える
2

古い投稿ですが、以下のコードは誰かを助けます。カスタマイズされたレイアウトと拡張されたDialogFragmentクラスを使用しました。

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    // Get the layout inflater
    LayoutInflater inflater = requireActivity().getLayoutInflater();

    final View view = inflater.inflate(R.layout.Name_of_the_customized_layout, null);

    final EditText etxtChamp = view.findViewById(R.id.editText);


    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setMessage("Enter a Name")
            .setTitle("Mandatory field ex.");

    builder.setView(view);

    final Button btnOk = view.findViewById(R.id.ok);
    final Button btnCancel = view.findViewById(R.id.cancel);

    btnOk.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(etxtChamp.getText().toString().isEmpty()){
                etxtChamp.setError("Oups! ce champ est obligatoire!");
            }else{
                //Get the editText content and do whatever you want
                String messageEditText = etxtChamp.getText().toString();

                dismiss();
            }
        }
    });

    btnCancel.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            dismiss();
        }
    });

    return builder.create();
}
于 2019-08-06T20:11:47.613 に答える
0

ダイアログを表示するためにこのコードを使用します。

 public void onClick(DialogInterface dialog, int whichButton) {

            String textSt`enter code here`ring = trackName.getText().toString(); // Converts the value of getText to a string.
            if (textString != null && textString.trim().length() ==0)
            {       
                Context context = getApplicationContext();
                CharSequence error = "Please enter a track name" + textString;
                int duration = Toast.LENGTH_LONG;

                Toast toast = Toast.makeText(context, error, duration);
                toast.show();

                new AlertDialog.Builder(this)
                .setTitle("Message")
                .setMessage("please enter valid field")
                .setPositiveButton("OK", null).show();            
            }

これにより、ダイアログが作成されます。editText空であるか、必要な条件が何であるかを示します。

于 2012-01-24T04:06:45.387 に答える
0

//ビューがインスタンス化されていない場合、edittext値に対して常にnullを返します。

View v = inflater.inflate(R.layout.new_location_dialog, null);
builder.setView(v); 



final EditText titleBox = (EditText)v.findViewById(R.id.title);
final EditText descriptionBox = (EditText)v.findViewById(R.id.description); 
于 2013-03-05T12:02:55.197 に答える