ডায়ালগফ্রেগমেন্ট থেকে ফলাফল পান


232

আমি বেশ কয়েকটি জিনিসের জন্য ডায়ালগফ্রেগমেন্ট ব্যবহার করছি : তালিকা থেকে আইটেম নির্বাচন করা, পাঠ্য প্রবেশ করানো।

কলিং ক্রিয়াকলাপ / খণ্ডে কোনও মান (অর্থাত্ একটি স্ট্রিং বা তালিকা থেকে কোনও আইটেম) ফেরত দেওয়ার সর্বোত্তম উপায় কী?

বর্তমানে আমি কলিং ক্রিয়াকলাপটি বাস্তবায়ন করছি এবং DismissListenerডায়ালগফ্রেগমেন্টটিকে ক্রিয়াকলাপের জন্য একটি রেফারেন্স দিচ্ছি। OnDimissডায়ালগটি তখন ক্রিয়াকলাপে পদ্ধতিটিকে কল করে এবং ক্রিয়াকলাপটি ডায়ালগফ্রেগমেন্ট অবজেক্ট থেকে ফলাফলটি ধরে bs খুব অগোছালো এবং এটি ডায়ালগফ্র্যাগমেন্ট ক্রিয়াকলাপটি হারিয়েছে বলে কনফিগারেশন পরিবর্তন (ওরিয়েন্টেশন পরিবর্তন) এ কাজ করে না।

কোন সাহায্যের জন্য ধন্যবাদ।


10
ডায়ালগফ্রেগমেন্টগুলি এখনও কেবল টুকরো টুকরো। আপনার ক্রিয়াটি মূল ক্রিয়াকলাপে ফিরে কথা বলার জন্য টুকরো টুকরো করার প্রস্তাবিত উপায়। developer.android.com/guide/topics/fundamentals/…
কোডগোজার

1
তার জন্য ধন্যবাদ. আমি খুব কাছে ছিলাম (যেমন আপনি বলেছেন) লিঙ্কযুক্ত দস্তাবেজটি আমাকে যে বিটটি সাহায্য করেছিল তা হ'ল অনটচ () ব্যবহার করে এবং শ্রোতার কাছে ক্রিয়াকলাপটি ছড়িয়ে দেওয়া।
জেমস ক্রস

2
@ কোডডুঞ্জার, @ স্ট্যাটিক্স - "ডায়ালগফ্রেগমেন্টটিকে ক্রিয়াকলাপের জন্য একটি রেফারেন্স প্রদান" - এই বিবরণটি কিছুটা ঝুঁকিপূর্ণ, কারণ উভয় Activityএবং DialogFragmentশক্তিকে পুনরায় তৈরি করা যেতে পারে। Activityপাস করা ব্যবহার করা onAttach(Activity activity)উপযুক্ত এবং প্রস্তাবিত উপায়।
sstn

উত্তর:


246

ব্যবহারের myDialogFragment.setTargetFragment(this, MY_REQUEST_CODE)জায়গা যেখানে আপনি ডায়ালগ দেন, এবং তারপর যখন আপনার ডায়ালগ সমাপ্ত হয়, তা থেকে আপনি কল করতে পারেন থেকে getTargetFragment().onActivityResult(getTargetRequestCode(), ...), এবং বাস্তবায়ন onActivityResult()ধারণকারী টুকরা হবে।

এটি অপব্যবহারের মতো বলে মনে হচ্ছে onActivityResult(), বিশেষত এটি কোনও ক্রিয়াকলাপ জড়িত না। তবে আমি এটি অফিসিয়াল গুগল লোকেদের দ্বারা সুপারিশ করে দেখেছি, এবং সম্ভবত এপিআই ডেমোতেও। আমি মনে করি এটির জন্য যা যুক্ত g/setTargetFragment()করা হয়েছিল।


2
সেটট্রেটফ্র্যাগমেন্টটিতে উল্লেখ করা হয়েছে যে অনুরোধকোডটিঅ্যাক্টিভিটিস রেজাল্টে ব্যবহারের জন্য তাই আমার ধারণা এই পদ্ধতির ব্যবহার করা ঠিক আছে ok
জর্জি

87
লক্ষ্য যদি একটি কার্যকলাপ হয়?
ফার্নান্দো গাল্লেগো

9
লক্ষ্য যদি ক্রিয়াকলাপ হয় তবে আমি "অকার্যকর onActivityResult2 (int অনুরোধকোড, ইন্ট রেজাল্টকোড, ইন্টেন্ট ডেটা)" এর মতো পদ্ধতির সাথে ইন্টারফেস ঘোষণা করব এবং এটি একটি ক্রিয়াকলাপের মাধ্যমে বাস্তবায়ন করব। ডায়ালগফ্রেগমেন্টে কেবলঅ্যাক্টিভিটি পান এবং এই ইন্টারফেসটির জন্য পরীক্ষা করুন এবং এটিকে যথাযথভাবে কল করুন।
Ruslan Yanchyshyn

4
এটি ভাল সমাধান নয়। এটি ডায়লগ খণ্ডের স্থিতি সংরক্ষণ এবং পুনরুদ্ধারের পরে কাজ করবে না। লোকালব্রোডকাস্টম্যানেজার এক্ষেত্রে সেরা সমাধান।
নিক

4
@ নিক এটি ঠিক সত্য নয়। এটি সেরা সমাধান। রাষ্ট্র সংরক্ষণ এবং পুনরুদ্ধার করার সময় কোনও সমস্যা নেই। আপনার যদি কখনও সমস্যা হয় আপনি ভুল খণ্ড পরিচালক ব্যবহার করেছেন। ডায়লগটি দেখানোর জন্য লক্ষ্য খণ্ড / কলারকে getChildFraamentManager () ব্যবহার করতে হবে।
অবিশ্বাস্য জানুয়ারী

140

আপনি এখানে দেখতে পারেন যে এটি করার একটি খুব সহজ উপায় আছে।

আপনার DialogFragmentযুক্ত করতে একটি ইন্টারফেস শ্রোতার মতো:

public interface EditNameDialogListener {
    void onFinishEditDialog(String inputText);
}

তারপরে, সেই শ্রোতার একটি উল্লেখ যুক্ত করুন:

private EditNameDialogListener listener;

এটি শ্রোতার পদ্ধতি (গুলি) "সক্রিয়" করতে এবং পিতামাতার ক্রিয়াকলাপ / খণ্ড এই ইন্টারফেসটি প্রয়োগ করে কিনা তা পরীক্ষা করতে ব্যবহৃত হবে (নীচে দেখুন)।

ইন Activity/ FragmentActivity/ Fragmentযে "বলা" DialogFragmentকেবল এই ইন্টারফেস বাস্তবায়ন।

আপনার DialogFragmentসমস্ত ক্ষেত্রে আপনাকে যে বিন্দুতে বরখাস্ত করতে চান DialogFragmentএবং ফলাফলটি ফিরিয়ে দিতে চান তা এই:

listener.onFinishEditDialog(mEditText.getText().toString());
this.dismiss();

কোথায় mEditText.getText().toString()কি ফিরে কলিং প্রেরণ করা হবে Activity

মনে রাখবেন যে আপনি যদি অন্য কোনও কিছু ফিরিয়ে দিতে চান তবে শ্রোতার গ্রহণযোগ্য যুক্তিগুলি কেবল পরিবর্তন করুন।

অবশেষে, আপনার ইন্টারফেসটি পিতামাতার ক্রিয়াকলাপ / খণ্ড দ্বারা বাস্তবায়িত হয়েছিল কিনা তা পরীক্ষা করা উচিত:

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    // Verify that the host activity implements the callback interface
    try {
        // Instantiate the EditNameDialogListener so we can send events to the host
        listener = (EditNameDialogListener) context;
    } catch (ClassCastException e) {
        // The activity doesn't implement the interface, throw exception
        throw new ClassCastException(context.toString()
                + " must implement EditNameDialogListener");
    }
}

এই কৌশলটি খুব নমনীয় এবং ফলাফলের সাথে আবার কল করার অনুমতি দেয় এমনকি আপনার ডন t টি ডায়ালগটি কেবল খারিজ করতে চাইছে না।


13
এটি Activity'এর এবং FragmentActivity' এর সাথে দুর্দান্ত কাজ করে তবে কলারটি যদি হয় তবে কি Fragment?
ব্রাইস গাবিন

1
আমি নিশ্চিত না যে আমি আপনাকে পুরোপুরি বুঝতে পেরেছি। কলকারীটি যদি হয় তবে এটি একই রকম কাজ করবে Fragment
আসফ গামিলিয়েল

2
যদি কলারটি একজন ছিলেন Fragmentতবে আপনি কয়েকটি জিনিস করতে পারেন: ১. রেফারেন্স হিসাবে টুকরোটি পাস করুন (ভাল ধারণা হতে পারে না কারণ আপনি মেমরি ফাঁস হতে পারেন)। ২ FragmentManagerএবং কলটি ব্যবহার করুন findFragmentByIdবা findFragmentByTagএটি আপনার ক্রিয়াকলাপে বিদ্যমান টুকরোগুলি পেয়ে যাবে। আমি আশা করি এটি সাহায্য করেছে দিন শুভ হোক!
আসফ গামিলিয়েল

5
এই পদ্ধতির সাথে সমস্যাটি হ'ল টুকরোগুলি ধরে রাখা অবজেক্টে খুব ভাল নয় কারণ এটি পুনরায় তৈরি করা বোঝানো হয়েছে, উদাহরণস্বরূপ ওরিয়েন্টেশনটি পরিবর্তন করার চেষ্টা করুন, ওএস খণ্ডটি পুনরায় তৈরি করবে তবে শ্রোতার
উদাহরণটি

5
@ লৌগ_এটিজি @ টিএমএমএম এর উত্তরটি দেখুন। setTargetFragment()এবং getTargetFragment()যাদু।
ব্রাইস গাবিন

48

ডায়ালগফ্রেগমেন্ট থেকে ফলাফল পাওয়ার অনেক সহজ উপায় রয়েছে।

প্রথমত, আপনার ক্রিয়াকলাপ, টুকরা বা খন্ডের ক্রিয়াকলাপে আপনাকে নিম্নলিখিত তথ্যগুলিতে যুক্ত করতে হবে:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Stuff to do, dependent on requestCode and resultCode
    if(requestCode == 1) { // 1 is an arbitrary number, can be any int
         // This is the return result of your DialogFragment
         if(resultCode == 1) { // 1 is an arbitrary number, can be any int
              // Now do what you need to do after the dialog dismisses.
         }
     }
}

requestCodeমূলত DialogFragment তোমাকে ডেকেছিলাম জন্য আপনার int- এ ট্যাগ, আমি দেখাব কিভাবে একটি দ্বিতীয় মধ্যে এই কাজ করে। রেজাল্টকোড হল কোড যা আপনি ডায়ালগফ্রেগমেন্ট থেকে আপনার বর্তমান অপেক্ষার ক্রিয়াকলাপ, টুকরা বা ফ্রেগমেন্টঅ্যাক্টিভিটি যা ঘটেছে তা জানিয়ে পাঠিয়েছিলেন।

কোডটির পরবর্তী অংশটি ডায়ালগফ্রেগমেন্টের কল। একটি উদাহরণ এখানে:

DialogFragment dialogFrag = new MyDialogFragment();
// This is the requestCode that you are sending.
dialogFrag.setTargetFragment(this, 1);     
// This is the tag, "dialog" being sent.
dialogFrag.show(getFragmentManager(), "dialog");

এই তিনটি লাইন দিয়ে আপনি আপনার ডায়ালগফ্রেগমেন্টটি ঘোষণা করছেন, একটি অনুরোধকোড সেট করবেন (যা ডায়ালগটি বরখাস্ত হওয়ার পরে অন্টিভিটিজ রিসাল্ট (...) কল করবে এবং আপনি ডায়লগটি দেখিয়ে দিচ্ছেন thatএই সহজ)।

এখন, আপনার ডায়ালগফ্রেগমেন্টে আপনাকে কেবল একটি লাইন সরাসরি যুক্ত করতে হবে dismiss()যাতে আপনি রেজাল্ট কোডটি অনঅ্যাক্টিভিটি রিসাল্টে () এ প্রেরণ করতে পারেন।

getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, getActivity().getIntent());
dismiss();

এটাই. দ্রষ্টব্য, রেজাল্ট কোডটি এই ক্ষেত্রে int resultCodeআমি যেটি সেট করেছি সে হিসাবে সংজ্ঞায়িত করা resultCode = 1;হয়।

এটি হ'ল, আপনি এখন আপনার ডায়ালগফ্রেগমেন্টের ফলাফলটি আপনার কলিং ক্রিয়াকলাপ, টুকরা বা ফ্রেগমেন্টএক্টিভিটিতে ফিরিয়ে দিতে পারেন।

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

06.24.2016 সম্পাদনা করুন আমি উপরের বিভ্রান্তকারী কোডের জন্য ক্ষমাপ্রার্থী। তবে আপনি অবশ্যই অবশ্যই লাইন হিসাবে দেখা ক্রিয়াকলাপের ফলাফল ফিরে পেতে পারবেন না:

dialogFrag.setTargetFragment(this, 1);

একটি লক্ষ্য সেট করে Fragmentএবং না Activity। সুতরাং এটি করতে আপনার একটি প্রয়োগ করতে হবে InterfaceCommunicator

আপনার DialogFragmentসেটে একটি গ্লোবাল ভেরিয়েবল

public InterfaceCommunicator interfaceCommunicator;

এটি পরিচালনা করার জন্য একটি সর্বজনীন ফাংশন তৈরি করুন

public interface InterfaceCommunicator {
    void sendRequestCode(int code);
}

অতঃপর যখন তোমরা কোড ফেরত পাঠাতে করার জন্য প্রস্তুত হন Activityযখন DialogFragmentচলমান সম্পন্ন হলে, আপনি কেবল লাইন আপনি আগে যোগ dismiss();আপনার DialogFragment:

interfaceCommunicator.sendRequestCode(1); // the parameter is any int code you choose.

আপনার ক্রিয়াকলাপে এখন আপনাকে দুটি জিনিস করতে হবে, প্রথমটি হ'ল কোডটির একটি লাইন যা আর প্রযোজ্য নয় তা মুছে ফেলা:

dialogFrag.setTargetFragment(this, 1);  

তারপরে ইন্টারফেসটি কার্যকর করুন এবং আপনার কাজটি শেষ হয়ে গেল। implementsআপনার ক্লাসের একেবারে শীর্ষে ক্লজটিতে নিম্নলিখিত লাইনটি যুক্ত করে আপনি এটি করতে পারেন :

public class MyClass Activity implements MyDialogFragment.InterfaceCommunicator

এবং তারপরে @Overrideক্রিয়াকলাপে ফাংশন,

@Override
public void sendRequestCode(int code) {
    // your code here
}

আপনি এই ইন্টারফেস পদ্ধতিটি যেমন ব্যবহার করেন ঠিক তেমনই ব্যবহার করেন onActivityResult()। ইন্টারফেস পদ্ধতি ব্যতীত অন্যটির DialogFragmentsজন্য Fragments


4
লক্ষ্যটি ক্রিয়াকলাপ হলে এই পদ্ধতির কাজ হবে না কারণ আপনি সুরক্ষিত অ্যাক্সেস স্তরের কারণে আপনি এটির অ্যাক্টিভিটি রেজাল্ট (আপনার ডায়ালগফ্র্যাগমেন্ট থেকে) কল করতে পারবেন না।
Ruslan Yanchyshyn

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

6
হাই, আপনি বলেছিলেন যে আপনি dialogFrag.setTargetFragment(this, 1)কোনও ক্রিয়াকলাপ থেকে কল করতে পারেন , তবে এই পদ্ধতিটি প্রথম যুক্তি হিসাবে একটি টুকরো পায়, তাই এটি জাল করা যায় না। আমি কি সঠিক ?
মন্ডকিন

1
ক্রিয়াকলাপের স্টাফটি ব্যাখ্যা করতে আমি কয়েকজনের জন্য আপনার সবার জন্য কিছু প্রতিক্রিয়া পোস্ট করব।
ব্র্যান্ডন

1
@ সুইফট @ এলকম্পায়ার আপনার সম্ভবত আপনার ডায়ালগফ্র্যাগমেন্টে অন্যাটচ (প্রসঙ্গ প্রসঙ্গ) ওভাররাইড করা প্রয়োজন। ভালো লেগেছে:@Override public void onAttach(Context context) { super.onAttach(context); yourInterface = (YourInterface) context; }
lidkxx

20

ঠিক আছে এর খুব দেরিতে উত্তর দেওয়া হতে পারে তবে এখানে থেকে ফলাফল ফিরে পেতে আমি যা করেছি তা এখানে DialogFragment। @ ব্র্যান্ডনের উত্তরের সাথে খুব মিল similar এখানে আমি DialogFragmentএকটি টুকরা থেকে কল করছি , কেবলমাত্র এই কোডটি রাখুন যেখানে আপনি আপনার কথোপকথনটি কল করছেন।

FragmentManager fragmentManager = getFragmentManager();
            categoryDialog.setTargetFragment(this,1);
            categoryDialog.show(fragmentManager, "dialog");

যেখানে categoryDialogআমার DialogFragmentযা আমি কল করতে চান পরে আপনার বাস্তবায়নের dialogfragmentজায়গা এই কোড যেখানে আপনি অভিপ্রায় এ আপনার ডেটা সেটিং করা হয়। এর মান resultCode1 আপনি সেট করতে পারেন বা সিস্টেম সংজ্ঞায়িত ব্যবহার করতে পারেন।

            Intent intent = new Intent();
            intent.putExtra("listdata", stringData);
            getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, intent);
            getDialog().dismiss();

এখন সময় এসেছে কলিং খণ্ডে ফিরে এসে এই পদ্ধতিটি বাস্তবায়নের। ডেটা বৈধতা বা ফলাফল সাফল্যের জন্য আপনি যদি চান resultCodeএবং requestCodeযদি শর্তে চান তা পরীক্ষা করে দেখুন ।

 @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);        
        //do what ever you want here, and get the result from intent like below
        String myData = data.getStringExtra("listdata");
Toast.makeText(getActivity(),data.getStringExtra("listdata"),Toast.LENGTH_SHORT).show();
    }

10

কোনও খণ্ডকে এর ক্রিয়াকলাপ পর্যন্ত যোগাযোগ করার অনুমতি দেওয়ার জন্য বিভিন্ন পদ্ধতির :

1) খণ্ডে একটি সার্বজনীন ইন্টারফেস সংজ্ঞায়িত করুন এবং এর জন্য একটি পরিবর্তনশীল তৈরি করুন

public OnFragmentInteractionListener mCallback;

public interface OnFragmentInteractionListener {
    void onFragmentInteraction(int id);
}

2) খণ্ডটিতে এমক্যালব্যাক ভেরিয়েবলটিতে কার্যকলাপটি কাস্ট করুন

try {
    mCallback = (OnFragmentInteractionListener) getActivity();
} catch (Exception e) {
    Log.d(TAG, e.getMessage());
}

3) শ্রোতাদের আপনার ক্রিয়াকলাপে কার্যকর করুন

public class MainActivity extends AppCompatActivity implements DFragment.OnFragmentInteractionListener  {
     //your code here
}

4) ক্রিয়াকলাপে অনফ্রেগমেন্টটি অন্তর্ভুক্ত করুন

@Override
public void onFragmentInteraction(int id) {
    Log.d(TAG, "received from fragment: " + id);
}

এটিতে আরও তথ্য: https://developer.android.com/training/basics/framents/communicating.html


এটি এত ভাল সংক্ষিপ্তসার জন্য ধন্যবাদ। অন্যদের জন্য কেবল একটি নোট, অ্যান্ড্রয়েড ডেভস টিউটোরিয়ালটি খণ্ডটির উপরের লিখিতাকে ওভাররাইড করে public void onAttachসেখানে ক্রিয়াকলাপ করার জন্য পরামর্শ দেয়
বিগ_চায়ার

8

আমি খুঁজে পাওয়া একটি সহজ উপায় নিম্নলিখিতটি ছিল: এটি প্রয়োগ করুন এটি আপনার ডায়ালগ ফ্রেমমেন্ট,

  CallingActivity callingActivity = (CallingActivity) getActivity();
  callingActivity.onUserSelectValue("insert selected value here");
  dismiss();

এবং তারপরে ক্রিয়াকলাপে ডায়ালগ টুকরোটি যথাযথ কার্যকারিতা তৈরি করে:

 public void onUserSelectValue(String selectedValue) {

        // TODO add your implementation.
      Toast.makeText(getBaseContext(), ""+ selectedValue, Toast.LENGTH_LONG).show();
    }

টোস্টটি দেখায় যে এটি কাজ করে। আমার জন্য কাজ করেছেন।


এটি করার সঠিক উপায় কিনা তা আমি নিশ্চিত নই, তবে এটি অবশ্যই কার্যকর হয় :)
osh

Interfaceকংক্রিটের ক্লাসগুলির সাথে হার্ড-কাপলিংয়ের চেয়ে ভাল ব্যবহার ।
ওয়াকসলাম

6

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


2
আমি সেই সমাধানটি পছন্দ করি, এটি কি অ্যান্ড্রয়েডের কোনও ভাল বা সেরা অনুশীলন হিসাবে বিবেচিত হয়?
বেনজমিন শারবাউ

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

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

3
ফু এর ভালবাসার জন্য, ব্রডকাস্ট ব্যবহার করবেন না !! এটি আপনার অ্যাপ্লিকেশনটি সুরক্ষা সমস্যার একটি স্লুতে খোলে। এছাড়াও আমি দেখতে পেয়েছি যে সবচেয়ে খারাপ অ্যান্ড্রয়েড অ্যাপ্লিকেশনটি আমাকে অপব্যবহারের সম্প্রচারে কাজ করতে হবে। আপনি কি কোডটিকে সম্পূর্ণ ব্যবহারযোগ্য না করার আরও ভাল উপায়ের কথা ভাবতে পারেন? এখন আমি কোডের একটি পরিষ্কার লাইনের পরিবর্তে ব্রডকাস্ট রিসিভারগুলি কেটে ফেলি? পরিষ্কার হওয়ার জন্য সম্প্রচারের জন্য ব্যবহার রয়েছে, তবে এই প্রসঙ্গে নয়! এই প্রসঙ্গে কখনও না! এটি ঠিক opালু। স্থানীয় বা না। কলব্যাকগুলি আপনার প্রয়োজন are
স্টারউইন্ড0

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

3

অথবা এখানে দেখানো মত ভিউমোডেল ভাগ করুন:

public class SharedViewModel extends ViewModel {
    private final MutableLiveData<Item> selected = new MutableLiveData<Item>();

    public void select(Item item) {
        selected.setValue(item);
    }

    public LiveData<Item> getSelected() {
        return selected;
    }
}


public class MasterFragment extends Fragment {
    private SharedViewModel model;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
        itemSelector.setOnClickListener(item -> {
            model.select(item);
        });
    }
}

public class DetailFragment extends Fragment {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SharedViewModel model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
        model.getSelected().observe(this, { item ->
           // Update the UI.
        });
    }
}

https://developer.android.com/topic/libraries/architecture/viewmodel#sharing_data_between_fragments


2

আমার ক্ষেত্রে আমার টার্গেটফ্র্যাগমেন্টে যুক্তিগুলি পাস করা দরকার। তবে আমি ব্যতিক্রম পেয়েছি "খণ্ড ইতিমধ্যে সক্রিয়"। সুতরাং আমি আমার ডায়ালগফ্র্যাগমেন্টে একটি ইন্টারফেস ঘোষণা করেছি যা পিতামাতার ফ্রেম প্রয়োগ করেছে। যখন প্যারেন্টফ্র্যাগমেন্টটি একটি ডায়ালগফ্র্যাগমেন্ট শুরু করে, তখন এটি নিজেকে টার্গেটফ্রেগমেন্ট হিসাবে সেট করে। তারপরে ডায়ালগফ্রেগমেন্টে আমি ফোন করেছি

 ((Interface)getTargetFragment()).onSomething(selectedListPosition);

2

কোটলিনে

    // My DialogFragment
class FiltroDialogFragment : DialogFragment(), View.OnClickListener {
    
    var listener: InterfaceCommunicator? = null

    override fun onAttach(context: Context?) {
        super.onAttach(context)
        listener = context as InterfaceCommunicator
    }

    interface InterfaceCommunicator {
        fun sendRequest(value: String)
    }   

    override fun onClick(v: View) {
        when (v.id) {
            R.id.buttonOk -> {    
        //You can change value             
                listener?.sendRequest('send data')
                dismiss()
            }
            
        }
    }
}

// আমার ক্রিয়াকলাপ

class MyActivity: AppCompatActivity(),FiltroDialogFragment.InterfaceCommunicator {

    override fun sendRequest(value: String) {
    // :)
    Toast.makeText(this, value, Toast.LENGTH_LONG).show()
    }
}
 

আমি আশা করি এটি কাজ করে, আপনি যদি উন্নতি করতে পারেন তবে এটি সম্পাদনা করুন। আমার ইংরেজি বেশি ভালো না


আমার ক্ষেত্রে ডায়ালগটি কোনও খণ্ডের ক্রিয়াকলাপ নয় তৈরি করা হয়েছে যাতে এই সমাধানটি কাজ করে না। তবে আপনি যে স্মাইলি রেখেছেন তা আমি পছন্দ করি :)
সেনেওনজো

0

আপনি যদি যুক্তি প্রেরণ করতে চান এবং দ্বিতীয় খণ্ড থেকে ফলাফলটি পেতে চান তবে আপনি এই টাস্কটি সম্পাদন করতে ফ্রেগমেন্ট.সেটআর্গমেন্ট ব্যবহার করতে পারেন

static class FirstFragment extends Fragment {
    final Handler mUIHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case 101: // receive the result from SecondFragment
                Object result = msg.obj;
                // do something according to the result
                break;
            }
        };
    };

    void onStartSecondFragments() {
        Message msg = Message.obtain(mUIHandler, 101, 102, 103, new Object()); // replace Object with a Parcelable if you want to across Save/Restore
                                                                               // instance
        putParcelable(new SecondFragment(), msg).show(getFragmentManager().beginTransaction(), null);
    }
}

static class SecondFragment extends DialogFragment {
    Message mMsg; // arguments from the caller/FirstFragment

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onViewCreated(view, savedInstanceState);
        mMsg = getParcelable(this);
    }

    void onClickOK() {
        mMsg.obj = new Object(); // send the result to the caller/FirstFragment
        mMsg.sendToTarget();
    }
}

static <T extends Fragment> T putParcelable(T f, Parcelable arg) {
    if (f.getArguments() == null) {
        f.setArguments(new Bundle());
    }
    f.getArguments().putParcelable("extra_args", arg);
    return f;
}
static <T extends Parcelable> T getParcelable(Fragment f) {
    return f.getArguments().getParcelable("extra_args");
}

-3

কেবল এটি বিকল্পগুলির মধ্যে একটি হিসাবে রয়েছে (যেহেতু কেউ এখনও এটি উল্লেখ করেনি) - আপনি অট্টোর মতো ইভেন্ট বাস ব্যবহার করতে পারেন। তাই আপনি যে কথোপকথনটি করছেন তা:

bus.post(new AnswerAvailableEvent(42));

এবং আপনার কলার (ক্রিয়াকলাপ বা টুকরা) এতে সাবস্ক্রাইব করুন:

@Subscribe public void answerAvailable(AnswerAvailableEvent event) {
   // TODO: React to the event somehow!
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.