অ্যান্ড্রয়েড - টুকরা আইডি সেট করুন


111

আমি কিভাবে সেট করতে পারেন Fragment'গুলি Idযাতে আমি ব্যবহার করতে পারেন getSupportFragmentManager().findFragmentById(R.id.--)?


আপনি এটি লেআউট এক্সএমএল ফাইলে সেট করতে পারেন
ভ্লাদিমির এরিমিয়েভ

উত্তর:


117

আপনি কোনও খণ্ডের আইডি প্রোগ্রামগতভাবে সেট করতে পারবেন না

তবে, ক String tag ফ্রেমমেন্ট ট্রান্সজেকশনের ভিতরে আপনি সেট করতে পারেন যা কোনও খণ্ডকে স্বতন্ত্ররূপে সনাক্ত করতে ব্যবহার করা যেতে পারে।

Aleksey হিসাবে নির্দিষ্ট, আপনি একটি আইডি পাস করতে পারেন FragmentTransactionএর add(int, Fragment)পদ্ধতি। তবে এটি কোনও খণ্ডের জন্য আইডি নির্দিষ্ট করে না। এটি ViewGroupসন্নিবেশ করানোর জন্য একটির আইডি নির্দিষ্ট করে Fragment। আপনার যে উদ্দেশ্যটি আমি আশা করি তার জন্য এটি কার্যকর নয়, কারণ এটি অনন্যভাবে Fragmentগুলি সনাক্ত করে না , তবে ViewGroupএস s এই আইডিগুলিতে এমন একটি ধারক রয়েছে যা এক বা একাধিক টুকরো ডায়নামিকভাবে যুক্ত হতে পারে। এর সনাক্তকরণের জন্য এই জাতীয় পদ্ধতি ব্যবহারের জন্য আপনার প্রতিটি প্রবেশকারীর জন্য লেআউটটিতে গতিশীলভাবে Fragmentযুক্ত হওয়া প্রয়োজন । এটা বেশ কষ্টকর হবে।ViewGroupFragment

তাই আপনি যদি আপনার প্রশ্নের একটি অনন্য শনাক্তকারী আপনি পরিবর্তনশীল যোগ করছি একটি টুকরা জন্য তৈরি করার পদ্ধতি হল, উত্তর ব্যবহার করা FragmentTransactionএর অ্যাড (int- containerViewId, টুকরা টুকরা, স্ট্রিং ট্যাগ) পদ্ধতি এবং FragmentManagerএর findFragmentByTag (STRING) পদ্ধতি।

আমার একটি অ্যাপে আমি গতিশীলভাবে স্ট্রিং উত্পন্ন করতে বাধ্য হয়েছিলাম। তবে এটি প্রকৃত ফ্রেগমেন্ট ট্রান্সজেকশনের তুলনায় এত ব্যয়বহুল নয়।

ট্যাগ পদ্ধতির আরেকটি সুবিধা হ'ল এটি এমন একটি খণ্ডকে সনাক্ত করতে পারে যা ইউআইতে যুক্ত হচ্ছে না। ফ্রেগমেন্ট ট্রান্সজেকশনের অ্যাড (ফ্র্যাগমেন্ট, স্ট্রিং) পদ্ধতিটি দেখুন। Fragments এর দরকার নেই View! এগুলি কনফিগার পরিবর্তনের মধ্যে ক্ষুদ্রতর স্থিতিশীল অবস্থা অব্যাহত রাখতেও ব্যবহার করা যেতে পারে!


আমি যদি ট্যাগটি ব্যবহার করি এবং আইডিটি না খণ্ডের জন্য ব্যবহার করি তবে আমি কীভাবে প্রতিস্থাপন কলটি ব্যবহার করব যা একটি খণ্ড সংস্থান আইডির প্রয়োজন?
নমরাথা

12
@ টমডিগান কীভাবে এমন একটি খণ্ড যা ভিউপ্যাজারে যুক্ত হবে? আমি কিভাবে তার ট্যাগ সেট করতে পারি? আমি এই পরিস্থিতিতে লেনদেন ব্যবহার করতে পারি না।
গিলহ

1
@ গুইলএইচ্টিভিটি একটি অ্যাডফ্রেগমেন্ট () পদ্ধতি সরবরাহ করে যা আপনি ভিউপাগার থেকে উল্লেখ করতে পারেন। তার আগে ট্যাগটি রাখা একটি হ্যাশম্যাপ দিয়ে সম্পন্ন হতে পারে।
টমাস ডিগানান

1
আপনি কি এক্সএমএল লেআউটে আইডি সেট করতে পারবেন তা জোর দেওয়ার জন্য কি উত্তরটি একটি সামান্য বিট সম্পাদনা করা যেতে পারে? কারণ আমি ব্যক্তিগতভাবে অন্যান্য প্রশ্নগুলি পড়িনি এবং এই
ইভান

41

দেখা যাচ্ছে আপনাকে খণ্ড আইডি জানা দরকার নেই।

ডক্স থেকে:

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);

আর.আইডি.ফ্রেগমেন্ট_হোল্ডারে যা কিছু আছে (দুর্দান্ত) খণ্ডটি আপনাকে পেয়ে যাবে।


4

বেশিরভাগ ক্ষেত্রে আপনি আইডির পাশাপাশি ফ্রেগমেন্ট ট্যাগটি ব্যবহার করতে পারেন।
আপনি ট্যাগ মান সেট করতে পারেন FragmentTransaction.add(Fragment fragment, String tag );। তারপরে আপনি FragmentManager.findFragmentByTag(String tab)প্রশ্নটিতে টুকরাটি খুঁজে পেতে কমান্ডটি ব্যবহার করতে পারেন ।


2

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

আমার সমাধানগুলি এখনও পর্যন্ত সমস্ত বিশ্বের প্রাচীন (জাভা) ট্রিকের উপর নির্ভর করে: একটি সংক্ষিপ্ত টেম্পলেট টুকরা তৈরি করুন যা এর নির্মাতাদের মধ্যে একটি আইডি নেয় এবং একটি সরবরাহ করে getFragmentId() সেই আইডিটি দেয় যা সেই আইডি ফেরত দেয়। তারপরে আমি সেই খণ্ডগুলি প্রারম্ভিক সনাক্তকরণের প্রয়োজন সেই টেমপ্লেটটি প্রসারিত করে এবং; ভাল খবর! সমস্যা সমাধান.

এই সমাধানটির জন্য দুর্ভাগ্যক্রমে, টেম্পলেট টুকরাগুলির একটি সেট প্রয়োজন, প্রতিটি খণ্ডের ধরণের জন্য একটি ListFragment, DialogFragmentবা সাধারণ পুরানো Fragment(POFO ?!) যার প্রাথমিক সনাক্তকরণ প্রয়োজন। তবে এই লাভগুলি বিবেচনা করে খণ্ড খণ্ডের ক্ষেত্রে এটি পরিচালনাযোগ্য।

নিরাময় ক্ষত ছিঁড়ে দেওয়ার জন্য দুঃখিত :-)

চিয়ার্স!


0

নিম্নলিখিত ব্যবহার:

একটি খণ্ড যুক্ত করতে:

getFragmentManager().beginTransaction().add(R.id.fragment_container, fragmentToBeAdded, tag).commit();

বিদ্যমান খণ্ডটি সনাক্ত করতে:

getFragmentManager().findFragmentByTag(fragmentName);

উত্তর প্রশ্নের সাথে প্রাসঙ্গিক নয়। উত্তর আপডেট করুন। শুভ কোডিং
কোডউইথভিকাস

-1

একটি ট্যাগ ব্যবহার করার সময় দয়া করে এটি যোগ করার বিষয়ে নিশ্চিত হন

fragmentTransaction.addToBackStack(null); 

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

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

আপনি এই পৃষ্ঠার শেষে এটি সন্ধান করতে পারেন ।

সাধারণ findFragmentByTag();কলের মাধ্যমে কেন আমার ফ্রেগমেন্টটি পাওয়া যায় নি তা জানার চেষ্টা করে আমি প্রায় 30 মিনিট হারিয়েছি


-2

টমের উত্তর ছাড়াও, প্রতিস্থাপন পদ্ধতিটি পদ্ধতি যোগ করার পাশাপাশি খণ্ড ট্যাগটিকেও সমর্থন করে।

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