2012-06-22 21 views
14

मैं एक गतिविधि-एकाधिक टुकड़े एप्लिकेशन का निर्माण कर रहा हूं। मैं प्रत्येक लेनदेन के बाद बैकस्टैक में जोड़ता हूं। छिपाने और टुकड़े दिखाने के बाद और फिर मैं फोन घुमाता हूं, कंटेनर पर जोड़े गए सभी टुकड़े बहाल किए गए थे और प्रत्येक टुकड़ा दूसरे के शीर्ष पर था।छिपे हुए बैकस्टैक टुकड़े कॉन्फ़िगरेशन परिवर्तन पर फिर से दिखाए गए

समस्या क्या हो सकती है? मेरी गतिविधि क्यों उन टुकड़ों को दिखा रही है जिन्हें मैंने पहले छुपाया था?

मैं पहले से छिपे हुए-अब दिखाए गए टुकड़ों को छिपाने की सोच रहा हूं लेकिन क्या ऐसा करने का एक और 'सुंदर' तरीका है?

+0

बस ध्यान दें, छिपे हुए टुकड़े को पहले से ही कंटेनर के रूप में अदृश्य में रखा जाता है। इसलिए कॉन्फ़िगरेशन बदलना संभवतः उन्हें फिर से दिखा सकता है क्योंकि वे पहले से ही वहां हैं। – zgulser

उत्तर

0

आप छिपाने और दिखाने के बजाए replace() फ़ंक्शन का उपयोग करने का प्रयास करना चाह सकते हैं। मुझे एक ही समस्या थी जब मैंने Fragments का उपयोग शुरू किया और प्रतिस्थापन फ़ंक्शन का उपयोग करके वास्तव में Fragments को बेहतर तरीके से प्रबंधित करने में मदद मिली। यहां एक त्वरित उदाहरण है: प्रत्येक खंड पर

fragmentManager.replace(R.id.fragmentContainer, desiredFragment, DESIRED_FRAGMENT_TAG)         
       .addToBackStack(null) 
       .commit(); 
9

उपयोग setRetainInstance(true) और अपनी समस्या गायब हो जाएगा।
चेतावनी: इसे सही पर सेट करने से फ्रैगमेंट्स जीवन चक्र बदल जाएगा।
जबकि setRetainInstance(true) इस मुद्दे को हल करता है, ऐसे मामले हो सकते हैं जहां आप इसका उपयोग नहीं करना चाहते हैं। कि ठीक करने के लिए, सेटअप टुकड़ा पर एक बूलियन विशेषता और दृश्यता बहाल:

private boolean mVisible = true; 
@Override 
public void onCreate(Bundle _savedInstanceState) { 
    super.onCreate(_savedInstanceState); 
    if (_savedInstanceState!=null) { 
     mVisible = _savedInstanceState.getBoolean("mVisible"); 
    } 
    if (!mVisible) { 
     getFragmentManager().beginTransaction().hide(this).commit(); 
    } 
    // Hey! no setRetainInstance(true) used here. 
} 
@Override 
public void onHiddenChanged(boolean _hidden) { 
    super.onHiddenChanged(_hidden); 
    mVisible = !_hidden; 
} 
@Override 
public void onSaveInstanceState(Bundle _outState) { 
    super.onSaveInstanceState(_outState); 
    if (_outState!=null) { 
     _outState.putBoolean("mVisible", mVisible); 
    } 
} 

एक बार विन्यास बदलाव (जैसे स्क्रीन अभिविन्यास), उदाहरण के नष्ट हो जाएगा, लेकिन बंडल संग्रहीत और इंजेक्ट किया जाएगा करने के लिए नया टुकड़ा उदाहरण।

2

मुझे एक ही समस्या थी। आपको अपनी गतिविधि के क्रिएटिव्यू() पर फ़ंक्शन में स्रोत कोड देखना चाहिए।

public class MainActivity extends Activity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    setContentView(R.layout.activity_main); 

    if(savedInstanceState == null){//for the first time 

     FragmentManager fragmentManager = getFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

     FragmentExample fragment = new FragmentExample(); 
     fragmentTransaction.add(R.id.layout_main, fragment); 
     fragmentTransaction.commit(); 

    }else{//savedInstanceState != null 
     //for configuration change or Activity UI is destroyed by OS to get memory 
     //no need to add Fragment to container view R.id.layout_main again 
     //because FragmentManager supported add the existed Fragment to R.id.layout_main if R.id.layout_main is existed. 
     //here is one different between Fragment and View 

    } 
} 

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:id="@+id/layout_main"> 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^