খণ্ডগুলির মধ্যে খণ্ডগুলি


145

আমি ভাবছি যে এটি আসলে অ্যান্ড্রয়েড এপিআই-এ কোনও বাগ আছে:

আমার মত একটি সেটআপ আছে:

┌----┬---------┐
|    |         |
|  1 |    2    |
|    |┌-------┐|
|    ||       ||
|    ||   3   ||
└----┴┴-------┴┘
  1. একটি মেনু যা ডান ফলকে # 2 (একটি অনুসন্ধান স্ক্রিন) লোড করে।
  2. একটি অনুসন্ধান স্ক্রিন যা খণ্ড # 3 রয়েছে যা ফলাফলের তালিকা।
  3. ফলাফলের তালিকাটি বেশ কয়েকটি জায়গায় ব্যবহার করা হয় (এর নিজস্ব ডানদিকে একটি উচ্চ স্তরের খণ্ড হিসাবে)।

এই কার্যকারিতা একটি ফোনে পুরোপুরি ভাল কাজ করে (যেখানে 1 এবং 2 এবং 3 ActivityFragmentগুলি হয়)।

তবে, আমি যখন এই কোডটি ব্যবহার করেছি:

    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();       
    Fragment frag = new FragmentNumber2();
    if(toLoad != null) frag.setArguments(toLoad);
    transaction.replace(R.id.rightPane, frag);      
    transaction.commit();

কোথায় R.id.leftPaneএবং R.id.rightPaneহয় <fragment>একটি অনুভূমিক রৈখিক লেআউট গুলি।

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

07-27 15:22:55.940: ERROR/AndroidRuntime(8105): Caused by: java.lang.IllegalArgumentException: Binary XML file line #57: Duplicate id 0x7f080024, tag null, or parent id 0x0 with another fragment for FragmentNumber3

এই কারণটি হয়েছে কারণ ফ্র্যাগমেন্টমম্বার 3 এর ধারকটি নকল হয়ে গেছে এবং এর আর কোনও অনন্য আইডি নেই। নতুনটি যুক্ত হওয়ার আগে প্রাথমিক খণ্ডটি (?) নষ্ট করা হয়নি (মনে মনে এর অর্থ এটি প্রতিস্থাপন করা হয়নি )।

কেউ যদি এটি সম্ভব হয় তবে আমাকে বলতে পারবেন ( এই উত্তরটি এটি দেয় না) বা এটি কোনও বাগ?



6
@ আরআরএস এটি একটি প্রাচীন প্রশ্ন, সদৃশ হিসাবে চিহ্নিত করার জন্য কিছুটা অর্থহীন।
pietv8x

উত্তর:


203

নেস্টেড টুকরা বর্তমানে সমর্থিত নয়। অন্য একটি খণ্ডের ইউআইয়ের মধ্যে একটি টুকরো রাখার চেষ্টা করার ফলে অনির্ধারিত এবং সম্ভবত ভাঙা আচরণ হবে।

আপডেট : নেস্টেড টুকরাগুলি অ্যান্ড্রয়েড ৪.২ (এবং অ্যান্ড্রয়েড সাপোর্ট লাইব্রেরি রেভ ১১) হিসাবে সমর্থিত : http://developer.android.com/about/versions/android-4.2.html# নেস্ট্রেড অংশসমূহ

উল্লেখ্য (যেমন প্রতি এই দস্তাবেজ ): " টীকা: আপনি একটি টুকরা যখন যে বিন্যাস একটি অন্তর্ভুক্ত মধ্যে একটি লেআউট ফোলান করতে পারবে না <fragment>। যখন পরিবর্তনশীল একটি টুকরা যোগ করা নেস্টেড টুকরা শুধুমাত্র সমর্থিত। "


14
সমর্থিত নয় কারণ এটি প্রাথমিক বাস্তবায়নের জন্য কোনও ডিজাইনের লক্ষ্য ছিল না। বৈশিষ্ট্যটির জন্য আমি প্রচুর অনুরোধ শুনেছি, তাই এটি সম্ভবত কোনও সময়ে সম্পন্ন হবে, তবে যথারীতি অন্যান্য প্রচুর জিনিসও এর সাথে অগ্রাধিকারের সাথে প্রতিযোগিতা করে।
2:51

4
আমি ফ্রেগমেন্টএটিভিটি, ফ্রেগমেন্টম্যানেজার এবং ফ্র্যাগমেন্ট ট্রান্সজেকশন প্রসারিত করে এটি পরিচালনা করেছি। মৌলিক ভিত্তি আমার ক্রিয়াকলাপগুলিতে ডেফারিংফ্র্যাগমেন্টএটিভিটি প্রসারিত করা হয়, একই এপিআই সরবরাহ করে যাতে অন্য কোনও কোড পরিবর্তন হয় না। আমি যখন getFragmentManager বলি, তখন আমি একটি উদাহরণ পাই যে DeferFramentManager, এবং যখন আমি startTransaction কল করি, তখন আমি একটি DeferredTransaction পাই। এই লেনদেনটি POJO গুলি তথাকথিত পদ্ধতি এবং যুক্তিগুলির সাথে সঞ্চয় করে। কমিট যখন কল হয়, আমরা প্রথমে কোনও মুলতুবি ডিফার্ড ট্রান্সঅ্যাকশনগুলির সন্ধান করি। সমস্ত লেনদেন প্রতিশ্রুতিবদ্ধ হয়ে গেলে, আমরা একটি আসল লেনদেন শুরু করি এবং আরোগুলি সহ সমস্ত সঞ্চিত পদ্ধতি চালাই।
ডিস্কিনার

11
পয়েন্ট এখন। নেস্টেড Fragmentএস এখন অ্যান্ড্রয়েড এপিআইয়ের অংশ, হ্যাঁ! বিকাশকারী.অ্যান্ড্রয়েড . com/about/versions/…
অ্যালেক্স লকউড

9
বাহ, কী দুঃস্বপ্ন: "টুকরাটি ভিউ তৈরি করে নি" এর মতো ব্যতিক্রমগুলি রহস্যজনকভাবে ব্যর্থ হয়। বেশ কয়েক ঘন্টা সময় ডিবাগ করা যায় ...
গ্লেন মেইনার্ড

6
@ মার্টনমারকনসিনি নিশ্চিত তবে এটি এপিআই সরবরাহকারীর কার্যকারিতার উপর ভিত্তি করে কিছুই নয় not যদি কিছু অনুমোদিত না হয় তবে এটি স্পষ্টভাবে নথিভুক্ত করা উচিত , বিকাশকারীকে তাদের চুলগুলি বাইরে টানতে ছেড়ে দেওয়া উচিত নয় কারণ কিছু আপনি প্রত্যাশা মতো কাজ করছেন না would
ডিসকো

98

নেস্টেড টুকরাগুলি অ্যান্ড্রয়েড ৪.২ এবং তারপরে সমর্থিত

অ্যান্ড্রয়েড সমর্থন লাইব্রেরি এখন নেস্টেড টুকরাগুলিকে সমর্থন করে , তাই আপনি অ্যান্ড্রয়েড ১. and এবং এর চেয়ে বেশি এর উপরে নেস্টেড টুকরা ডিজাইন প্রয়োগ করতে পারেন।

কোনও খণ্ডে বাসা বাঁধার জন্য , কেবলমাত্র সেই ফ্রেগমেন্টে getChildFraamentManager () কল করুন যেখানে আপনি একটি খণ্ড যুক্ত করতে চান। এটি এমন একটি ফ্রেগমেন্ট ম্যানেজারকে ফিরিয়ে দেয় যা আপনি সাধারণত খণ্ডের লেনদেন তৈরি করতে শীর্ষ-স্তরের কার্যকলাপ থেকে আপনার মতো ব্যবহার করতে পারেন। উদাহরণস্বরূপ, এখানে কিছু কোড রয়েছে যা বিদ্যমান ফ্রেগমেন্ট শ্রেণীর মধ্যে থেকে একটি খণ্ড যুক্ত করেছে:

Fragment videoFragment = new VideoPlayerFragment();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.video_fragment, videoFragment).commit();

নেস্টেড টুকরো সম্পর্কে আরও ধারণা পেতে দয়া করে এই টিউটোরিয়ালটি
পার্ট 1
পার্ট 2
পার্ট 3 দেখুন

এবং এখানে একটি এসও পোস্ট রয়েছে যা নেস্টেড টুকরোগুলির জন্য সেরা অনুশীলনগুলি সম্পর্কে আলোচনা করে ।


নেস্টেডফ্র্যাগমেন্টের প্রধান অসুবিধা হ'ল আমরা চাইল্ডফ্রেগমেন্ট থেকে বিকল্পমেনু কল করতে পারি না :( আমরা যদি এবিএস ব্যবহার করে থাকি!
LOG_TAG

আপনি কি আমার ইস্যুটি দেখতে পারেন ?? এটির মতোই .. স্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি / ৩২২৪০১138 / ।। আমার জন্য সন্তান framnet কোড থেকে স্ফীত পাচ্ছেন না
Nicks

33

.. আপনি প্যারেন্ট টুকরা destroyviewপদ্ধতিতে আপনার নেস্টেড টুকরাটি পরিষ্কার করতে পারেন :

@Override
    public void onDestroyView() {

      try{
        FragmentTransaction transaction = getSupportFragmentManager()
                .beginTransaction();

        transaction.remove(nestedFragment);

        transaction.commit();
      }catch(Exception e){
      }

        super.onDestroyView();
    }

4
আপনি যদি সেটএলওয়েজফিনিশ ( bricolsoftconsulting.com/2011/12/23/… ) এর সাথে কিছু জীবনচক্র পরীক্ষা করে থাকেন তবে আপনি দেখতে পাবেন যে এই কোডটি ত্রুটি সৃষ্টি করে যখন অন্য ক্রিয়াকলাপটি সর্বদা সক্ষম হয়ে শেষ হয় (অবৈধ স্ট্যাটএক্সেপশন: এই ক্রিয়াটি সম্পাদন করতে পারে না onSaveInstanceState) পরে। চেষ্টা / ধরার জন্য উপরের কোডটি মোড়ানো সর্বাধিক মার্জিত সমাধান নয় তবে মনে হয় এটি সবকিছু কাজ করে।
থিও

এটি প্রায় কাজ করে। পরে আমি ইউআই আঁকার উপর একটি স্ট্যাকওভারফ্লো পেয়েছি। অবশ্যই নেস্টেড টুকরো
এড়ান

14

আমার একটি অ্যাপ্লিকেশন রয়েছে যা আমি বিকাশ করছি যা অ্যাকশন বারের ট্যাবগুলির সাথে টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরোগুলি প্রবর্তন করে similar

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

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

আমি মনে করি এটা আপনার কাজে লাগবে.


এই পদ্ধতির কার্যকারিতা সম্পর্কে কেউ মন্তব্য করতে পারেন? আমি কেবলমাত্র এক স্তর গভীরভাবে টুকরো টুকরো টুকরোটি ব্যবহার করতে সক্ষম হওয়াটি দুর্ভাগ্যজনক বলে মনে করি them প্লেসোল্ডার ভিউ গ্রুপগুলিতে তাদের প্রোগ্রামগতভাবে যুক্ত করা ক্যাভ্যাট ছাড়াই কাজ করবে?
রাফায়েল নোব্রে

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

4

আমি একই সমস্যার মুখোমুখি হয়েছি, এর সাথে বেশ কয়েকদিন লড়াই করেছি এবং বলতে হবে যে আমি এটি পরাস্ত করার সবচেয়ে সহজতম উপায় হ'ল ফ্রেমমেন্টহাইড () / ফ্রেগমেন্ট.শো () ব্যবহার করা যখন ট্যাবটি নির্বাচিত / নির্বাচিত না হয় ()।

public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft)
{
    if (mFragment != null)
        ft.hide(mFragment);
}

যখন স্ক্রিন ঘূর্ণন ঘটে তখন সমস্ত পিতামাতার এবং সন্তানের টুকরাগুলি সঠিকভাবে ধ্বংস হয়ে যায়।

এই পদ্ধতির একটি অতিরিক্ত সুবিধাও রয়েছে - লুকোচুরি () / শো () ব্যবহার করে খণ্ডিত দর্শনগুলি তাদের রাজ্যটি শিথিল করে না, সুতরাং উদাহরণস্বরূপ স্ক্রোলভিউজের জন্য পূর্ববর্তী স্ক্রোল অবস্থানটি পুনরুদ্ধার করার দরকার নেই।

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

আমি আরও অভিজ্ঞ বিকাশকারীদের কাছ থেকে মন্তব্য শুনতে চাই।


0

যদি আপনি দেখতে পান যে আপনার নেস্টেড টুকরাটি সরানো হচ্ছে না বা নকল করা হচ্ছে না (উদাহরণস্বরূপ, কার্যকলাপ পুনরায় চালু করা, স্ক্রিনে ঘোরানোর সময়) পরিবর্তনের চেষ্টা করুন:

transaction.add(R.id.placeholder, newFragment);

প্রতি

transaction.replace(R.id.placeholder, newFragment);

উপরেরটি যদি সহায়তা না করে তবে চেষ্টা করুন:

Fragment f = getChildFragmentManager().findFragmentById(R.id.placeholder);

FragmentTransaction transaction = getChildFragmentManager().beginTransaction();

if (f == null) {
    Log.d(TAG, "onCreateView: fragment doesn't exist");
    newFragment= new MyFragmentType();
    transaction.add(R.id.placeholder, newFragment);
} else {
    Log.d(TAG, "onCreateView: fragment already exists");
    transaction.replace(R.id.placeholder, f);
}
transaction.commit();

এখানে শিখেছি

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