ইনপুট পাঠ্য সংলাপ অ্যান্ড্রয়েড


298

যখন কোনও ব্যবহারকারী Buttonআমার অ্যাপে একটি ক্লিক করে (যা একটিতে মুদ্রিত SurfaceView), আমি একটি পাঠ্য Dialogউপস্থিত হতে চাই এবং আমি ফলাফলটি একটিতে সঞ্চয় করতে চাই String। আমি Dialogবর্তমান স্ক্রিনটি ওভারলে পাঠ্যটি চাই । কিভাবে আমি এটি করতে পারব?

উত্তর:


585

সতর্কতা ডায়ালগ ব্যবহার করার জন্য ভাল সুযোগের মতো মনে হচ্ছে ।

যতটা বেসিক বলে মনে হচ্ছে এটি করার জন্য অ্যান্ড্রয়েডের অন্তর্নির্মিত ডায়ালগ নেই (যতদূর আমি জানি)। ভাগ্যক্রমে, এটি একটি স্ট্যান্ডার্ড অ্যালার্টডায়ালগ তৈরির শীর্ষে কেবলমাত্র কিছু অতিরিক্ত কাজ। ডেটা ইনপুট করার জন্য আপনাকে কেবল এডিটেক্সট তৈরি করতে হবে এবং এটিকে সতর্কতা ডায়ালগের মতামত হিসাবে সেট করতে হবে। আপনার প্রয়োজন হলে সেটআপ ইনপুট টাইপ ব্যবহারের জন্য অনুমোদিত ধরণের ইনপুটটি কাস্টমাইজ করতে পারেন ।

আপনি যদি কোনও সদস্য ভেরিয়েবল ব্যবহার করতে সক্ষম হন তবে আপনি সহজেই পরিবর্তনটিকে এডিট টেক্সটের মানতে সেট করতে পারেন এবং ডায়ালগটি বরখাস্ত করার পরে এটি অবিরত থাকবে। আপনি যদি সদস্যের পরিবর্তনশীল ব্যবহার করতে না পারেন তবে স্ট্রিংয়ের মানটি সঠিক জায়গায় প্রেরণের জন্য আপনাকে শ্রোতা ব্যবহার করতে হবে। (যদি আপনার এটির প্রয়োজন হয় তবে আমি আরও সম্পাদনা করতে ও বিস্তৃত করতে পারি)।

আপনার শ্রেণীর মধ্যে:

private String m_Text = "";

আপনার বোতামের অনক্লিকলিস্টারের মধ্যে (বা সেখান থেকে ডাকা কোনও ফাংশনে):

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 builder = new AlertDialog.Builder (cont); চূড়ান্ত এডিটেক্সট ইনপুট = নতুন এডিট টেক্সট (বিরাম);

8
আমি মনে করি প্রসঙ্গের জন্য একটি বৈশ্বিক পরিবর্তনশীল তৈরির পরিবর্তে আপনি প্রসঙ্গটি পাস করতে পারবেন: "মেইনএকটিভিটি.এটি" (আপনি ব্যবহার করতে চাইছেন এমন ক্রিয়াকলাপের নামের সাথে "মেইনএকটিভিটি" পাঠ্যটি প্রতিস্থাপন করতে হবে)।
কুনাল 18

3
লক্ষ্য করার মতো বিষয়, বেশিরভাগ অ্যান্ড্রয়েড ইউআইয়ের মতো এটিও সমস্ত অ্যাসিনক্রোনাস ... এর অর্থ এটি পরবর্তী পদক্ষেপের গেট তৈরির কিছু না থাকলে ব্যবহারকারী ঠিক আছে ট্যাপ করার জন্য অপেক্ষা করবেন না ...
ইওল

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

এডিট টেক্সট ডায়ালগ তৈরি করতে ব্যবহৃত উদাহরণ লেআউটটি এখানে রয়েছে:

<?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>

চূড়ান্ত ফলাফল:

সম্পাদনা পাঠ্য সংলাপের উদাহরণ


10
দুর্দান্ত সমাধান! আমি সবেমাত্র এর সাথে প্রতিস্থাপন getView()করেছি findViewById(android.R.id.content)এবং এটি সমস্ত মনোযোগের মতো কাজ করেছে worked ভাগ করে নেওয়ার জন্য অনেক ধন্যবাদ :)
অতুল

ভিজ্যুবাইআইডি সহ সেই কাস্ট করতে ভুলবেন না (ViewGroup)!
মার্টিন এরলিক


1
@ জেপার্ক: অ্যান্ড্রয়েড.আর.আইডি.কন্টেন্ট আপনাকে একটি দৃশ্যের মূল উপাদান দেয়। এটি দয়া করে উল্লেখ করুন: 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>

আশা করি এটি সাহায্য করবে



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

@ লুকে টেলর: আমার কাছে বর্তমানে একই কাজ রয়েছে (একটি পপআপ / ডায়ালগ তৈরি করা হচ্ছে যাতে একটি সম্পাদনা পাঠ রয়েছে) ..
ব্যক্তিগতভাবে, আমি সৃজনশীলতার দিক থেকে সম্পূর্ণ গতিশীল রুটটি কিছুটা সীমাবদ্ধ দেখতে পেয়েছি। সম্পূর্ণ কাস্টম ডায়ালগ

লেআউট: ডায়ালগ তৈরির জন্য কোডের

উপর সম্পূর্ণ নির্ভরতার পরিবর্তে আপনি এটিকে সম্পূর্ণরূপে কাস্টমাইজ করতে পারেন:

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) ডাউনটাতে? আমি যে যুক্তিটি সরবরাহ করেছি ঠিক তেমন উদ্দেশ্যমূলক এবং বর্ণিত হিসাবে কাজ করে .. আমি অনুভব করেছি যে এটি এই পোস্টে একটি ভাল সংযোজন ছিল যা এখনও উল্লেখ করা হয়নি, এবং এটি একটি নিখুঁত বিকল্প বিকল্প সমাধান। তবে , আমি যে তথ্যটি দিয়েছি তার চেয়ে কম করার যদি আপনার বৈধ কারণ থাকে তবে আপনি কেন দয়া করে কিছু প্রসঙ্গ সরবরাহ করতে পারলে কিছুটা বেশি সহায়ক হবে, সুতরাং আমি এবং অন্যরা যুক্তিটি শিখতে এবং বুঝতে পারব .. ডাউনভোটস আসলে খুব হতে পারে শেখার প্রক্রিয়াটিতে দরকারী এবং সহায়ক - তবে কেবল যখন এর পিছনে প্রসঙ্গ থাকবে is
বি ডিজাইন

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.