7

का उपयोग NavigationView और FrameLayout के साथ Fragment एस स्विच करना चाहते हैं। यह बहुत अच्छा काम करता है। हालांकि, अगर मैं भी जल्दी से स्विच, तो Fragment रों overlaps ...ड्रैरलेआउट/नेविगेशन व्यू

यह है executePendingTransactions() की तरह काम नहीं करता।

<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/drawerLayout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

     <include layout="@layout/toolbar" /> 

     <FrameLayout 
      android:id="@+id/frameLayout" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

    </LinearLayout> 

    <android.support.design.widget.NavigationView 
     android:id="@+id/navigationView" 
     android:layout_width="@240dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:choiceMode="singleChoice" 
     android:divider="@color/transparent" 
     android:dividerHeight="0dp" 
     app:menu="@menu/navigationdrawer" /> 

</android.support.v4.widget.DrawerLayout> 

अगर मैं Fragment रों (भी) के लिए स्विच तेजी से (मैन्युअल रूप से या मेरे नेक्सस 5 पर एक 750ms देरी से कोड द्वारा), मैं दूसरे Fragment टच सक्षम होने लेकिन साथ, ओवरलैप करने के लिए दोनों Fragment रों मिल पहले Fragment शीर्ष पर किया जा रहा है ...

पहले Fragment शामिल एक ImageView और TextView रों। दूसरा Fragment में TabLayout और ViewPager (यदि मेरे मुद्दे के साथ दिन में कुछ भी हो सकता है) शामिल है। हां, मैं AppCompat 22.2.0 और डिज़ाइन 22.2.0 लाइब्रेरीज़ का उपयोग कर रहा हूं।

यदि मैं दोनों के लिए पृष्ठभूमि रंग सेट करता हूं, तो मैं केवल पहले Fragment देख सकता हूं, और यह कभी भी नहीं बदलता है।

मैंने कोशिश की popBackStackImmediate(), executePendingTransactions(), remove(fragment), android:fitsSystemWindows="true", Android: fragments overlapping issue, देरी, और अन्य बातों के, सफलता नहीं मिली।

@Override 
protected void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // ... 

    mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { 
     @Override 
     public boolean onNavigationItemSelected(final MenuItem menuItem) { 
      navigationDrawer(menuItem.getItemId()); 
      return true; 
     } 
    }); 

    if (savedInstanceState == null) { 
     final MenuItem menuItem = mNavigationView.getMenu().getItem(0); 
     if (menuItem != null) { 
      navigationDrawer(menuItem.getItemId()); 
     } 
    } 
} 

private void navigationDrawer(final int itemId) { 
    final Fragment fragment = getFragment(itemId); 
    getSupportFragmentManager().beginTrasaction() 
     .replace(R.id.frameLayout, fragment) 
     .addToBackStack(null) 
     .commit(); 
    mNavigationView.getMenu().findItem(itemId).setChecked(true); 
    mDrawerLayout.closeDrawer(mNavigationView); 
    supportInvalidateOptionsMenu(); 
} 

@Override 
public boolean onOptionsItemSelected(final MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.menu_first: 
     case R.id.menu_second: 
     case R.id.menu_third: 
      navigationDrawer(item.getItemId()); 
      return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

संपादित

मेरी onCreate() में मैं यह कर रहा था:

if (savedInstanceState == null) { 
    final MenuItem menuItem = mNavigationView.getMenu().getItem(0); 
    if (menuItem != null) { 
     navigationDrawer(menuItem.getItemId()); 
    } 
} 

कौन सा भी तेजी से एक कॉल करने के लिए पता चला है। इस कोड को हटाने से मेरी समस्या हल हो गई (अस्थायी रूप से, नीचे देखें)।

मैं अभी भी क्यों executePendingTransactions() ऐसे अजीब समस्या से बचने के नहीं था नहीं पता ...

संपादित 2

मैं एक boolean (init गलत पर) रखने जब एक का ट्रैक रखने के बारे में सोचा Fragment लेनदेन होता है। मैंने इसे true पर navigationDrawer() और में Fragment.onResume() में सेट किया है। फिर भी कोई जाने ...

तो: अभी भी मेरे MainFragment कि Picasso का उपयोग कर और भी तेजी से (800ms) एक और Fragment का उपयोग करने जा एक छवि को लोड करता है पर समस्या हो रही: वे अभी भी ओवरलैप ...

+0

मैं देख सकता हूँ अपने कुछ और कोड ..so कि मैं तुम्हें .. – Moinkhan

+0

@Moinkhan क्या हिस्सा मदद कर सकते हैं इसका मुझे विश्वास है कि मैंने सापेक्ष हिस्सा पोस्ट किया है। यह एक बुनियादी DrawerLayout/NavigationView कार्यान्वयन है। – shkschneider

+0

आपके द्वारा प्रदान किया गया कोड सही था। यही कारण है कि मैंने सोचा कि समस्या कोड में हो सकती है, जो यहां उपलब्ध नहीं है .... – Moinkhan

उत्तर

0

मेरी onCreate() में मैं यह कर रहा था:

if (savedInstanceState == null) { 
     final MenuItem menuItem = mNavigationView.getMenu().getItem(0); 
     if (menuItem != null) { 
      navigationDrawer(menuItem.getItemId()); 
     } 
    } 

जो बहुत तेजी से कॉल करने के लिए बाहर निकलता है। इस कोड को हटाकर मेरी समस्या हल हो गई।

मैं अभी भी पता नहीं है:

क्यों executePendingTransactions() ऐसे अजीब समस्या से बचने के नहीं था ...

संपादित

फिर भी होने समस्या मेरी MainFragment कि लोड पर Picasso का उपयोग करके एक छवि और बहुत तेज़ी से (800ms) स्विचिंग: वे अभी भी ओवरलैप ...

संपादित 2

तो मैं अब अगर मेरी Activity दूसरा स्विच के बीच +1 का न्यूनतम टाइमर के साथ, एक Fragment या नहीं संक्रमण कर रहा है चिह्नित करने के लिए एक बूलियन का उपयोग करें।

मेरी Fragment रों onViewCreated() में:

if (view != null) { 
    view.post(new Runnable() { 
     @Override 
     public void run() { 
      // Activity might be null 
      getActivity().setTransitioning(false); 
     } 
    }); 
} 

और मेरी navigationDrawer():

if (isTransitioning()) { 
    // Switching Fragments too fast 
    return false; 
} 
+0

वैकल्पिक तरीका यह जांचना होगा कि 'गतिविधि' पारित किया गया है, 'मेरा' नेविगेशन ड्रावर() 'विधि के शीर्ष पर' रेज़्यूम() 'पर। अब दोषपूर्ण कोड के साथ भी काम करता है। – shkschneider

+0

और यह काम नहीं किया: मैंने एक 'बूलियन' सेट किया था जब लेनदेन किया गया था, और मेरे 'फ्रैगमेंट के सेट को' रेज़्यूम() 'में झूठ बोलने के लिए बनाया गया था। अभी भी काम नहीं कर रहा है... – shkschneider

1

आप इस कोशिश कर सकते हैं। .. यह अपने लगातार क्लिक विलंब होगा ...

private final Handler mDrawerActionHandler = new Handler(); 
private static final long DRAWER_CLOSE_DELAY_MS = 250; 

mDrawerActionHandler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
     // your navigation code goes here 
     } 
}, DRAWER_CLOSE_DELAY_MS); 
+0

उस पर विचार किया और इसे पहले से ही किया: काम नहीं किया (साथ ही यह मेरी समस्या को समझाता नहीं है)। इनपुट के लिए धन्यवाद – shkschneider

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