2013-08-19 7 views
15

मुझे http://developer.android.com/training/implementing-navigation/nav-drawer.html से दिशानिर्देशों का उपयोग करके एक ड्रावरलाउट के साथ एक गतिविधि मिली है। अबएक दूसरे पर प्रदर्शित टुकड़े

Fragment fragment; 
Bundle args = new Bundle();  
fragment = new NewsListFragment(); 
args.putInt("category", position); 

// Insert the fragment by replacing any existing fragment 
FragmentManager fragmentManager = getSupportFragmentManager(); 
fragmentManager.beginTransaction() 
        .replace(R.id.content_frame, fragment) 
        .commit();   
mDrawerList.setItemChecked(position, true); 

, कभी कभी पुराने टुकड़ा की जगह नहीं है, लेकिन नया टुकड़ा वर्ष एक के शीर्ष पर रखा गया है:

जब मैं एक drawerItem पर क्लिक करें, मैं नया टुकड़ा के साथ वर्तमान दृश्य बदल देते हैं:

http://img15.imageshack.us/img15/3179/1kqj.png

ऐसा क्यों है, और कैसे इस समस्या को हल करने के लिए?

प्रासंगिक एक्सएमएल:

<!-- The main content view --> 
<LinearLayout 
    android:id="@+id/rlMain" 
    android:layout_width="fill_parent" 
    android:orientation="vertical" 
    android:layout_height="fill_parent"> 

    <FrameLayout 
     android:id="@+id/content_frame" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_weight="1"> 
    </FrameLayout> 

यह केवल कभी कभी होता है, और मैं एक प्रवाह अभी तक इसे फिर करने के लिए नहीं मिला है। ऐप घूर्णन का समर्थन नहीं करता है, इसलिए यह वहां नहीं होगा।

+0

टुकड़ा टुकड़ा; बंडल args = नया बंडल(); खंड = नया न्यूजलिस्ट फ्रैगमेंट(); args.putInt ("श्रेणी", स्थिति); // किसी भी मौजूदा टुकड़े को बदलकर टुकड़ा डालें FragmentManager fragmentManager = getSupportFragmentManager(); खंड प्रबंधक।beginTransaction() .replace (R.id.content_frame, टुकड़ा) \t \t \t \t .addToBackStack (शून्य) .commit(); mDrawerList.setItem चेक (स्थिति, सत्य); –

+0

क्या आप कृपया अपना एक्सएमएल पेस्ट कर सकते हैं? –

+6

'कंटेनर.removeAllViews(); ''CreateView' विधि' में उपयोग करें, कृपया –

उत्तर

19

हम इस संस्करण के साथ रहते हैं चला गया और havent इस बारे में कोई शिकायत प्राप्त है, इसलिए मुझे लगता है कि यह सही जवाब था:

अपने onCreateView विधि में जोड़ें:

if (container != null) { 
    container.removeAllViews(); 
} 

यह सुनिश्चित करना सुनिश्चित करें कि कंटेनर शून्य नहीं है या नहीं!

धन्यवाद https://stackoverflow.com/users/2677588/lia-pronina!

+1

अपने बैक बटन व्यवहार का परीक्षण करना सुनिश्चित करें क्योंकि यह बैकस्टैक पर पुराने टुकड़े का संदर्भ दे सकता है। यदि ऐसा होता है, तो 'getActivity() प्राप्त करें। GetFragmentManager()। PopBackStack() ' –

0

के

fragmentManager.beginTransaction().executePendingTransactions(); 

के बाद आप के लिए प्रतिबद्ध फोन के साथ की कोशिश करते हैं() विधि

0

हर लेआउट में जोड़े

android:background="#FFFFFF" 

डिफ़ॉल्ट में लेआउट पृष्ठभूमि पारदर्शी, तो बस, एक पृष्ठभूमि रंग और नए तत्व टुकड़ा डाल पुराने टुकड़ा से अधिक प्रदर्शित नहीं

9

के बारे में 1 सप्ताह के बाद कर रहे हैं, मुझे पृष्ठभूमि रंग या कुछ और जोड़ने के बिना समाधान मिला। बस इस कोड को जोड़ें और उस बकवास को ठीक करें। मुझे उम्मीद है कि यह आप सभी की मदद करेगा।

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    container.clearDisappearingChildren(); 
    return inflater.inflate(R.layout.fragment, container, false); 
} 
0

मैं इस एक ही समस्या में चलाने के लिए और मैं देख रहा हूँ पहले से ही स्वीकार किए जाते हैं जवाब होता है कि लेकिन इन जवाब 100% सही नहीं है और मेरी समस्या को ठीक नहीं किया। @Niels द्वारा प्रस्तावित उत्तर विचारों को हटा देता है लेकिन खंड (ओं) अभी भी जोड़े गए हैं।

/** 
* Call this to remove all the other added fragments and keep only the current one. 
* 
* @param activity the activity to which the fragment has been attached. 
* @param fragment the fragment we want to keep. 
*/ 
public static void removeOtherAddedFragments(@NonNull AppCompatActivity activity, @NonNull Fragment fragment) { 
    FragmentManager fragmentManager = activity.getSupportFragmentManager(); 
    for (Fragment frag : fragmentManager.getFragments()) { 
     if (frag != null && !frag.equals(fragment) && frag.isAdded()) { 
      fragmentManager.beginTransaction().remove(frag).commit(); 
     } 
    } 
} 

मैं अपने onResume में यह बोल रहा हूँ यकीन है कि यह भी जब मैं वापस टुकड़ा करने के लिए नेविगेट बुलाया जाएगा होने के लिए: यह मैं क्या उपयोग कर रहा हूँ है।

+0

क्या आप किसी अन्य के शीर्ष पर नया खंड दिखाते समय() को जोड़ने के बजाय fragmentTransaction.replace() को कॉल नहीं कर सकते हैं? –

+0

मैं करता हूं, लेकिन समस्या पीछे नेविगेशन में है। यदि आपके पास है: 1/ए 2/बी को प्रतिस्थापित करें (और बैकस्टैक पर न रखें) 3/सी को प्रतिस्थापित करें (और बैकस्टैक पर रखें) 4/वापस जाएं, आपको कोई समस्या हो सकती है। यह एंड्रॉइड से एक बग है: प्रतिस्थापित करें "हटाएं/छुपाएं और जोड़ें" नहीं "हटाएं और जोड़ें" और एक बार नया जोड़ा जाने के बाद, दूसरा इसके पीछे रहेगा ... –

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