समर्थन पुस्तकालय का उपयोग किए बिना एंड्रॉइड 4.0, 4.1 (<4.2) में नेस्टेड टुकड़ों के लिए सर्वोत्तम अभ्यास


115

मैं 4.0 और 4.1 टैबलेट के लिए एक ऐप लिख रहा हूं, जिसके लिए मैं समर्थन पुस्तकालयों का उपयोग नहीं करना चाहता हूं (यदि आवश्यक नहीं है) लेकिन 4.x एपीआई केवल इसलिए।

इसलिए मेरा लक्ष्य प्लेटफ़ॉर्म बहुत अच्छी तरह से परिभाषित किया गया है:> = 4.0 और <= 4.1

एप्लिकेशन में एक बहु-फलक लेआउट (दो टुकड़े, बाईं ओर एक छोटा, दाईं ओर एक सामग्री टुकड़ा) और टैब के साथ एक एक्शन बार है।

इसके समान:

यहां छवि विवरण दर्ज करें

एक्शन बार पर एक टैब पर क्लिक करने से 'बाहरी' टुकड़ा बदल जाता है, और फिर आंतरिक टुकड़ा दो नेस्टेड टुकड़ों (1. छोटी सूची के टुकड़े, 2. व्यापक सामग्री टुकड़ा) के साथ एक टुकड़ा है।

मैं अब सोच रहा हूं कि टुकड़ों को बदलने और विशेष रूप से नेस्टेड टुकड़ों को बदलने के लिए सबसे अच्छा अभ्यास क्या है। ViewPager समर्थन पुस्तकालय का हिस्सा है, इस वर्ग के लिए कोई मूल 4.x विकल्प नहीं है। मेरे अर्थ में 'पदावनत' होना प्रकट होता है। - http://developer.android.com/reference/android/support/v4/view/ViewPager.html

फिर मैंने एंड्रॉइड 4.2 के लिए रिलीज़ नोट्स को पढ़ा ChildFragmentManager, जिसके बारे में , जो एक अच्छा होगा, लेकिन मैं 4.0 और 4.1 को लक्षित कर रहा हूं, इसलिए इसका उपयोग या तो नहीं किया जा सकता है।

ChildFragmentManager केवल 4.2 में उपलब्ध है

दुर्भाग्य से, वहाँ शायद ही कोई अच्छा उदाहरण है कि समर्थन पुस्तकालय के बिना टुकड़े usages के लिए सबसे अच्छा अभ्यास दिखा, यहां तक ​​कि पूरे Android डेवलपर गाइड में; और विशेष रूप से नेस्टेड टुकड़ों के बारे में कुछ भी नहीं।

इसलिए मुझे आश्चर्य हो रहा है: क्या यह संभव नहीं है कि समर्थन पुस्तकालय और इसके साथ आने वाली हर चीज का उपयोग किए बिना नेस्टेड टुकड़ों के साथ 4.1 ऐप लिखना संभव है? (FragmentActivity के बजाय Fragment, आदि का उपयोग करने की आवश्यकता है?) या सबसे अच्छा अभ्यास क्या होगा?


वर्तमान में विकास में मुझे जो समस्या हो रही है वह वास्तव में यह कथन है:

एंड्रॉइड सपोर्ट लाइब्रेरी अब नेस्टेड टुकड़ों का भी समर्थन करती है, इसलिए आप एंड्रॉइड 1.6 और उच्चतर पर नेस्टेड टुकड़ा डिजाइनों को लागू कर सकते हैं।

नोट: जब आप उस लेआउट को शामिल करते हैं, तो आप एक टुकड़े को एक टुकड़े में नहीं बढ़ा सकते <fragment>। घोंसले के टुकड़े का समर्थन केवल तब किया जाता है जब एक टुकड़े को गतिशील रूप से जोड़ा जाता है।

क्योंकि मैंने XML में नेस्टेड अंशों को परिभाषित किया है, जो स्पष्ट रूप से त्रुटि का कारण बनता है:

Caused by: java.lang.IllegalArgumentException: Binary XML file line #15: Duplicate id 0x7f090009, tag frgCustomerList, or parent id 0x7f090008 with another fragment for de.xyz.is.android.fragment.CustomerListFragment_

फिलहाल, मैं अपने लिए निष्कर्ष निकालता हूं: यहां तक ​​कि 4.1 पर, जब मैं 2.x प्लेटफ़ॉर्म को भी लक्षित नहीं करना चाहता हूं, तो स्क्रीनशॉट में दिखाए गए नेस्टेड टुकड़े समर्थन पुस्तकालय के बिना संभव नहीं हैं।

(यह वास्तव में एक प्रश्न से विकी प्रविष्टि का अधिक हो सकता है, लेकिन शायद किसी और ने इसे पहले प्रबंधित किया है)।

अपडेट करें:

एक उपयोगी उत्तर है: फ्रैगमेंट इनसाइड फ्रैगमेंट


22
आपके पास तीन विकल्प हैं: 1. देशी नेस्टेड टुकड़ों के साथ केवल 4.2 लक्ष्य। 2. लक्ष्य लायब्रेरी से नेस्टेड अंशों के साथ 4.x। किसी भी अन्य प्लेटफ़ॉर्म लक्ष्य परिदृश्यों के लिए नेस्टेड फ़्रेम्स का उपयोग न करें। यह आपके सवाल का जवाब देना चाहिए। इसके अलावा, आप xml लेआउट में एम्बेडेड नेस्टेड टुकड़ा का उपयोग नहीं कर सकते, उन सभी को कोड में जोड़ा जाना चाहिए। वहाँ शायद ही कोई अच्छा उदाहरण है कि समर्थन पुस्तकालय के बिना टुकड़े usages के लिए सबसे अच्छा अभ्यास दिखा - समर्थन टुकड़ा ढांचे मूल एक replicates तो किसी भी उदाहरण किसी भी तरह से काम करना चाहिए।
लुक्सप्रॉग

@Luksprog आपकी टिप्पणियों के लिए धन्यवाद। मैं आपके समाधान 2 को पसंद करता हूं और समर्थन पुस्तकालय में अच्छी तरह से काम करता हूं, लेकिन एक्शनबार में टैब - एफिक नहीं, मुझे एक्शनबेरलॉक का उपयोग करने की आवश्यकता होगी, लेकिन टैब एक्शनबेर में एकीकृत नहीं होंगे, लेकिन केवल नीचे (एनएन) 4.x के लिए आवश्यक)। और ActionBar.TabListener केवल Android.app.Fragment से फ़्रैगमेंट का समर्थन करती है, समर्थन लाइब्रेरी से नहीं।
मथियास कॉनरैड

2
मैं गैलेक्सी टैब पर कॉन्टैक्ट ऐप से परिचित नहीं हूं लेकिन ध्यान रखें कि आप हमेशा ActionBar(सैमसंग द्वारा निर्मित घर) के कस्टम कार्यान्वयन का सामना कर सकते हैं । ActionBarSherlock पर करीब से नज़र डालें, अगर कमरे में है तो यह ActionBar में टैब है।
लुक्सप्रॉग

4
@Luksprog मुझे विश्वास है कि आप पहले से ही केवल वही उत्तर दे सकते हैं जो देने के लिए है, क्या आप इसे उचित उत्तर के रूप में रखना चाहेंगे।
तानापिट

1
@ पोर्क सवाल का मेरा मुख्य कारण है: समर्थन पुस्तकालय का उपयोग किए बिना नेस्टेड टुकड़ों के लिए कोई भी कार्यपट्टी हैं और यह सभी अन्य दृश्य तत्व हैं। मतलब, अगर मैं सपोर्ट लाइब्रेरी में जाता हूं, तो मैं फ्रैगमेंट के बजाय फ्रैगमेंटएक्टिविटी का इस्तेमाल करूंगा। लेकिन मैं फ्रेगमेंट का उपयोग करना चाहता हूं, मैं चाहता हूं कि सभी नेस्टेड फ्रेगमेंट के लिए एक प्रतिस्थापन है , लेकिन सभी v4 घटकों के नहीं। अन्य खुले स्रोत पुस्तकालयों, आदि के माध्यम से वहाँ बाहर। उदाहरण के लिए ऊपर स्क्रीनशॉट 4.0 पर चलता है, और मैं सोच रहा हूं कि क्या वे ABS, SupportLib, या कुछ और का उपयोग कर रहे हैं।
मथियास कॉनराड

जवाबों:


60

सीमाएं

तो एक और टुकड़े के अंदर घोंसले के टुकड़े xml के साथ संभव नहीं है, चाहे FragmentManagerआप किस संस्करण का उपयोग करें।

इसलिए आपको कोड के माध्यम से टुकड़े जोड़ना होगा, यह एक समस्या की तरह लग सकता है, लेकिन लंबे समय में आपके लेआउट को शानदार बनाता है।

तो बिना उपयोग के घोंसले के शिकार getChildFragmentManger? पीछे childFragmentManagerका सार यह है कि यह तब तक लोडिंग को रोकता है जब तक कि पिछले टुकड़े का लेनदेन समाप्त नहीं हो जाता। और निश्चित रूप से यह केवल स्वाभाविक रूप से 4.2 या समर्थन पुस्तकालय में समर्थित था।

बालमनगर के बिना घोंसला बनाना - समाधान

समाधान, ज़रूर! मैं लंबे समय से ऐसा कर रहा हूं, (जब से ViewPagerघोषणा की गई थी)।

निचे देखो; यह एक Fragmentडिफर्स लोडिंग है, इसलिए Fragmentइसके अंदर एस लोड किया जा सकता है।

इसका बहुत सरल, Handlerवास्तव में बहुत आसान वर्ग है, प्रभावी रूप से हैंडलर एक स्थान के लिए प्रतीक्षा करता है ताकि मुख्य टुकड़ा चालू निष्पादन के बाद समाप्त हो जाए।

// Remember this is an example, you will need to modify to work with your code
private final Handler handler = new Handler();
private Runnable runPager;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    return inflater.inflate(R.layout.frag_layout, container, false);
}

@Override
public void onActivityCreated(Bundle savedInstanceState)
{
    super.onActivityCreated(savedInstanceState);
    runPager = new Runnable() {

        @Override
        public void run()
        {
          getFragmentManager().beginTransaction().addFragment(R.id.frag_container, MyFragment.newInstance()).commit();
        }
    };
    handler.post(runPager);
}

/**
 * @see android.support.v4.app.Fragment#onPause()
 */
@Override
public void onPause()
{
    super.onPause();
    handler.removeCallbacks(runPager);
}

मैं इसे 'सबसे अच्छा अभ्यास' नहीं मानूंगा, लेकिन मेरे पास इस हैक का उपयोग करने वाले लाइव ऐप हैं और मुझे इसके साथ कोई समस्या नहीं है।

मैं इस विधि का उपयोग व्यू पेजर्स को एम्बेड करने के लिए भी करता हूं - https://gist.github.com/chrisjenx/3405429


आप लेआउट नेस्टेड टुकड़ों को कैसे संभालते हैं?
पाब्लिसकोस जूल

जिस तरह से मैं इस काम को देख सकता था वह एक CustomLayoutInflater का उपयोग करके है, जैसा कि आप fragmentतत्व में आते हैं , आप सुपर कार्यान्वयन को ओवरराइड करेंगे और इसे स्वयं पार्स / फुलाएंगे। लेकिन यह प्रयास का बहुत होगा, एक StackOverflow सवाल के दायरे से बाहर।
क्रिस.जेनकिंस जूल

नमस्ते, किसी को भी इस मुद्दे में मेरी मदद कर सकते हैं ?? मैं वास्तव में अटक .. हूँ stackoverflow.com/questions/32240138/...
Nicks

2

प्री-एपीआई 17 में ऐसा करने का सबसे अच्छा तरीका यह नहीं है। इस व्यवहार को लागू करने की कोशिश मुद्दों को पैदा करने वाली है। हालांकि यह कहना नहीं है कि वर्तमान एपीआई 14. का उपयोग करके यह स्पष्ट रूप से गलत नहीं किया जा सकता है कि मैंने क्या किया था:

1 - टुकड़ों के बीच संचार को देखो http://developer.android.com/training/basics/fragments/communicate.html

2 - अपने लेआउट को अपने मौजूदा फ्रेग्मेंट से गतिविधि लेआउट में xml फ्रेमलेआउट ले जाएँ और 0 की ऊँचाई देकर इसे छिपाएँ:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent">
<FrameLayout android:id="@+id/content"
          android:layout_width="300dp"
          android:layout_height="match_parent" />


<FrameLayout android:id="@+id/lstResults"
             android:layout_width="300dp"
             android:layout_height="0dp"
             android:layout_below="@+id/content"
             tools:layout="@layout/treeview_list_content"/>


<FrameLayout android:id="@+id/anomalies_fragment"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
        android:layout_toRightOf="@+id/content" />

3 - पैरेंट फ्रैगमेंट में इंटरफेस को लागू करें

    OnListener mCallback;

// Container Activity must implement this interface
public interface OnListener 
{
    public void onDoSomethingToInitChildFrame(/*parameters*/);
    public void showResults();
    public void hideResults();
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    // This makes sure that the container activity has implemented
    // the callback interface. If not, it throws an exception
    try {
        mCallback = (OnFilterAppliedListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement OnListener");
    }
}

@Override
public void onActivityCreated(Bundle savedInstanceState) 
{
    super.onActivityCreated(savedInstanceState);

    mCallback.showResults();
}

@Override
public void onPause()
{
    super.onPause();

    mCallback.hideResults();
}

public void onClickButton(View view)
{
    // do click action here

    mCallback.onDoSomethingToInitChildFrame(/*parameters*/);
}

4 - मूल गतिविधि में इंटरफ़ेस को लागू करें

सार्वजनिक वर्ग YourActivity फैक्ट्री इम्प्लीमेंट्स आपकीParentFragment.OnListener {

public void onDoSomethingToInitChildFrame(/*parameters*/)
{
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    Fragment childFragment = getFragmentManager().findFragmentByTag("Results");
    if(childFragment == null)
    {
        childFragment = new yourChildFragment(/*parameters*/);
        ft.add(R.id.lstResults, childFragment, "Results");
    }
    else
    {
        ft.detach(childFragment);

        ((yourChildFragment)childFragment).ResetContent(/*parameters*/);

        ft.attach(childFragment);
    }
    ft.commit();

    showResultsPane();
}

public void showResults()
{
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    Fragment childFragment = getFragmentManager().findFragmentByTag("Results");
    if(childFragment != null)
        ft.attach(childFragment);
    ft.commit();

    showResultsPane();
}

public void showResultsPane()
{
    //resize the elements to show the results pane
    findViewById(R.id.content).getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
    findViewById(R.id.lstResults).getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
}

public void hideResults()
{
    //resize the elements to hide the results pane
    findViewById(R.id.content).getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;
    findViewById(R.id.lstResults).getLayoutParams().height = 0;

    FragmentTransaction ft = getFragmentManager().beginTransaction();
    Fragment childFragment = getFragmentManager().findFragmentByTag("Results");
    if(childFragment != null)
        ft.detach(childFragment);
    ft.commit();
}

}

5 - आनंद लें, इस विधि के साथ आपको एक समान द्रव कार्यक्षमता मिलती है जैसे कि getChildFragmentManager () फ़ंक्शन के साथ प्री-एपीआई 17 एनवर्जनमेंट में। जैसा कि आपने देखा होगा कि बाल टुकड़ा वास्तव में माता-पिता के टुकड़े का बच्चा नहीं है, लेकिन अब गतिविधि का एक बच्चा है, यह वास्तव में टाला नहीं जा सकता।


1

मुझे नेविगेशनड्रॉयर, टैबहॉस्ट और व्यूपेज के संयोजन के कारण इस सटीक मुद्दे से निपटना पड़ा, जिसमें टैबहॉस्ट के कारण समर्थन पुस्तकालय के उपयोग के साथ जटिलताएं थीं। और फिर मुझे जेलीबीन 4.1 के मिनट एपीआई का भी समर्थन करना पड़ा, इसलिए नेचुरलफ्रैगमेंट मैनजर के साथ नेस्टेड टुकड़ों का उपयोग करना एक विकल्प नहीं था।

तो मेरी समस्या दूर हो सकती है ...

TabHost (शीर्ष स्तर के लिए)
+ ViewPager (शीर्ष स्तर के केवल एक खंडित टुकड़े के लिए)
= नेस्टेड फ़्रैगमेंट की आवश्यकता (जो कि जेलीबीन 4.1 का समर्थन नहीं करेगा)

मेरा समाधान वास्तव में घोंसले के टुकड़े के बिना नेस्टेड टुकड़ों का भ्रम पैदा करना था। मैंने मुख्य गतिविधि का उपयोग करके TabHost और ViewPager को दो भाई दृश्यों का प्रबंधन करने के लिए उपयोग किया, जिनकी दृश्यता 0 और 1 के बीच लेआउट_वेट द्वारा प्रबंधित की जाती है।

//Hide the fragment used by TabHost by setting height and weight to 0
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0, 0);
mTabHostedView.setLayoutParams(lp);
//Show the fragment used by ViewPager by setting height to 0 but weight to 1
lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0, 1);
mPagedView.setLayoutParams(lp);

इसने प्रभावी रूप से मेरे नकली "नेस्टेड फ्रैगमेंट" को एक स्वतंत्र दृश्य के रूप में संचालित करने की अनुमति दी जब तक कि मैं प्रासंगिक लेआउट वेट को मैन्युअल रूप से प्रबंधित नहीं करता।

यहाँ मेरी गतिविधि_मैं.एक्सएमएल है:

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.ringofblades.stackoverflow.app.MainActivity">

    <TabHost
        android:id="@android:id/tabhost"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <LinearLayout android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <FrameLayout android:id="@android:id/tabcontent"
                android:background="@drawable/background_image"
                android:layout_width="match_parent"
                android:layout_weight="0.5"
                android:layout_height="0dp"/>
            <android.support.v4.view.ViewPager
                xmlns:tools="http://schemas.android.com/tools"
                android:id="@+id/pager"
                android:background="@drawable/background_image"
                android:layout_width="match_parent"
                android:layout_weight="0.5"
                android:layout_height="0dp"
                tools:context="com.ringofblades.stackoverflow.app.MainActivity">
                <FrameLayout
                    android:id="@+id/container"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent" />
            </android.support.v4.view.ViewPager>
            <TabWidget android:id="@android:id/tabs"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </LinearLayout>
    </TabHost>

    <fragment android:id="@+id/navigation_drawer"
        android:layout_width="@dimen/navigation_drawer_width"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:name="com.ringofblades.stackoverflow.app.NavigationDrawerFragment"
        tools:layout="@layout/fragment_navigation_drawer" />
</android.support.v4.widget.DrawerLayout>

ध्यान दें कि "@ + आईडी / पेजर" और "@ + आईडी / कंटेनर" भाई बहन हैं जो 'एंड्रॉइड: लेआउट_वेट = "0.5" और' एंड्रॉइड: लेआउट_हाइट = "0 डीपी" हैं। यह इतना है कि मैं इसे किसी भी स्क्रीन आकार के लिए पूर्वावलोकनकर्ता में देख सकता हूं। उनके वजन को रनटाइम के दौरान कोड में हेरफेर किया जाएगा, वैसे भी।


नमस्ते, मैं उत्सुक हूं कि आपने टैब के साथ एक्शनबार के बजाय टैबहोस्ट का उपयोग क्यों चुना? मैंने खुद को TabHost से सिर्फ ActionBar में स्विच किया, और मेरा कोड क्लीनर और अधिक कॉम्पैक्ट बन गया ...
इगोरगानपोलस्की

जहाँ तक मुझे याद है, ActionBar में टैब का उपयोग करने का एक दोष यह है कि यह उन्हें स्पिनर ड्रॉप-डाउन मेनू (छोटी स्क्रीन के मामले में) के रूप में दिखाने के लिए स्वचालित रूप से निर्णय लेता है और यह मेरे लिए अच्छा नहीं था। लेकिन मुझे 100% यकीन नहीं है।
विंडराइडर

@Igor, मैंने यहां कहीं पढ़ा है SOकि ActionBarटैब के साथ प्रयोग करना Navigation Drawerअच्छा नहीं है क्योंकि यह आपके ड्रॉअर के दृश्य पर स्वचालित रूप से टैब लगाएगा। क्षमा करें, मेरे पास इसे वापस करने के लिए लिंक नहीं है।
Azurespot

1
@NoniA। blog.xamarin.com/android-tips-hello-toolbar-goodbye-action-bar क्या आप Android के विकास का पालन करते हैं?
इगोरगानापोलस्की

1
वाह, लिंक @Igor के लिए धन्यवाद! मैं यह सुनिश्चित करने के लिए बाहर की जाँच करेगा। मैं अभी भी शुरुआती हूं, इसलिए एंड्रॉइड के साथ सीखने के लिए एक लाख अन्य चीजें हैं, लेकिन यह एक मणि की तरह लगता है! एक बार फिर धन्यवाद।
Azurespot

1

@ क्रिस.जेनकिन्स उत्तर पर बिल्डिंग, यह वह समाधान है जो मेरे लिए अच्छा काम कर रहा है, जीवन चक्र की घटनाओं के दौरान टुकड़ा (ओं) को हटाने के लिए (जो कि अवैध तरीके से फेंकने की प्रवृत्ति है)। यह हैंडलर दृष्टिकोण के संयोजन का उपयोग करता है, और एक Activ.isFinishing () चेक (अन्यथा यह "onSaveInstanceState के बाद यह क्रिया नहीं कर सकता" के लिए एक त्रुटि फेंक देगा)।

import android.app.Activity;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;

public abstract class BaseFragment extends Fragment {
    private final Handler handler = new Handler();

    /**
     * Removes the {@link Fragment} using {@link #getFragmentManager()}, wrapped in a {@link Handler} to
     * compensate for illegal states.
     *
     * @param fragment The {@link Fragment} to schedule for removal.
     */
    protected void removeFragment(@Nullable final Fragment fragment) {
        if (fragment == null) return;

        final Activity activity = getActivity();
        handler.post(new Runnable() {
            @Override
            public void run() {
                if (activity != null && !activity.isFinishing()) {
                    getFragmentManager().beginTransaction()
                            .remove(fragment)
                            .commitAllowingStateLoss();
                }
            }
        });
    }

    /**
     * Removes each {@link Fragment} using {@link #getFragmentManager()}, wrapped in a {@link Handler} to
     * compensate for illegal states.
     *
     * @param fragments The {@link Fragment}s to schedule for removal.
     */
    protected void removeFragments(final Fragment... fragments) {
        final FragmentManager fragmentManager = getFragmentManager();
        final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        for (Fragment fragment : fragments) {
            if (fragment != null) {
                fragmentTransaction.remove(fragment);
            }
        }

        final Activity activity = getActivity();
        handler.post(new Runnable() {
            @Override
            public void run() {
                if (activity != null && !activity.isFinishing()) {
                    fragmentTransaction.commitAllowingStateLoss();
                }
            }
        });
    }
}

उपयोग:

class MyFragment extends Fragment {
    @Override
    public void onDestroyView() {
        removeFragments(mFragment1, mFragment2, mFragment3);
        super.onDestroyView();
    }
}

1

हालांकि ओपी के पास विशेष परिस्थितियां हो सकती हैं जो उसे समर्थन पुस्तकालय का उपयोग करने से रोकती हैं, ज्यादातर लोगों को इसका उपयोग करना चाहिए। Android प्रलेखन इसकी अनुशंसा करता है, और यह आपके एप्लिकेशन को व्यापक दर्शकों के लिए उपलब्ध कराएगा।

में मेरी संपूर्ण जवाब यहाँ मैं एक उदाहरण कैसे समर्थन पुस्तकालय के साथ नेस्टेड टुकड़े का उपयोग करने का प्रदर्शन कर दिया।

यहां छवि विवरण दर्ज करें


मैं ओपी था। समर्थन लिबास का उपयोग नहीं करने का कारण यह था कि यह एक कंपनी आंतरिक ऐप था, जहां उपयोग किए गए हार्डवेयर को स्पष्ट रूप से> = 4.0 और <= 4.1 के रूप में परिभाषित किया गया था। व्यापक दर्शकों तक पहुंचने की कोई आवश्यकता नहीं थी, यह आंतरिक कर्मचारी थे और कंपनी के बाहर ऐप का उपयोग करने का कोई इरादा नहीं था। समर्थन परिवाद का एकमात्र कारण पिछड़ा संगत होना है - लेकिन कोई यह उम्मीद करेगा कि आप जो कुछ भी समर्थन पुस्तकालय के साथ कर सकते हैं, आपको उसके बिना "मूल रूप से" प्राप्त करने में सक्षम होना चाहिए। एक "देशी" उच्च संस्करण में एक समर्थन पुस्तकालय की तुलना में कम विशेषताएं क्यों होंगी जिनका केवल उद्देश्य नीचे-संगत होना है।
मैथियास कॉनरैड

1
बेशक आप समर्थन पुस्तकालय का उपयोग कर सकते हैं और मैं भी कर सकता था। बस यह समझ में नहीं आया कि Google केवल समर्थन लाइब्रेरी में सुविधाएँ क्यों प्रदान करता है, लेकिन बाहर नहीं, या वे इसे समर्थन पुस्तकालय क्यों कहेंगे और इसे समग्र मानक नहीं बनाते हैं, यदि यह वैसे भी सबसे अच्छा अभ्यास है। यहाँ समर्थन पुस्तकालय के बारे में एक अच्छा लेख है: martiancraft.com/blog/2015/06/android-support-library
Mathias

@ माथियास, अच्छा लेख।
सुरगाछ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.