কীভাবে কাস্টম সতর্কতা ডায়ালগ ভিউ বাস্তবায়ন করবেন


107

ইন AlertDialog তে Android দস্তাবেজ , এটা নিম্নলিখিত নির্দেশ এবং AlertDialog এ একটি কাস্টম দৃশ্য সেট করার জন্য উদাহরণস্বরূপ দেয়:

আপনি যদি আরও জটিল দর্শন প্রদর্শন করতে চান তবে "বডি" নামে ফ্রেমলআউটটি দেখুন এবং এতে আপনার ভিউ যুক্ত করুন:

FrameLayout fl = (FrameLayout) findViewById(R.id.body);
fl.add(myView, new LayoutParams(FILL_PARENT, WRAP_CONTENT));

প্রথমত, এটি বেশ স্পষ্টত যা add()টাইপো এবং এটি বোঝানো হচ্ছে addView()

আমি প্রথম লাইনে আর.আইডি.ডি ব্যবহার করে বিভ্রান্ত হয়ে পড়েছি। দেখে মনে হচ্ছে এটি সতর্কতা ডায়ালগের মূল উপাদান ... তবে আমি কেবল আমার কোড বি / সিতে এটি প্রবেশ করতে পারি না এটি একটি সংকলন ত্রুটি দেয়। আর.আইডি.বিডি কোথায় সংজ্ঞায়িত বা নির্ধারিত বা যা কিছু পেতে পারে?

আমার কোড এখানে। আমি setView(findViewById(R.layout.whatever)বিল্ডারে ব্যবহার করার চেষ্টা করেছি কিন্তু এটি কার্যকর হয়নি। আমি ধরে নিচ্ছি কারণ আমি ম্যানুয়ালি এটি স্ফীত করি নি?

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Title")
    .setCancelable(false)
    .setPositiveButton("Go", new DialogInterface.OnClickListener() {

    @Override
    public void onClick(DialogInterface dialog, int id) {
        EditText textBox = (EditText) findViewById(R.id.textbox);
        doStuff();
    }
});

FrameLayout f1 = (FrameLayout)findViewById(R.id.body /*CURRENTLY an ERROR*/);
f1.addView(findViewById(R.layout.dialog_view));

AlertDialog alert = builder.create();
alert.show();


3
এক-লাইনের উত্তর: .setView(getLayoutInflater().inflate(R.layout.dialog_view, null))নির্মাতাকে যুক্ত করুন। সার্জিও ভিউডসকে ক্রেডিট, নীচে।
1 ''

উত্তর:


49

আপনি সঠিক, আপনি ম্যানুয়ালি এটি উত্সাহিত করেন নি কারণ এটি। এটি প্রদর্শিত হয় যে আপনি আপনার ক্রিয়াকলাপের বিন্যাস থেকে "বডি" আইডি "বের করার" চেষ্টা করছেন এবং এটি কার্যকর হবে না।

আপনি সম্ভবত এরকম কিছু চান:

LayoutInflater inflater = getLayoutInflater();
FrameLayout f1 = (FrameLayout)alert.findViewById(android.R.id.body);
f1.addView(inflater.inflate(R.layout.dialog_view, f1, false));

17
আকর্ষণীয়ভাবে যথেষ্ট, শরীর অ্যান্ড্রয়েড.আর.আইডে ধ্রুবক হিসাবে সংজ্ঞায়িত হয় না। আমি কীভাবে তৈরি অ্যালার্টডায়ালগের 'বডি' উপাদানটি অ্যাক্সেস করব সে সম্পর্কে এখনও স্পষ্ট নয়। আমি কীভাবে এটি করতে হয় তা জানতে চাই, তবে আপাতত আমি কেবলমাত্র একটি ভিউ ফুটিয়ে তুলতে এবং বিল্ডারে সেটভিউ ব্যবহার করার চেষ্টা করব।
stormin986

2
আসলে এটি তখনও আমাকে একটি প্রশ্ন রেখে দেয় (আমি নতুন দৃষ্টিভঙ্গিতে নতুন)। ব্যবহার করে builder.setView(inflater.inflate(R.id.dialog, ROOT_VIEWGROUP[, ATTACH_TO_ROOT])), দস্তাবেজগুলি বলে যে রুট ভিউগ্রুপটি alচ্ছিক। এই ক্ষেত্রে এই ব্যবহার করা উচিত? যদি তাই হয় ... তবুও কীভাবে সতর্কতা ডায়ালগের একটি রেফারেন্স পাবেন তা নির্ধারণ করতে হবে ...
stormin986

2
এটি isচ্ছিক, তবে তারপরে আপনি যে লেআউটটি স্ফীত করছেন তার ভিতরে পিতামাতার কাছে কোনও রেফারেন্স পাবেন না। অ্যান্ড্রয়েডের মতো জিনিসগুলি: লেআউট_গ্রাভাটি শীর্ষ স্তরের দৃশ্যে কাজ করবে না ... এবং সম্ভবত আপনার সেগুলির প্রয়োজন হবে না। আপনি যখন সতর্কতা ডায়ালগ সতর্কতা = builder.create () কল করেন তখন আপনার সতর্কতা ডায়ালগের একটি উল্লেখ রয়েছে। দীর্ঘ উত্তর সংক্ষিপ্ত, এটি is চ্ছিক। আপনার কাস্টম বিন্যাসে আপনি কী করছেন তার উপর নির্ভর করে এটি ব্যবহার করে দেখুন, সম্ভবত এটি কাজ করবে।
synic

2
আমি রেফারেন্স স্পষ্ট নই দৃশ্য AlertDialog মধ্যে। আমি যদি অভিভাবককে রেফারেন্স করতে চাই না তবে এই ক্ষেত্রে আপনি কী করবেন? আমি সতর্কতা ডায়ালগের মধ্যে কেবলমাত্র সেই জিনিসটি দেখি যা একটি ভিউ দেয়: হ'ল কর্নারফোকাস ()
stormin986

5
ধরুন সম্মুখের Viewআপনি ফোলান। আপনি যখন এর বিষয়বস্তু থেকে জিনিস প্রয়োজন হবে তখন কল findViewById()করুন View। দেখুন: github.com/commonsguy/cw-android/tree/master/Database/Constants
CommonsWare

159

আপনি নিজের বিন্যাসটি সরাসরি লেআউট ইনফ্ল্যাটার থেকে তৈরি করতে পারেন, আপনাকে কেবল আপনার লেআউট এক্সএমএল ফাইলের নাম এবং ফাইলে বিন্যাসের আইডি ব্যবহার করতে হবে।

আপনার এক্সএমএল ফাইলটির আইডি থাকা উচিত:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/dialog_layout_root"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"
              android:padding="10dp"
              />

এবং তারপরে আপনি নিচের কোডটি দিয়ে আপনার বিন্যাসটি সেট করতে পারেন:

LayoutInflater inflater = getLayoutInflater();
View dialoglayout = inflater.inflate(R.layout.dialog_layout, null);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(dialoglayout);
builder.show();

4
আর এই উদাহরণে আর.আইডি.ডায়ালগ_লেআউট_রোট কোথায়? বর্তমান ক্রিয়াকলাপে কি এটি দৃশ্য নয়?
অ্যালেক্স প্রেতজেলাভ

5
@ অ্যালেক্সপ্রেটজ্লাভ: এই উদাহরণে ডায়লগ_লয়আউট_রূটের দরকার নেই। আপনার কেবলমাত্র R.layout এর জন্য আপনার এক্সএমএল ফাইলের নাম [[name_of_xML_file]।
ইগোরগানাপলস্কি

7
@ টেম্পেরেজ আপনি শেষদিকে বিল্ডার.শো যুক্ত করেছেন? আমি এই কোডটি চেষ্টা করেছিলাম এবং এটি কার্যকর হয়েছে। এছাড়াও আমি infalter.inflate জন্য দ্বিতীয় পরামিতি হিসাবে নাল পাস
Vinoth

2
এটি সেরা উত্তর হিসাবে নির্বাচন করা উচিত ছিল।
সালমান খকওয়ানি

2
কাস্টম লেআউটে একটি এডিটেক্সট থাকে তখন এটি ক্লাসকাস্টএক্সেপশন দেয়, কারণ সম্পাদনা getCurrentFocus()পাঠ্য ফেরত আসবে এবং একটি সম্পাদনা পাঠ্য ভিউগ্রুপে কাস্ট করা যাবে না। nullদ্বিতীয় যুক্তি হিসাবে এটি স্থির করে ।
1 ''

20

android.R.id.custom আমার জন্য শূন্য ছিল। যদি কেউ একই সমস্যা থেকে আসে তবে আমি এটি কাজ করতে সক্ষম হয়েছি,

AlertDialog.Builder builder = new AlertDialog.Builder(context)
            .setTitle("My title")
            .setMessage("Enter password");
final FrameLayout frameView = new FrameLayout(context);
builder.setView(frameView);

final AlertDialog alertDialog = builder.create();
LayoutInflater inflater = alertDialog.getLayoutInflater();
View dialoglayout = inflater.inflate(R.layout.simple_password, frameView);
alertDialog.show();

রেফারেন্সের জন্য, আর.লাইআউট.সিম্পল_পাসওয়ার্ডটি হ'ল:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent">

<EditText
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/password_edit_view"
        android:inputType="textPassword"/>
<CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/show_password"
        android:id="@+id/show_password_checkbox"
        android:layout_gravity="left|center_vertical"
        android:checked="false"/>

</LinearLayout>

জন রেলিস আপনার সমাধান ভাল কাজ করে। শুধু কিছু আছে। আমাদের বিল্ডার.ক্রেট তৈরি এবং ফ্রেমভিউ.সেটলয়েআউটপ্যারামস সেট করার আগে (নতুন লেআউটপ্যারামস (লেআউটপ্যারামস। ওয়ার্প_সন্টেন্ট, লেআউটপ্যারামস.আরপ_সিএনএটিএন)) সেট করা উচিত; বা প্রথমে কিছু, এটি এমন কিছু বাগ প্রতিরোধ করবে যা প্রত্যাশিত নয়
MOBYTELAB

প্রতিক্রিয়াটির জন্য ধন্যবাদ .. আপনি বিল্ডার.ক্রেট () এর আগে কীভাবে ফুলে উঠছেন? সংলাপের
ইনফ্লেটারে স্ফীতকে

আমরা অ্যাক্টিভিটি ইনফ্লেটার ব্যবহার করতে পারি, এবং ফ্রেমলআউটকে সংযুক্ত করতে পারি না, তাই আমরা এর মতো একটি সামান্য কোড হ্রাস করতে পারি lerআরল্টডায়ালগ.বিল্ডার বিল্ডার = নতুন সতর্কতা ডায়ালগ.বিল্ডার (নতুন কনটেক্সট থিম ওয়ার্যাপ (getActivity (), android.R.style.Theme_Holo)) সেটেল ("শিরোনাম") .setIcon (আর। ডিড্রোয়েবল। নমুনা_ আইকন); ঝামেলা দেখুন = inflater.inflate (R.layout.sample_layout, নাল, মিথ্যা); builder.setView (troubleView); সতর্কতা = builder.create (); দুঃখিত, আমি কীভাবে মন্তব্যে কোডটি স্পষ্টভাবে লিখতে জানি না
MOBYTELAB

এটি কেবল ডিজাইন বাগ সম্পর্কে, আমরা যদি সমস্ত লেআউট এক্সএমএল-তে সংগ্রহ করি এবং ফ্রেমলেআউটটি ডায়ালগের মূল হিসাবে ভুলে যাই, তবে এক্সএমএল-এ লেআউটটি প্যারেন্ট বা কিছু না ভরাট হলে আমরা কৌতূহলী হতে পারি just
মোবিটাইলব

আমার জন্য কাজ, ধন্যবাদ! এটি আমাকে ত্রুটি ছাড়াই সম্পাদনা পাঠ্য সহ একটি শিরোনাম এবং আমার বাতিল এবং ঠিক আছে বোতাম যুক্ত করতে সক্ষম করে। :) কেবল প্রশ্ন, এটি কিভাবে কাজ করে? না FrameLayoutপ্রকারের একটি টুকরা হিসাবে কাজ? আমি উপরের অ্যান্ড্রুক্স 2 এর উত্তরটি চেষ্টা করার সময়, আমি একটি ত্রুটি পেয়েছি কারণ মনে হয়েছিল আমি দুটি লেআউট স্ফীত করছি (এটি আমার ধারণা)।
আজুরস্পট

17

অ্যান্ড্রয়েড ডকুমেন্টগুলি ত্রুটিগুলি সংশোধন করার জন্য সম্পাদনা করা হয়েছে।

সতর্কতা ডায়ালগের ভিতরে থাকা ভিউকে বলা হয় android.R.id.custom

http://developer.android.com/reference/android/app/AlertDialog.html



8

কাস্টম সতর্কতা ডায়ালগ

এই পুরো উদাহরণটির মধ্যে ক্রিয়াকলাপে ডেটা পাঠানো অন্তর্ভুক্ত।

এখানে চিত্র বর্ণনা লিখুন

একটি কাস্টম বিন্যাস তৈরি করুন

একটি সাধারণ একটি EditTextউদাহরণ সহ একটি লেআউট ব্যবহৃত হয়, তবে আপনি এটি আপনার পছন্দসই কিছুতে প্রতিস্থাপন করতে পারেন।

custom_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:paddingLeft="20dp"
              android:paddingRight="20dp"
              android:layout_width="match_parent"
              android:layout_height="match_parent">

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

কোডটিতে ডায়ালগটি ব্যবহার করুন

মূল অংশগুলি হ'ল

  • setViewকাস্টম লেআউট বরাদ্দ করতে ব্যবহার করেAlertDialog.Builder
  • কোনও ডায়ালগ বোতাম ক্লিক করা হলে ক্রিয়াকলাপে কোনও ডেটা প্রেরণ করা।

উপরের চিত্রটিতে প্রদর্শিত উদাহরণ প্রকল্পের এটি সম্পূর্ণ কোড:

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void showAlertDialogButtonClicked(View view) {

        // create an alert builder
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Name");

        // set the custom layout
        final View customLayout = getLayoutInflater().inflate(R.layout.custom_layout, null);
        builder.setView(customLayout);

        // add a button
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // send data from the AlertDialog to the Activity
                EditText editText = customLayout.findViewById(R.id.editText);
                sendDialogDataToActivity(editText.getText().toString());
            }
        });

        // create and show the alert dialog
        AlertDialog dialog = builder.create();
        dialog.show();
    }

    // do something with the data coming from the AlertDialog
    private void sendDialogDataToActivity(String data) {
        Toast.makeText(this, data, Toast.LENGTH_SHORT).show();
    }
}

মন্তব্য

  • আপনি যদি নিজেকে একাধিক জায়গায় এটি ব্যবহার করে DialogFragmentদেখতে পান তবে ডকুমেন্টেশনে বর্ণিতভাবে একটি সাবক্লাস তৈরি করা বিবেচনা করুন ।

আরো দেখুন


1
EditText editText = customLayout.findViewById(R.id.editText); হওয়া উচিত EditText editText = (EditText) customLayout.findViewById(R.id.editText);
ফিলক্রুজ

4
@ ফিলক্রুজ, যদি আপনি অ্যান্ড্রয়েড স্টুডিও 3.0.০ এ আপগ্রেড করেন তবে আপনাকে আর স্পষ্টভাবে ভিউ কাস্ট করতে হবে না। আইডিই টাইপটি অনুমান করতে পারে। এটি খুব সুন্দর বৈশিষ্ট্য। এটি কোডটি অনেক পরিষ্কার করতে সহায়তা করে।
সুরগাচ

দুর্দান্ত উত্তর, সত্যই সহায়ক
নূর হোসেন

4

আমার পক্ষে কার্যকর কোডগুলির সহজ লাইনগুলি নিম্নরূপ:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(R.layout.layout_resource_id);
builder.show();

লেআউটটির ধরণ যাই হোক না কেন (লিনিয়ারলআউট, ফ্রেমলআউট, রিলেটিভলআউট) কাজ setView করবে এবং কেবল চেহারা এবং আচরণে পৃথক হবে।


দুর্দান্ত, সহজ এবং সহজ
ফ্রাঙ্ক এনো

2

এটি করার সহজতম উপায় হ'ল এইচআই 21 এর নীচে কোথায় ব্যবহার করা যায় android.support.v7.app.AlertDialogতার পরিবর্তে ব্যবহার করা ।android.app.AlertDialogpublic AlertDialog.Builder setView (int layoutResId)

new AlertDialog.Builder(getActivity())
    .setTitle(title)
    .setView(R.layout.dialog_basic)
    .setPositiveButton(android.R.string.ok,
        new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                //Do something
            }
        }
    )
    .setNegativeButton(android.R.string.cancel,
        new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                //Do something
            }
        }
    )
    .create();

এপিআই 21 চালু হওয়ার পরে যে কেউ এ পড়ছেন তাদের এই পদ্ধতিটি ব্যবহার করা উচিত। উত্তরের হিসাবে উল্লেখ করা হয়েছে, যদি আপনার অ্যাপ্লিকেশন minSDKversion 21 এর চেয়ে কম হয়, সমর্থন প্যাকেজ থেকে অ্যালারডায়লগটি ব্যবহার করুন। ভয়েলা !!!
ডিবিজমানিয়া

2

AlertDialog.setView(View view)দেওয়া দৃশ্য জোড়ে R.id.custom FrameLayout। নিম্নলিখিতটি অ্যান্ড্রয়েড উত্স কোডের স্নিপেট AlertController.setupView()যা থেকে অবশেষে এটি পরিচালনা করে ( পদ্ধতিটিতে mViewদেওয়া ভিউ AlertDialog.setView)।

...
FrameLayout custom = (FrameLayout) mWindow.findViewById(R.id.**custom**);
custom.addView(**mView**, new LayoutParams(FILL_PARENT, FILL_PARENT));
...

1

এটি এন্ড্রয়েড.আর.আইডি.কোস্টম আইডিটি পরিবর্তন করার পরে, ভিউটি প্রদর্শনের জন্য আমাকে নিম্নলিখিতগুলি যুক্ত করতে হবে:

((View) f1.getParent()).setVisibility(View.VISIBLE);

যাইহোক, এর ফলে নতুন দৃশ্যের ব্যাকগ্রাউন্ড ছাড়াই বড় প্যারেন্ট ভিউতে রেন্ডার হয়ে যায়, ডায়ালগ বক্সটি দুটি ভাগে ভাঙা হয় (এর মধ্যে নতুন ভিউ সহ পাঠ্য এবং বোতাম)। বার্তাটির পাশে আমার ভিউটি tingোকিয়ে আমি শেষ পর্যন্ত যে প্রভাবটি চেয়েছিলাম তা পেয়েছি:

LinearLayout f1 = (LinearLayout)findViewById(android.R.id.message).getParent().getParent();

View.getParent () এবং View.getChildAt (int) সহ ভিউ ট্রি অন্বেষণ করে আমি এই সমাধানটি পেয়েছি। যদিও উভয় সম্পর্কে সত্যিই খুশি না। এগুলির কোনও অ্যান্ড্রয়েড ডক্সে নেই এবং যদি তারা কখনও সতর্কতা ডায়ালগের কাঠামো পরিবর্তন করে তবে এটি সম্ভবত ভেঙে যেতে পারে।


1

কোডটি ন্যূনতম পরিমাণে এটি করা সবচেয়ে সার্থক হবে।

new AlertDialog.Builder(this).builder(this)
        .setTitle("Title")
        .setView(R.id.dialog_view)   //notice this setView was added
        .setCancelable(false)
        .setPositiveButton("Go", new DialogInterface.OnClickListener() {
            @Override 
            public void onClick(DialogInterface dialog, int id) {
                EditText textBox = (EditText) findViewById(R.id.textbox);
                doStuff();
            }
        }).show();

আপনি সেট করতে পারেন এমন জিনিসের বর্ধিত তালিকার জন্য .setঅ্যান্ড্রয়েড স্টুডিওতে টাইপ করা শুরু করুন

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