2012-12-08 12 views
7

मुझे पेजर के बिना टुकड़ों के माध्यम से नेविगेट करने का उचित तरीका पता लगाने में परेशानी हो रही है और मुझे स्क्रीन अभिविन्यास के लिए कॉन्फ़िगरेशन परिवर्तनों के दौरान समस्याएं आ रही हैं। मैं उन्हें दृश्यमान और कार्यात्मक बनाने के लिए टुकड़ों पर दिखाएँ/छुपाएं का उपयोग कर रहा हूं लेकिन मुझे आश्चर्य है कि मुझे इसके बजाय डिटेच/अटैच का उपयोग करना चाहिए। मुझे बैक स्टैक में चीजों को जोड़ने में भी समस्याएं आ रही हैं और मुझे लगता है कि यह शो/छुपा के उपयोग के कारण भी है। क्या अटैच/डिटेच का उपयोग करना बेहतर है या क्या पिछला/वर्तमान खंड दिखाने/छिपाने के लिए बैक बटन क्या करता है इसे ओवरराइड करने का कोई तरीका है।टुकड़े डिस्च/रीटैच बनाम दिखाएँ/छुपाएं

व्यवहार: मेरे पास नक्शा खंड और कुछ अन्य लोगों के साथ एक सूची खंड है। सबकुछ ठीक से शुरू होता है और प्रारंभिक रूप से अभिविन्यास परिवर्तनों के साथ काम करता है। जब मैं सूची में नेविगेट करता हूं तो यह सही ढंग से पॉप्युलेट करता है लेकिन अभिविन्यास परिवर्तन पर सूची में डेटा के बिना फिर से खींचा जाता है। मानचित्र दृश्य को भी फिर से खींचा जाता है और मेरे पेजर शीर्षक संकेतक के पीछे दिखाई देता है। यदि कोई मुझे यह हल करने के लिए सही दिशा में इंगित कर सकता है तो यह शानदार होगा। मुझे संदेह है कि इस तरह से होता है कि मैं टुकड़े दिखा रहा हूं और छुपा रहा हूं।

यहां वह जगह है जहां मैं टुकड़े बनाते हैं और उन्हें खंड प्रबंधक में जोड़ता हूं। मैंने यह भी दिखाया है कि मैं टुकड़े दिखाता/छुपाता हूं।

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_map_frags); 
    mapViewContainer = LayoutInflater.from(this) 
      .inflate(R.layout.map, null); 

    setupFragments(); 
    showFragment(0); 
} 
public void setListData(String name) { 
    bName = name; 
    showFragment(1); 
} 
private void setupFragments() { 
    final FragmentManager fm = getSupportFragmentManager(); 
    final FragmentTransaction ft = fm.beginTransaction(); 
    mFragment1 = fm.findFragmentByTag("f1"); 
    if (mFragment1 == null) { 
     mFragment1 = new MenuFragment(); 
     ft.add(mFragment1, "f1"); 
     ft.hide(mFragment1); 
    } 
    mMapFragment = (MapFragment) getSupportFragmentManager() 
      .findFragmentByTag(MapFragment.TAG); 
    if (mMapFragment == null) { 
     mMapFragment = MapFragment.newInstance(0); 
     ft.add(R.id.fragment_container, mMapFragment, MapFragment.TAG); 
    } 
    ft.hide(mMapFragment); 

    myListFragment = (ListFrag) getSupportFragmentManager() 
      .findFragmentByTag(ListFrag.TAG); 
    if (myListFragment == null) { 
     myListFragment = new ListFrag(); 
     ft.add(R.id.fragment_container, myListFragment, ListFrag.TAG); 
    } 
    ft.hide(myListFragment); 

    frag = (frag) getSupportFragmentManager().findFragmentByTag(
      frag.TAG); 
    if (frag == null) { 
     bacFrag = new frag(); 
     ft.add(R.id.fragment_container, frag, frag.TAG); 
    } 
    ft.hide(bacFrag); 
    ft.commit(); 
} 

public void showFragment(int fragIn) { 
    final FragmentTransaction ft = getSupportFragmentManager() 
      .beginTransaction(); 
    ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out); 
    if (mVisible != null) { 
     if (mVisible == mListFragment) { 
      ft.remove(mListFragment); 
     } else { 
      ft.hide(mVisible); 
     } 
    } 

    switch (fragIn) { 
    case 0: 
     ft.show(mMapFragment); 
     ft.commit(); 
     mVisible = mMapFragment; 
     break; 
    case 1: 
     mListFragment = (ListFragmentDisplay) getSupportFragmentManager() 
       .findFragmentByTag(ListFragmentDisplay.TAG); 
     Toast.makeText(this, "startListFrag", Toast.LENGTH_LONG).show(); 
     if (mListFragment == null) { 
      mListFragment = new ListFragmentDisplay(); 
      ft.add(R.id.fragment_container, mListFragment, 
        ListFragmentDisplay.TAG); 
     } 
     ft.show(mListFragment).commit(); 
     mVisible = mListFragment; 
     break; 
    case 2: 
     ft.show(myfragment).commit(); 
     mVisible = myfragment; 
     break; 
    case 3: 
     ft.show(frag).commit(); 
     mVisible = frag; 
     break; 
    } 
} 
+0

यदि आप अपनी गतिविधि को ओरिएंटेशन चेंज पर पुनरारंभ करने से रोकना चाहते हैं तो आप एंड्रॉइड में कॉन्फ़िगरेशन चेंज = "ओरिएंटेशन कीबोर्ड कीबोर्ड" जोड़ सकते हैं। – Faizan

+0

डिटेच/अटैच संसाधनों को मुक्त कर देगा, जबकि छुपाएं/शो नहीं होगा। – Faizan

उत्तर

4

यह आपकी गलती नहीं है। समस्या यह है कि जब अभिविन्यास बदलता है तो सभी गतिविधि नष्ट हो जाती है, यहां तक ​​कि सभी टुकड़े भी जोड़े जाते हैं। तो इसके भीतर कोई भी डेटा बरकरार नहीं है। android:configChanges="orientation|keyboardHidden" का उपयोग करने की सलाह नहीं दी जाती है। इसके बजाय, प्रत्येक खंड setRetainInstance(true) के लिए सेट करें और यह आपके वर्तमान कोड के साथ अच्छी तरह से काम करेगा।

+0

यह एक ही स्क्रीन पर एकाधिक टुकड़ों के लिए काम नहीं करता है। लेकिन इससे ऊपर मेरी समस्या हल हो गई थी, मैंने उसे छोड़ दिया और सबकुछ किसी अन्य तरीके से पुनर्निर्मित नहीं किया था। – doubleA

+0

यह वास्तव में शीर्षक में प्रश्न का उत्तर नहीं दे रहा है। – zgulser

0

यदि आप बेहतर दृढ़ता चाहते हैं (उदाहरण के लिए जब अंतरिक्ष के मुद्दों के लिए गतिविधि अस्थायी रूप से नष्ट हो जाती है) तो भी onSaveInstanceState के साथ अपने टुकड़ों की स्थिति को सहेजना याद रखें। setRetainInstance तभी काम करेगा जब कॉन्फ़िगरेशन परिवर्तन आने वाला है।

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