इनपुट पाठ संवाद Android


298

जब कोई उपयोगकर्ता Buttonमेरे ऐप में (जो कि एक में मुद्रित होता है SurfaceView) पर क्लिक करता है , तो मुझे एक टेक्स्ट Dialogदिखाई देगा और मैं परिणाम को एक में स्टोर करना चाहूंगा String। मुझे Dialogवर्तमान स्क्रीन को ओवरले करने के लिए पाठ पसंद आएगा। मैं यह कैसे कर सकता हूँ?

जवाबों:


585

AlertDialog का उपयोग करने के लिए एक अच्छे अवसर की तरह लगता है ।

जैसा कि बुनियादी लगता है, एंड्रॉइड के पास ऐसा करने के लिए एक अंतर्निहित संवाद नहीं है (जहां तक ​​मुझे पता है)। सौभाग्य से, यह एक मानक AlertDialog बनाने के शीर्ष पर बस थोड़ा अतिरिक्त काम है। आपको बस उपयोगकर्ता को डेटा इनपुट करने के लिए एक EditText बनाने की आवश्यकता है, और इसे AlertDialog के दृश्य के रूप में सेट करें। यदि आप की जरूरत है, तो आप setInputType का उपयोग करके अनुमत प्रकार के इनपुट को अनुकूलित कर सकते हैं ।

यदि आप एक सदस्य चर का उपयोग करने में सक्षम हैं, तो आप बस चर को EditText के मान में सेट कर सकते हैं, और संवाद के खारिज होने के बाद यह जारी रहेगा। यदि आप एक सदस्य चर का उपयोग नहीं कर सकते हैं, तो आपको स्ट्रिंग मान को सही स्थान पर भेजने के लिए एक श्रोता का उपयोग करने की आवश्यकता हो सकती है। (यदि आपकी जरूरत है तो मैं इसे और अधिक विस्तृत और संपादित कर सकता हूं)।

आपकी कक्षा के भीतर:

private String m_Text = "";

अपने बटन के OnClickListener के भीतर (या वहाँ से बुलाए गए एक समारोह में):

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Title");

// Set up the input
final EditText input = new EditText(this);
// Specify the type of input expected; this, for example, sets the input as a password, and will mask the text
input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
builder.setView(input);

// Set up the buttons
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
    @Override
    public void onClick(DialogInterface dialog, int which) {
        m_Text = input.getText().toString();
    }
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        dialog.cancel();
    }
});

builder.show();

1
मुझे एक थ्रेड मिला है जो लगातार स्क्रीन ऑब्जेक्ट को अपडेट और रेंडर करता है, और मैं स्क्रीन ऑब्जेक्ट के अपडेट विधि के भीतर बिल्डर (शॉ) विधि को कॉल करता हूं।
ल्यूक टेलर

1
ओह। यदि आप एक श्रमिक धागे पर हैं, तो बिल्डर डालने की कोशिश करें। (); runOnUiThread के साथ कॉल करें, इस उदाहरण के समान: stackoverflow.com/a/3134720/1098302 या हो सकता है कि ऊपर दिए गए सभी कोडों को डालना बेहतर होगा (जो कि AlertDialog बनाता है) एक अलग विधि में, और runOnUiThread के भीतर से उस विधि को कॉल करें।
हारून

2
धन्यवाद। अच्छी बात है। हावेर, थोड़ी समस्या है। घोषणा करने की आवश्यकता है global Context, Context cont;और फिर, अल्टरडाटियोग में "इस" को बदलें cont। AlertDialog.Builder बिल्डर = new AlertDialog.Builder (cont); अंतिम EditText इनपुट = नया EditText (cont);

8
मुझे लगता है कि संदर्भ के लिए एक वैश्विक चर बनाने के बजाय, आप संदर्भ को पास कर सकते हैं जैसे: "MainActivity.this" (आपको पाठ "MainActivity" को उस गतिविधि वर्ग नाम से बदलना होगा जिसे आप उपयोग करना चाहते हैं)।
कुणाल १18

3
ध्यान देने योग्य बात हो सकती है कि अधिकांश एंड्रॉइड यूआई की तरह, यह सब अतुल्यकालिक है ... इसका मतलब यह है कि उपयोगकर्ता ठीक होने तक इंतजार नहीं करेगा जब तक कि आपके पास अगले कदम के लिए कुछ बनाने की ज़रूरत न हो ...
e

101

मैं एक दृष्टिकोण के साथ @ हारून के उत्तर को जोड़ूंगा जो आपको संवाद बॉक्स को बेहतर तरीके से स्टाइल करने का अवसर देता है। यहाँ एक समायोजित उदाहरण दिया गया है:

AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setTitle("Title");
// I'm using fragment here so I'm using getView() to provide ViewGroup
// but you can provide here any other instance of ViewGroup from your Fragment / Activity
View viewInflated = LayoutInflater.from(getContext()).inflate(R.layout.text_inpu_password, (ViewGroup) getView(), false);
// Set up the input
final EditText input = (EditText) viewInflated.findViewById(R.id.input);
// Specify the type of input expected; this, for example, sets the input as a password, and will mask the text
builder.setView(viewInflated);

// Set up the buttons
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        dialog.dismiss();
        m_Text = input.getText().toString();
    }   
}); 
builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        dialog.cancel();
    }   
}); 

builder.show();

यहाँ EditText डायलॉग बनाने के लिए उपयोग किया जाने वाला उदाहरण लेआउट है:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="@dimen/content_padding_normal">

    <android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <AutoCompleteTextView
            android:id="@+id/input"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/hint_password"
            android:imeOptions="actionDone"
            android:inputType="textPassword" />

    </android.support.design.widget.TextInputLayout>
</FrameLayout>

अंतिम परिणाम:

EditText डायलॉग उदाहरण


10
शानदार समाधान! मैं बस के getView()साथ बदल दिया findViewById(android.R.id.content)और यह सब आकर्षण की तरह काम किया। साझा करने के लिए बहुत बहुत धन्यवाद :)
अतुल

याद रखें कि खोज के साथ (ViewGroup)। देखें!
मार्टिन एरिक


1
@JPerk: android.R.id.content आपको एक दृश्य का मूल तत्व देता है। कृपया इसे देखें: stackoverflow.com/a/12887919/1911652
अतुल

1
बस सोच रहा था, लेकिन क्या मूल्य है @dimen/content_padding_normal?
एडिक

62

इस उदाहरण के बारे में कैसे ? सीधा सा लगता है।

final EditText txtUrl = new EditText(this);

// Set the default text to a link of the Queen
txtUrl.setHint("http://www.librarising.com/astrology/celebs/images2/QR/queenelizabethii.jpg");

new AlertDialog.Builder(this)
  .setTitle("Moustachify Link")
  .setMessage("Paste in the link of an image to moustachify!")
  .setView(txtUrl)
  .setPositiveButton("Moustachify", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
      String url = txtUrl.getText().toString();
      moustachify(null, url);
    }
  })
  .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
    }
  })
  .show(); 

3
आरोन के रूप में बहुत सुंदर है, लेकिन बिल्डर को जंजीर। दोनों काम ठीक के रूप में व्यक्तिगत पसंद की बात है।
स्कॉट बिग्स

12

आप कम से कुछ जगह चाहते हैं leftऔर rightके inputदेखने के लिए, आप जैसे कुछ गद्दी जोड़ सकते हैं

private fun showAlertWithTextInputLayout(context: Context) {
    val textInputLayout = TextInputLayout(context)
    textInputLayout.setPadding(
        resources.getDimensionPixelOffset(R.dimen.dp_19), // if you look at android alert_dialog.xml, you will see the message textview have margin 14dp and padding 5dp. This is the reason why I use 19 here
        0,
        resources.getDimensionPixelOffset(R.dimen.dp_19),
        0
    )
    val input = EditText(context)
    textInputLayout.hint = "Email"
    textInputLayout.addView(input)

    val alert = AlertDialog.Builder(context)
        .setTitle("Reset Password")
        .setView(textInputLayout)
        .setMessage("Please enter your email address")
        .setPositiveButton("Submit") { dialog, _ ->
            // do some thing with input.text
            dialog.cancel()
        }
        .setNegativeButton("Cancel") { dialog, _ ->
            dialog.cancel()
        }.create()

    alert.show()
}

dimens.xml

<dimen name="dp_19">19dp</dimen>

आशा है कि यह मदद करेगा


क्या है resources?
सेबेस्टियन पाल्मा

5

मैंने इसे AlertDialog.Builderकस्टम डायलॉग क्लास बनाने के लिए विस्तारित करने के लिए क्लीनर और अधिक पुन: प्रयोज्य पाया । यह एक संवाद के लिए है जो उपयोगकर्ता को फोन नंबर इनपुट करने के लिए कहता है। कॉल करने setNumber()से पहले कॉल करके एक प्रीसेट फोन नंबर भी दिया जा सकता है show()

InputSenderDialog.java

public class InputSenderDialog extends AlertDialog.Builder {

    public interface InputSenderDialogListener{
        public abstract void onOK(String number);
        public abstract void onCancel(String number);
    }

    private EditText mNumberEdit;

    public InputSenderDialog(Activity activity, final InputSenderDialogListener listener) {
        super( new ContextThemeWrapper(activity, R.style.AppTheme) );

        @SuppressLint("InflateParams") // It's OK to use NULL in an AlertDialog it seems...
        View dialogLayout = LayoutInflater.from(activity).inflate(R.layout.dialog_input_sender_number, null);
        setView(dialogLayout);

        mNumberEdit = dialogLayout.findViewById(R.id.numberEdit);

        setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int id) {
                if( listener != null )
                    listener.onOK(String.valueOf(mNumberEdit.getText()));

            }
        });

        setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int id) {
                if( listener != null )
                    listener.onCancel(String.valueOf(mNumberEdit.getText()));
            }
        });
    }

    public InputSenderDialog setNumber(String number){
        mNumberEdit.setText( number );
        return this;
    }

    @Override
    public AlertDialog show() {
        AlertDialog dialog = super.show();
        Window window = dialog.getWindow();
        if( window != null )
            window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        return dialog;
    }
}

dialog_input_sender_number.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:padding="10dp">

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        android:paddingBottom="20dp"
        android:text="Input phone number"
        android:textAppearance="@style/TextAppearance.AppCompat.Large" />

    <TextView
        android:id="@+id/numberLabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@+id/title"
        app:layout_constraintLeft_toLeftOf="parent"
        android:text="Phone number" />

    <EditText
        android:id="@+id/numberEdit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@+id/numberLabel"
        app:layout_constraintLeft_toLeftOf="parent"
        android:inputType="phone" >
        <requestFocus />
    </EditText>

</android.support.constraint.ConstraintLayout>

उपयोग:

new InputSenderDialog(getActivity(), new InputSenderDialog.InputSenderDialogListener() {
    @Override
    public void onOK(final String number) {
        Log.d(TAG, "The user tapped OK, number is "+number);
    }

    @Override
    public void onCancel(String number) {
        Log.d(TAG, "The user tapped Cancel, number is "+number);
    }
}).setNumber(someNumberVariable).show();

4

@LukeTaylor: वर्तमान में मेरे पास एक ही कार्य है (एक पॉपअप / संवाद बनाना जिसमें एक EditText शामिल है) ..
व्यक्तिगत रूप से, मैं पूरी तरह से गतिशील मार्ग को रचनात्मकता के मामले में कुछ हद तक सीमित पाता हूं।

पूरी तरह से डायलॉग लाइजनिंग: डायलॉग बनाने के लिए पूरी तरह से कोड पर

भरोसा करने के बजाय , आप इसे पूरी तरह से कस्टमाइज़ कर सकते हैं:

1) - एक नई Layout Resourceफाइल बनाएं .. यह आपके डायलॉग की तरह काम करेगा, जिससे पूरी रचनात्मक स्वतंत्रता मिल सकेगी!
नोट: सामग्री को साफ और बिंदु पर रखने में मदद करने के लिए सामग्री डिजाइन दिशानिर्देशों का संदर्भ लें।

2) - अपने सभी Viewतत्वों के लिए आईडी दें .. नीचे मेरे उदाहरण कोड में, मेरे पास 1 EditText, और 2 है Buttons

3) - एक के Activityसाथ बनाएँButton, परीक्षण के प्रयोजनों के लिए .. हम इसे बढ़ाने और अपने संवाद शुरू करेंगे!

public void buttonClick_DialogTest(View view) {

    AlertDialog.Builder mBuilder = new AlertDialog.Builder(MainActivity.this);

    //  Inflate the Layout Resource file you created in Step 1
    View mView = getLayoutInflater().inflate(R.layout.timer_dialog_layout, null);

    //  Get View elements from Layout file. Be sure to include inflated view name (mView)
    final EditText mTimerMinutes = (EditText) mView.findViewById(R.id.etTimerValue);
    Button mTimerOk = (Button) mView.findViewById(R.id.btnTimerOk);
    Button mTimerCancel = (Button) mView.findViewById(R.id.btnTimerCancel);

    //  Create the AlertDialog using everything we needed from above
    mBuilder.setView(mView);
    final AlertDialog timerDialog = mBuilder.create();

    //  Set Listener for the OK Button
    mTimerOk.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick (View view) {
            if (!mTimerMinutes.getText().toString().isEmpty()) {
                Toast.makeText(MainActivity.this, "You entered a Value!,", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(MainActivity.this, "Please enter a Value!", Toast.LENGTH_LONG).show();
            }
        }
    });

    //  Set Listener for the CANCEL Button
    mTimerCancel.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick (View view) {
            timerDialog.dismiss();
        }
    });

    //  Finally, SHOW your Dialog!
    timerDialog.show();


    //  END OF buttonClick_DialogTest
}


केक का टुकड़ा! पूर्ण रचनात्मक स्वतंत्रता! बस सामग्री दिशानिर्देशों का पालन करना सुनिश्चित करें;)

मुझे आशा है कि यह किसी की मदद करता है! आप लोग क्या सोचते हैं मुझे बताएं!


2
बस उत्सुक क्यों (-1) डाउनवोट? मैंने जो तर्क प्रदान किया है वह ठीक उसी तरह है जैसा कि इरादा था और जैसा कि वर्णित है .. मुझे लगा कि यह इस पोस्ट के लिए एक अच्छा जोड़ था जिसका अभी तक उल्लेख नहीं किया गया है, और यह पूरी तरह से ध्वनि वैकल्पिक समाधान है। हालाँकि , यदि आपके पास मेरे द्वारा दी गई जानकारी को डाउनवोट करने का एक वैध कारण है, तो यह थोड़ा अधिक सहायक होगा यदि आप ऐसा करने के लिए कुछ संदर्भ प्रदान कर सकते हैं, तो मैं और अन्य लोग तर्क को जान और समझ सकते हैं .. डाउनवोट्स वास्तव में बहुत हो सकते हैं सीखने की प्रक्रिया में उपयोगी और सहायक - लेकिन केवल तभी जब इसके पीछे संदर्भ हो।
Studio2bDesigns

4

यह मेरे लिए काम है

private void showForgotDialog(Context c) {
        final EditText taskEditText = new EditText(c);
        AlertDialog dialog = new AlertDialog.Builder(c)
                .setTitle("Forgot Password")
                .setMessage("Enter your mobile number?")
                .setView(taskEditText)
                .setPositiveButton("Reset", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        String task = String.valueOf(taskEditText.getText());
                    }
                })
                .setNegativeButton("Cancel", null)
                .create();
        dialog.show();
    }

कैसे कॉल करें? (वर्तमान गतिविधि का नाम)

showForgotDialog (current_activity_name.this);

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.