ডায়ালগফ্র্যাগমেন্টের পক্ষে যুক্তি প্রেরণ করা


116

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

Fragment#setArguments(Bundle)

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


নমুনা কোডটি দেখুন: androidxref.com/4.4.2_r1/xref/de
વિકાસ

উত্তর:


299

ব্যবহার newInstance

public static MyDialogFragment newInstance(int num) {
    MyDialogFragment f = new MyDialogFragment();

    // Supply num input as an argument.
    Bundle args = new Bundle();
    args.putInt("num", num);
    f.setArguments(args);

    return f;
}

এবং এইভাবে আরগস পান

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mNum = getArguments().getInt("num");
    ...
}

পূর্ণ উদাহরণ এখানে দেখুন
http://developer.android.com/reference/android/app/DialogFragment.html


আপনি কি বান্ডেল ব্যবহারের পরিবর্তে মাই ডায়ালগফ্রেগমেন্টে ব্যক্তিগত ভেরিয়েবলগুলি সেট করতে পারেন?
এসআইআর কোডালট

10
@ এসআইআরসিডিয়ালোট এর প্রভাবটি কার্যকলাপ বা খণ্ডে ভেরিয়েবল সেট করার সমান হবে। আপনি যদি এমন কোনও সমস্যার মুখোমুখি হন যা ঘূর্ণন পরিবর্তনের মতো ডায়ালগড্র্যাগমেন্টটি ধ্বংস করে এবং পুনরায় তৈরি করে, আপনি সমস্ত ভেরিয়েবল হারাবেন।
inmyth

2
: সব ঐ ভাবছি কেন একটি ওভারলোড কন্সট্রাকটর এই ক্ষেত্রে ব্যবহার করা হয় না জন্য, বিষয়ে অন্য আলোচনা যে অত্যন্ত শিক্ষামূলক দেখতে stackoverflow.com/questions/14011808/...
HondaGuy

একটি মিনিট সময় খেয়াল করে দেখুন যে সেভডআইনস্ট্যান্সস্টেট ব্যবহার করা হয়নি।
ওডিস

25

আমি আমার তালিকাভিউ থেকে কিছু মান প্রেরণ করতাম

কীভাবে পাঠাবো

mListview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
            Favorite clickedObj = (Favorite) parent.getItemAtPosition(position);

            Bundle args = new Bundle();
            args.putString("tar_name", clickedObj.getNameTarife());
            args.putString("fav_name", clickedObj.getName());

            FragmentManager fragmentManager = getSupportFragmentManager();
            TarifeDetayPopup userPopUp = new TarifeDetayPopup();
            userPopUp.setArguments(args);
            userPopUp.show(fragmentManager, "sam");

            return false;
        }
    });

ডায়ালগফ্রেগমেন্টের অনক্রিট () পদ্ধতিতে কীভাবে পাবেন receive

    Bundle mArgs = getArguments();
    String nameTrife = mArgs.getString("tar_name");
    String nameFav = mArgs.getString("fav_name");
    String name = "";

// কোটলিন আপলোড

 val fm = supportFragmentManager
        val dialogFragment = AddProgFargmentDialog() // my custom FargmentDialog
        var args: Bundle? = null
        args?.putString("title", model.title);
        dialogFragment.setArguments(args)
        dialogFragment.show(fm, "Sample Fragment")

// গ্রহণ

 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if (getArguments() != null) {
            val mArgs = arguments
            var myDay= mArgs.getString("title")
        }
    }

1
উত্তম উত্তর!
ব্যবহারকারী55924

1
ধন্যবাদ ! কোটলিন সংস্করণ সাহায্য করেছে।
আর্দেনদেব

6

সুতরাং খণ্ড / ক্রিয়াকলাপ থেকে সংলাপ খণ্ডে মানগুলি পাস করার দুটি উপায় রয়েছে: -

  1. মেক সেটার পদ্ধতি এবং পাসওয়ার্ড / আর্গুমেন্টের সাথে ডায়ালগ টুকরা অবজেক্ট তৈরি করুন।

  2. বান্ডিল মাধ্যমে মান / তর্ক পাস।

পদ্ধতি 1:

// Fragment or Activity 
@Override
public void onClick(View v) {
     DialogFragmentWithSetter dialog = new DialogFragmentWithSetter();
     dialog.setValue(header, body);
     dialog.show(getSupportFragmentManager(), "DialogFragmentWithSetter");         
}


//  your dialog fragment
public class MyDialogFragment extends DialogFragment {
    String header; 
    String body;
    public void setValue(String header, String body) {   
          this.header = header;
          this.body = body;
    }
    // use above variable into your dialog fragment
}

দ্রষ্টব্য: - এটি করার সর্বোত্তম উপায় নয়

পদ্ধতি 2:

// Fragment or Activity 
@Override
public void onClick(View v) {
     DialogFragmentWithSetter dialog = new DialogFragmentWithSetter();
     
     Bundle bundle = new Bundle();
     bundle.putString("header", "Header");
     bundle.putString("body", "Body");  
     dialog.setArguments(bundle);
     dialog.show(getSupportFragmentManager(), "DialogFragmentWithSetter");         
}


//  your dialog fragment
public class MyDialogFragment extends DialogFragment {
    String header; 
    String body;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
             header = getArguments().getString("header","");
             body = getArguments().getString("body","");
        }
    }
    // use above variable into your dialog fragment
}

দ্রষ্টব্য: - এটি করার সর্বোত্তম উপায়।


এমনকি আপনি বাজেটে স্ট্রিংস হিসাবে অবজেক্টস বা অ্যারেলিস্ট <অবজেক্টস> পাস করতে গসন লাইব্রেরি ব্যবহার করতে পারেন।
জেফ্রি

@ ডগগু, কেন গেটর এবং সেটার সর্বোত্তম উপায় নয়?
sky91

5

জাফরকিউকিউ যেমন উল্লেখ করেছে যে টুকরাগুলির সাথে কাজ করার একটি সাধারণ উপায় হিসাবে, আপনার কনস্ট্রাক্টরের মধ্যে প্যারামগুলি পাস করা উচিত নয় Bundle

Fragmentক্লাসে এর জন্য অন্তর্নির্মিত পদ্ধতিটি হল setArguments(Bundle)এবংgetArguments()

মূলত, আপনি যা করেন তা হ'ল আপনার সমস্ত Parcelableআইটেমের সাথে একটি বান্ডিল সেট আপ করুন এবং সেগুলি প্রেরণ করুন।
ঘুরেফিরে, আপনার টুকরা এতে সেই আইটেমগুলি পাবেonCreate তাদের কাছে যাদু করবে।

DialogFragmentলিঙ্কটিতে দেখানো উপায়টি হ'ল এক নির্দিষ্ট ধরণের ডেটা সহ বহু উপস্থিতিযুক্ত খণ্ডে এটি করার এক উপায় এবং বেশিরভাগ সময় সূক্ষ্মভাবে কাজ করে তবে আপনি নিজে নিজে এটিও করতে পারেন।


0

আমার ক্ষেত্রে, উপরের কোডগুলির সাথে bundle-operateকোনওটিই কাজ করে না; এখানে আমার সিদ্ধান্ত (আমি জানি না এটি সঠিক কোড কিনা তা তবে তা আমার ক্ষেত্রে কার্যকর হয়):

public class DialogMessageType extends DialogFragment {
    private static String bodyText;

    public static DialogMessageType addSomeString(String temp){
        DialogMessageType f = new DialogMessageType();
        bodyText = temp;
        return f;
    };

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        final String[] choiseArray = {"sms", "email"};
        String title = "Send text via:";
        final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle(title).setItems(choiseArray, itemClickListener);
        builder.setCancelable(true);
        return builder.create();
    }

    DialogInterface.OnClickListener itemClickListener = new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            switch (which){
                case 0:
                    prepareToSendCoordsViaSMS(bodyText);
                    dialog.dismiss();
                    break;
                case 1:
                    prepareToSendCoordsViaEmail(bodyText);
                    dialog.dismiss();
                    break;
                default:
                    break;
            }
        }
    };
[...]
}

public class SendObjectActivity extends FragmentActivity {
[...]

DialogMessageType dialogMessageType = DialogMessageType.addSomeString(stringToSend);
dialogMessageType.show(getSupportFragmentManager(),"dialogMessageType");

[...]
}

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

0

আমি কিভাবে যারা ব্যবহার Kotlin কি বলেন @JafarKhQ না করতে দেখাতে চান শুধু যে kotlin যে শক্তি তাদের সাহায্য ও থিম এবারও সংরক্ষণ করুন:

সুতরাং আপনাকে নতুন নতুন ইনস্ট্যান্স ফাংশন তৈরি করতে একটি সহযোগী আপত্তি তৈরি করতে হবে

আপনি যা চান ফাংশনটির প্যারামেটার সেট করতে পারেন। ব্যবহার

 val args = Bundle()

আপনি আপনার আরগ সেট করতে পারেন।

আপনি এখন args.putSomthingআপনার নতুনআইন্সটেন্স ফাংশনটিতে প্রিমেটার হিসাবে আপনার দেওয়া আরগগুলি যুক্ত করতে ব্যবহার করতে পারেন। putString(key:String,str:String)উদাহরণস্বরূপ স্ট্রিং যোগ করার জন্য এবং তাই

এখন আপনি যে যুক্তিটি ব্যবহার করতে পারেন তা পেতে arguments.getSomthing(Key:String) => টি পছন্দarguments.getString("1")

এখানে একটি সম্পূর্ণ উদাহরণ

class IntervModifFragment : DialogFragment(), ModContract.View
{
    companion object {
        fun newInstance(  plom:String,type:String,position: Int):IntervModifFragment {
            val fragment =IntervModifFragment()
            val args = Bundle()
            args.putString( "1",plom)
            args.putString("2",type)
            args.putInt("3",position)
            fragment.arguments = args
            return fragment
        }
    }

...
    override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        fillSpinerPlom(view,arguments.getString("1"))
         fillSpinerType(view, arguments.getString("2"))
        confirmer_virme.setOnClickListener({on_confirmClick( arguments.getInt("3"))})


        val dateSetListener = object : DatePickerDialog.OnDateSetListener {
            override fun onDateSet(view: DatePicker, year: Int, monthOfYear: Int,
                                   dayOfMonth: Int) {
                val datep= DateT(year,monthOfYear,dayOfMonth)
                updateDateInView(datep.date)
            }
        }

    }
  ...
}

এখন আপনার ডায়ালগটি কীভাবে তৈরি করবেন আপনি অন্য ক্লাসে এরকম কিছু করতে পারেন

  val dialog = IntervModifFragment.newInstance(ListInter.list[position].plom,ListInter.list[position].type,position)

উদাহরণস্বরূপ এটি পছন্দ করুন

class InterListAdapter(private val context: Context, linkedList: LinkedList<InterItem> ) : RecyclerView.Adapter<InterListAdapter.ViewHolder>()
{
   ... 
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {

        ...
        holder.btn_update!!.setOnClickListener {
           val dialog = IntervModifFragment.newInstance(ListInter.list[position].plom,ListInter.list[position].type,position)
           val ft = (context as AppCompatActivity).supportFragmentManager.beginTransaction()
            dialog.show(ft, ContentValues.TAG)
        }
        ...
    }
..

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