উত্তর:
আপনি কোনও খণ্ডের আইডি প্রোগ্রামগতভাবে সেট করতে পারবেন না ।
তবে, ক String tag
ফ্রেমমেন্ট ট্রান্সজেকশনের ভিতরে আপনি সেট করতে পারেন যা কোনও খণ্ডকে স্বতন্ত্ররূপে সনাক্ত করতে ব্যবহার করা যেতে পারে।
Aleksey হিসাবে নির্দিষ্ট, আপনি একটি আইডি পাস করতে পারেন FragmentTransaction
এর add(int, Fragment)
পদ্ধতি। তবে এটি কোনও খণ্ডের জন্য আইডি নির্দিষ্ট করে না। এটি ViewGroup
সন্নিবেশ করানোর জন্য একটির আইডি নির্দিষ্ট করে Fragment
। আপনার যে উদ্দেশ্যটি আমি আশা করি তার জন্য এটি কার্যকর নয়, কারণ এটি অনন্যভাবে Fragment
গুলি সনাক্ত করে না , তবে ViewGroup
এস s এই আইডিগুলিতে এমন একটি ধারক রয়েছে যা এক বা একাধিক টুকরো ডায়নামিকভাবে যুক্ত হতে পারে। এর সনাক্তকরণের জন্য এই জাতীয় পদ্ধতি ব্যবহারের জন্য আপনার প্রতিটি প্রবেশকারীর জন্য লেআউটটিতে গতিশীলভাবে Fragment
যুক্ত হওয়া প্রয়োজন । এটা বেশ কষ্টকর হবে।ViewGroup
Fragment
তাই আপনি যদি আপনার প্রশ্নের একটি অনন্য শনাক্তকারী আপনি পরিবর্তনশীল যোগ করছি একটি টুকরা জন্য তৈরি করার পদ্ধতি হল, উত্তর ব্যবহার করা FragmentTransaction
এর অ্যাড (int- containerViewId, টুকরা টুকরা, স্ট্রিং ট্যাগ) পদ্ধতি এবং FragmentManager
এর findFragmentByTag (STRING) পদ্ধতি।
আমার একটি অ্যাপে আমি গতিশীলভাবে স্ট্রিং উত্পন্ন করতে বাধ্য হয়েছিলাম। তবে এটি প্রকৃত ফ্রেগমেন্ট ট্রান্সজেকশনের তুলনায় এত ব্যয়বহুল নয়।
ট্যাগ পদ্ধতির আরেকটি সুবিধা হ'ল এটি এমন একটি খণ্ডকে সনাক্ত করতে পারে যা ইউআইতে যুক্ত হচ্ছে না। ফ্রেগমেন্ট ট্রান্সজেকশনের অ্যাড (ফ্র্যাগমেন্ট, স্ট্রিং) পদ্ধতিটি দেখুন। Fragment
s এর দরকার নেই View
! এগুলি কনফিগার পরিবর্তনের মধ্যে ক্ষুদ্রতর স্থিতিশীল অবস্থা অব্যাহত রাখতেও ব্যবহার করা যেতে পারে!
দেখা যাচ্ছে আপনাকে খণ্ড আইডি জানা দরকার নেই।
ডক্স থেকে:
public abstract Fragment findFragmentById (int id)
Finds a fragment that was identified by the given id either
when inflated from XML or as the container ID when added in
a transaction.
গুরুত্বপূর্ণ অংশটি হ'ল "কোনও লেনদেনের সাথে যুক্ত হওয়ার পরে ধারক আইডি হিসাবে"।
তাই:
getSupportFragmentManager()
.beginTransaction()
.add(R.id.fragment_holder, new AwesomeFragment())
.commit();
এবং তারপর
AwesomeFragment awesome = (AwesomeFragment)
getSupportFragmentManager()
.findFragmentById(R.id.fragment_holder);
আর.আইডি.ফ্রেগমেন্ট_হোল্ডারে যা কিছু আছে (দুর্দান্ত) খণ্ডটি আপনাকে পেয়ে যাবে।
বেশিরভাগ ক্ষেত্রে আপনি আইডির পাশাপাশি ফ্রেগমেন্ট ট্যাগটি ব্যবহার করতে পারেন।
আপনি ট্যাগ মান সেট করতে পারেন FragmentTransaction.add(Fragment fragment, String tag );
। তারপরে আপনি FragmentManager.findFragmentByTag(String tab)
প্রশ্নটিতে টুকরাটি খুঁজে পেতে কমান্ডটি ব্যবহার করতে পারেন ।
টম এবং অন্যরা যেমন ইতিমধ্যে উল্লেখ করেছে, কোনও খণ্ডে একটি ট্যাগ লাগানোর এবং সনাক্ত করার জন্য সেই ট্যাগটি ব্যবহার করার উপায় রয়েছে। পরবর্তী সমস্যার পরে আমি সেগুলি সমাধান নিয়ে এসেছি হ'ল খণ্ডটি কার্যকলাপের সাথে যুক্ত না হওয়া অবধি কোনও ট্যাগ পায় না (বা, আসলে,FragmentManager
)। ট্যাগ করার আগে যদি কোনও খণ্ড সনাক্ত করার প্রয়োজন হয় তবে কী করবেন?
আমার সমাধানগুলি এখনও পর্যন্ত সমস্ত বিশ্বের প্রাচীন (জাভা) ট্রিকের উপর নির্ভর করে: একটি সংক্ষিপ্ত টেম্পলেট টুকরা তৈরি করুন যা এর নির্মাতাদের মধ্যে একটি আইডি নেয় এবং একটি সরবরাহ করে getFragmentId()
সেই আইডিটি দেয় যা সেই আইডি ফেরত দেয়। তারপরে আমি সেই খণ্ডগুলি প্রারম্ভিক সনাক্তকরণের প্রয়োজন সেই টেমপ্লেটটি প্রসারিত করে এবং; ভাল খবর! সমস্যা সমাধান.
এই সমাধানটির জন্য দুর্ভাগ্যক্রমে, টেম্পলেট টুকরাগুলির একটি সেট প্রয়োজন, প্রতিটি খণ্ডের ধরণের জন্য একটি ListFragment
, DialogFragment
বা সাধারণ পুরানো Fragment
(POFO ?!) যার প্রাথমিক সনাক্তকরণ প্রয়োজন। তবে এই লাভগুলি বিবেচনা করে খণ্ড খণ্ডের ক্ষেত্রে এটি পরিচালনাযোগ্য।
নিরাময় ক্ষত ছিঁড়ে দেওয়ার জন্য দুঃখিত :-)
চিয়ার্স!
নিম্নলিখিত ব্যবহার:
একটি খণ্ড যুক্ত করতে:
getFragmentManager().beginTransaction().add(R.id.fragment_container, fragmentToBeAdded, tag).commit();
বিদ্যমান খণ্ডটি সনাক্ত করতে:
getFragmentManager().findFragmentByTag(fragmentName);
একটি ট্যাগ ব্যবহার করার সময় দয়া করে এটি যোগ করার বিষয়ে নিশ্চিত হন
fragmentTransaction.addToBackStack(null);
এমন পদ্ধতি যাতে বিকাশকারী গাইডগুলিতে উল্লিখিত হিসাবে ধ্বংসের পরিবর্তে আপনার খণ্ড পুনরায় শুরু করা যেতে পারে।
আপনি যদি কোনও টুকরোগুলি সরিয়ে এমন কোনও লেনদেন সম্পাদন করার সময় যদি addToBackStack () না কল করেন তবে লেনদেনটি করা হলে সেই খণ্ডটি ধ্বংস হয়ে যায় এবং ব্যবহারকারী এতে ফিরে যেতে পারে না it অন্যদিকে, যদি আপনি কোনও খণ্ড অপসারণের সময় যদি অ্যাডটোব্যাকস্ট্যাক () কল করেন তবে খণ্ডটি বন্ধ হয়ে যায় এবং ব্যবহারকারী যদি ফিরে যান তবে পরে এটি পুনরায় শুরু করা হবে।
আপনি এই পৃষ্ঠার শেষে এটি সন্ধান করতে পারেন ।
সাধারণ findFragmentByTag();
কলের মাধ্যমে কেন আমার ফ্রেগমেন্টটি পাওয়া যায় নি তা জানার চেষ্টা করে আমি প্রায় 30 মিনিট হারিয়েছি