টুকরা থেকে সংলাপ দেখান?


119

আমার কিছু টুকরো রয়েছে যা নিয়মিত ডায়ালগ দেখানো দরকার। এই সংলাপগুলিতে ব্যবহারকারী একটি হ্যাঁ / না উত্তর চয়ন করতে পারেন এবং তারপরে খণ্ডটি সেই অনুযায়ী আচরণ করা উচিত।

এখন, ক্লাসটির ওভাররাইড করার Fragmentকোনও onCreateDialog()পদ্ধতি নেই, সুতরাং আমি অনুমান করি যে আমাকে সংলাপের বাইরে ডায়ালগগুলি প্রয়োগ করতে হবে Activity। এটি ঠিক আছে, তবে তারপরে Activityবেছে নেওয়া উত্তরটি খণ্ড খণ্ডকে কোনওভাবে ফেরত দেওয়ার প্রয়োজন। আমি অবশ্যই এখানে কলব্যাক প্যাটার্নটি ব্যবহার করতে পারি, তাই খণ্ডটি Activityশ্রোতা শ্রেণীর সাথে নিজেই নিবন্ধিত হয় এবং ক্রিয়াকলাপটি উত্তরটি বা সেই জাতীয় কিছুতে ফিরিয়ে দেয়।

তবে এটি কোনও খণ্ডে "সাধারণ" হ্যাঁ-না ডায়ালগ প্রদর্শিত হিসাবে একটি সাধারণ কাজের জন্য এটি বেশ বড় জগাখিচুড়ি বলে মনে হচ্ছে। এছাড়াও, এইভাবে আমার Fragmentকম স্বনির্ভর হবে।

এটি করার কিছু ক্লিনার উপায় আছে কি?

সম্পাদনা:

এই প্রশ্নের উত্তরটি কীভাবে ডায়ালগফ্রেগমেন্টগুলি কীভাবে খণ্ডগুলি থেকে ডায়ালগ প্রদর্শন করতে হবে তা বিশদভাবে ব্যাখ্যা করে না। সুতরাং আফাইক, যাওয়ার উপায় হ'ল:

  1. একটি খণ্ড প্রদর্শন করুন।
  2. যখন প্রয়োজন হয়, একটি ডায়ালগফ্র্যাগমেন্ট ইনস্ট্যান্ট করুন।
  3. সহ এই ডায়ালগফ্রেগমেন্টের লক্ষ্য হিসাবে মূল খণ্ডটি সেট করুন .setTargetFragment()
  4. মূল টুকরা থেকে .show () দিয়ে ডায়ালগফ্রেগমেন্টটি দেখান।
  5. যখন ব্যবহারকারী এই ডায়ালগফ্রেগমেন্টে কিছু বিকল্প চয়ন করেন, তখন এই নির্বাচনটি সম্পর্কে মূল অংশটিকে অবহিত করুন (যেমন ব্যবহারকারী 'হ্যাঁ' ক্লিক করেছেন), আপনি .getTarget () সহ মূল খণ্ডটির রেফারেন্স পেতে পারেন।
  6. ডায়ালগফ্রেগমেন্টটি খারিজ করুন।

1
আপনার কৌশলটি কাজ করে, যখন কোনও স্ক্রিন ঘূর্ণন ঘটে except আমি তখন একটি বাহিনী পেতে। কোন ধারনা?
ওয়েস্টন

: Zsombor প্রথম উত্তর খুঁজে বার করো @Weston stackoverflow.com/questions/8235080/...
mightimaus

উত্তর:


37

পরিবর্তে আপনার ডায়ালগফ্রেগমেন্ট ব্যবহার করা উচিত ।


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

আপনার যদি কোনও লিস্টফ্রেগমেন্ট থাকে যাতে ডায়ালগগুলি প্রদর্শন করা দরকার, সেগুলি উভয়ই বাড়িয়ে দিতে পারে না
মার্চিন্রাম

16
লিস্টফ্রেগমেন্ট সাবক্লাসটি ডায়ালগফ্রেগমেন্টটি ডায়ালগফ্রেগমেন্ট সাবক্ল্যাসিং করে নয়, নতুন ইনস্ট্যান্টিয়েটেড ব্যবহার করবে। (একটি ডায়ালগফ্রেগমেন্ট হ'ল একটি ডায়ালগ যা খণ্ড হিসাবে কার্যকর করা হয়, কোনও খণ্ড নয় যা ডায়ালগগুলি প্রদর্শন করতে পারে))
এনএমআর

4
দয়া করে কিছু স্নিপেট যুক্ত করুন যাতে আমরা eaisly বুঝতে পারি
অর্পিত প্যাটেল

35

পূর্বের গৃহীত উত্তরে আমার সতর্কতার সাথে সন্দেহ করতে হবে যে ডায়ালগফ্রেগমেন্ট ব্যবহার করা সেরা বিকল্প। অভিপ্রেত (প্রাথমিক) DialogFragment উদ্দেশ্য টুকরা যে প্রদর্শন করে মনে করা হয় হয় ডায়ালগ নিজেদের, প্রদর্শন টুকরা যে না আছে প্রদর্শনে ডায়ালগ।

আমি বিশ্বাস করি যে ডায়ালগ এবং টুকরাটির মধ্যে মধ্যস্থতা করার জন্য খণ্ডটির ক্রিয়াকলাপ ব্যবহার করা পছন্দনীয় বিকল্প।


10
যেহেতু পরিচালিত কথোপকথনগুলি ( onCreateDialog) পদ্ধতির শিগগিরই হ্রাস করা হবে, তাই আমি দ্বিমত পোষণ করব এবং বলব যে DialogFragmentএটি অবশ্যই যাওয়ার উপায়।
ডেভ

4
গৃহীত উত্তরের অর্থ হল একটি ডায়ালগের পরিবর্তে ডায়ালগফ্রেগমেন্ট ব্যবহার করুন, তালিকাগুলির পরিবর্তে নয়, এএএএফএস।
এনএমআর

প্রকৃতপক্ষে একটি কথোপকথন খণ্ডটি একটি ডায়ালগ এবং সাধারণ টুকরা উভয় হিসাবে ব্যবহার করা যেতে পারে - এম্বেড করা ডেভেলপার
ক্লাইভ জেফারিজ

@ ক্লাইভ জেফারিগুলি এটি পারে তবে এখনও নিজের মধ্যে থেকে অন্যান্য সংলাপগুলি দেখানোর কথা নয়। আমার মনে হয় এখানে ছেলেরা প্রশ্নটি ভুল করে ফেলছে।
মার্সেল ব্রো

@ অ্যানোনিইম এটি কীভাবে ডায়ালগ খণ্ডটি ব্যবহৃত হচ্ছে তার উপর নির্ভর করে। এটি যদি নিয়মিত খণ্ড হিসাবে ব্যবহৃত হয় তবে তা ঠিক আছে। যদি এটি একটি কথোপকথন হিসাবে ব্যবহৃত হয়, তবে হ্যাঁ, আপনি অন্য ডায়ালগটি দেখানো উচিত নয়।
ক্লাইভ জেফারিস

24

হ্যাঁ / না ডায়ালগফ্র্যাগমেন্টের সম্পূর্ণ উদাহরণ এখানে:

শ্রেণী:

public class SomeDialog extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new AlertDialog.Builder(getActivity())
            .setTitle("Title")
            .setMessage("Sure you wanna do this!")
            .setNegativeButton(android.R.string.no, new OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // do nothing (will close dialog)
                }
            })
            .setPositiveButton(android.R.string.yes,  new OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // do something
                }
            })
            .create();
    }
}

কথোপকথন শুরু করতে:

        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        // Create and show the dialog.
        SomeDialog newFragment = new SomeDialog ();
        newFragment.show(ft, "dialog");

আপনি ক্লাসটিকে অন ক্লিকলিস্টনার প্রয়োগ করতে এবং এম্বেড শ্রোতার পরিবর্তে এটি ব্যবহার করতে দিতে পারেন।

ক্রিয়াকলাপে কলব্যাক

আপনি যদি কলব্যাক প্রয়োগ করতে চান তবে এটি আপনার ক্রিয়াকলাপে এটি করা হয়:

YourActivity extends Activity implements OnFragmentClickListener

এবং

@Override
public void onFragmentClick(int action, Object object) {
    switch(action) {
        case SOME_ACTION:
        //Do your action here
        break;
    }
}

কলব্যাক ক্লাস:

public interface OnFragmentClickListener {
    public void onFragmentClick(int action, Object object);
}

তারপরে কোনও খণ্ড থেকে কলব্যাক করার জন্য আপনার শ্রোতার এইরকম সংযুক্ত রয়েছে তা নিশ্চিত হওয়া দরকার:

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    try {
        mListener = (OnFragmentClickListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString() + " must implement listeners!");
    }
}

এবং একটি কলব্যাক এইভাবে সম্পাদন করা হয়:

mListener.onFragmentClick(SOME_ACTION, null); // null or some important object as second parameter.

4
এই কীভাবে একটি টুকরা থেকে এটা শুরু করার জন্য
akohout

@ আরভেন আপনি কেবল আপনার ক্রিয়াকলাপে একটি কলব্যাক করতে চান যা খণ্ডটি শুরু করবে।
ওয়ারপজিট

@ ওয়ারপজিট বিস্তৃত উত্তরের জন্য আপনাকে ধন্যবাদ। আমি ফ্র্যাগমেন্টম্যানেজারকে স্পর্শ করার ভয় পাচ্ছি যা আমি ইতিমধ্যে দুষ্ট কাজ করছি ... আমি কীভাবে অন্লিক ইভেন্টগুলিকে (নন-ডায়ালগ) টুকরাটিতে পাস করতে পারি যার ব্যবহারকারীর ইনপুট দরকার? বিটিডাব্লু, লেনদেনটি ব্যাকস্টকে যুক্ত করা উচিত নয়?
কায়ে

ক্রিয়াকলাপ থেকে @ কেএ আপনি নতুন ইনপুট প্রয়োজন এমন প্রদত্ত খণ্ডে যে কোনও পাবলিক পদ্ধতিতে কল করতে পারেন। সেখান থেকে এটি নতুন সামগ্রীর সাথে আপডেট করা বেশ সহজ হওয়া উচিত।
ওয়ারপজিট

1
রিচার্ডলিমেসুরিয়ার প্রকৃতপক্ষে টুকরো টুকরো টুকরো
ওয়ারপজিট

13

আমার জন্য, এটি নিম্নলিখিত ছিল-

MyFragment:

public class MyFragment extends Fragment implements MyDialog.Callback
{
    ShowDialog activity_showDialog;

    @Override
    public void onAttach(Activity activity)
    {
        super.onAttach(activity);
        try
        {
            activity_showDialog = (ShowDialog)activity;
        }
        catch(ClassCastException e)
        {
            Log.e(this.getClass().getSimpleName(), "ShowDialog interface needs to be     implemented by Activity.", e);
            throw e;
        }
    }

    @Override
    public void onClick(View view) 
    {
        ...
        MyDialog dialog = new MyDialog();
        dialog.setTargetFragment(this, 1); //request code
        activity_showDialog.showDialog(dialog);
        ...
    }

    @Override
    public void accept()
    {
        //accept
    }

    @Override
    public void decline()
    {
        //decline
    }

    @Override
    public void cancel()
    {
        //cancel
    }

}

MyDialog:

public class MyDialog extends DialogFragment implements View.OnClickListener
{
    private EditText mEditText;
    private Button acceptButton;
    private Button rejectButton;
    private Button cancelButton;

    public static interface Callback
    {
        public void accept();
        public void decline();
        public void cancel();
    }

    public MyDialog()
    {
        // Empty constructor required for DialogFragment
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        View view = inflater.inflate(R.layout.dialogfragment, container);
        acceptButton = (Button) view.findViewById(R.id.dialogfragment_acceptbtn);
        rejectButton = (Button) view.findViewById(R.id.dialogfragment_rejectbtn);
        cancelButton = (Button) view.findViewById(R.id.dialogfragment_cancelbtn);
        acceptButton.setOnClickListener(this);
        rejectButton.setOnClickListener(this);
        cancelButton.setOnClickListener(this);
        getDialog().setTitle(R.string.dialog_title);
        return view;
    }

    @Override
    public void onClick(View v)
    {
        Callback callback = null;
        try
        {
            callback = (Callback) getTargetFragment();
        }
        catch (ClassCastException e)
        {
            Log.e(this.getClass().getSimpleName(), "Callback of this class must be implemented by target fragment!", e);
            throw e;
        }

        if (callback != null)
        {
            if (v == acceptButton)
            {   
                callback.accept();
                this.dismiss();
            }
            else if (v == rejectButton)
            {
                callback.decline();
                this.dismiss();
            }
            else if (v == cancelButton)
            {
                callback.cancel();
                this.dismiss();
            }
        }
    }
}

কার্যক্রম:

public class MyActivity extends ActionBarActivity implements ShowDialog
{
    ..

    @Override
    public void showDialog(DialogFragment dialogFragment)
    {
        FragmentManager fragmentManager = getSupportFragmentManager();
        dialogFragment.show(fragmentManager, "dialog");
    }
}

ডায়ালগফ্রেগমেন্ট লেআউট:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/dialogfragment_textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="10dp"
        android:text="@string/example"/>

    <Button
        android:id="@+id/dialogfragment_acceptbtn"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:layout_centerHorizontal="true"
        android:layout_below="@+id/dialogfragment_textview"
        android:text="@string/accept"
        />

    <Button
        android:id="@+id/dialogfragment_rejectbtn"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_alignLeft="@+id/dialogfragment_acceptbtn"
        android:layout_below="@+id/dialogfragment_acceptbtn"
        android:text="@string/decline" />

     <Button
        android:id="@+id/dialogfragment_cancelbtn"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="20dp"
        android:layout_alignLeft="@+id/dialogfragment_rejectbtn"
        android:layout_below="@+id/dialogfragment_rejectbtn"
        android:text="@string/cancel" />

     <Button
        android:id="@+id/dialogfragment_heightfixhiddenbtn"
        android:layout_width="200dp"
        android:layout_height="20dp"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="20dp"
        android:layout_alignLeft="@+id/dialogfragment_cancelbtn"
        android:layout_below="@+id/dialogfragment_cancelbtn"
        android:background="@android:color/transparent"
        android:enabled="false"
        android:text=" " />
</RelativeLayout>

নামটি dialogfragment_heightfixhiddenbtnদেখায়, আমি ঠিক করার মতো কোনও উপায় বের করতে পারিনি যে নীচের বোতামটির উচ্চতা অর্ধেক কেটে গেছে বলার পরেও wrap_content, তাই আমি পরিবর্তে অর্ধেকটি "কাটা" হতে একটি গোপন বোতাম যুক্ত করেছি। হ্যাকের জন্য দুঃখিত।


1
setTargetFragment()ঘূর্ণনের পরে ক্রিয়াকলাপ / খণ্ড সেটটি পুনরায় চালু করার সাথে সিস্টেমের দ্বারা সেট করা রেফারেন্সটি সঠিকভাবে তৈরি করা হবে। সুতরাং উল্লেখটি স্বয়ংক্রিয়ভাবে নতুন টার্গেটের দিকে নির্দেশ করবে।
রিচার্ড লে ম্যাসুরিয়ার

যদিও বাটারকনিফকে দিনের বেলা ফিরে না ব্যবহার করার জন্য আমি এখন নাকে নিজেকে খোঁচা দেব। বাটারনিফ ব্যবহার করুন, এটি আপনার দৃষ্টিভঙ্গিটিকে অনেক সুন্দরভাবে পরিচালনা করে।
এপিকপান্ডাফোরস

এবং আপনি খণ্ড থেকে ক্রিয়াকলাপে ইভেন্ট প্রেরণ করতে ওটো ব্যবহার করতে পারেন, যাতে আপনার ইন্টারফেস সংযুক্ত করার যাদু প্রয়োজন না। আতর এখানে উদাহরণ: stackoverflow.com/a/28480952/2413303
EpicPandaForce

@ এপিকপান্ডাফর্স দয়া করে, আপনি কি "শোডায়ালগ" ইন্টারফেস / ক্লাস যুক্ত করতে পারেন? এটি আপনার উদাহরণে একমাত্র জিনিস অনুপস্থিত।
ntrch

@ সঞ্চারটি এটি ছিলpublic interface ShowDialog { void showDialog(DialogFragment dialogFragment); }
এপিকপ্যান্ডফোর্স

3
 public void showAlert(){


     AlertDialog.Builder alertDialog = new AlertDialog.Builder(getActivity());
     LayoutInflater inflater = getActivity().getLayoutInflater();
     View alertDialogView = inflater.inflate(R.layout.test_dialog, null);
     alertDialog.setView(alertDialogView);

     TextView textDialog = (TextView) alertDialogView.findViewById(R.id.text_testDialogMsg);
     textDialog.setText(questionMissing);

     alertDialog.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
         public void onClick(DialogInterface dialog, int which) {
             dialog.cancel();
         }
     });
     alertDialog.show();

}

যেখানে .test_dialog এক্সএমএল কাস্টমের


2

আমি নিজেই একজন শিক্ষানবিস এবং আমি সত্যই বুঝতে পারি বা বাস্তবায়ন করতে পারি এমন সন্তোষজনক উত্তর খুঁজে পাই না।

সুতরাং এখানে একটি বাহ্যিক লিঙ্ক যা আমি সত্যই আমাকে যা চাই তা অর্জন করতে সহায়তা করে। এটি খুব সোজা এগিয়ে এবং পাশাপাশি অনুসরণ করা সহজ।

http://www.helloandroid.com/tutorials/how-display-custom-dialog-your-android-application

কোডের সাথে অর্জন করতে আমি যা চেষ্টা করেছিলাম:

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

আমার খণ্ডটির অনক্রেটভিউ কী দেখায় তা এখানে

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.fragment_home_activity, container, false);

    Button addTransactionBtn = rootView.findViewById(R.id.addTransactionBtn);

    addTransactionBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Dialog dialog = new Dialog(getActivity());
            dialog.setContentView(R.layout.dialog_trans);
            dialog.setTitle("Add an Expense");
            dialog.setCancelable(true);

            dialog.show();

        }
    });

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

কোনও বিভ্রান্তি আছে কিনা তা আমাকে জানান। :)


0
    public static void OpenDialog (Activity activity, DialogFragment fragment){

    final FragmentManager fm = ((FragmentActivity)activity).getSupportFragmentManager();

    fragment.show(fm, "tag");
}

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