6

पर दिखाई देता है इसलिए मैं अपने नेबैक ड्रॉवर और https://gist.github.com/Jogan/9def6110edf3247825c9 के लिए अपने एफएबी कार्यान्वयन के रूप में https://github.com/neokree/MaterialNavigationDrawer का उपयोग कर रहा हूं। जब मैं नेविगेशन ड्रॉवर खोलता हूं, तो यह एफएबी को कवर नहीं करता है, और बटन इसके शीर्ष पर दिखाई देता है। मैं बटन को छिपाने से बचाना चाहता हूं और इसे दराज पर खुले/बंद कर देना चाहता हूं क्योंकि यह विचलित है। कोई राय कि इसे कैसे ठीक किया जाए?फ्लोटिंग एक्शन बटन नेविगेशन ड्रॉवर

संपादित करें: मैं प्रोग्राम के रूप में निम्न कार्य फैब द्वारा जोड़ा जा रहा:

fabButton = new FloatingActionButton.Builder(this) 
      .withDrawable(getResources().getDrawable(R.drawable.ic_action_edit)) 
      .withButtonColor(0xFF2196F3) 
      .withGravity(Gravity.BOTTOM | Gravity.END) 
      .withMargins(0, 0, 16, 16) 
      .create(); 

टुकड़ा है कि घोषणा बदलने इसे ठीक नहीं है। उपरोक्त लिंक किए गए एनवी बार कार्यान्वयन के लिए एक सामग्री नेविगेशन ड्रेवर क्लास से विस्तार करने की गतिविधि की आवश्यकता होती है, जो हमेशा एनवी ड्रॉवर खींच सकता है, जिससे बटन हमेशा स्थायी रहता है। क्या तत्वों के क्रम को प्रोग्रामेटिक रूप से बल देने का कोई तरीका है?

उत्तर

7

नेविगेशन ड्रॉवर खुला होने पर आप एफएबी देखते हैं क्योंकि यह एफएबी कार्यान्वयन सामग्री दृश्य में एफएबी जोड़ता है (android.R.id.content)। नेविगेशन ड्रॉवर कार्यान्वयन के आधार पर वे दृश्य पदानुक्रम में एक ही स्तर पर प्रतीत होते हैं।

यदि आप विभिन्न एफएबी कार्यान्वयन पर स्विच नहीं करना चाहते हैं। onDrawerSlide(View drawerView, float offset) का उपयोग करें और जब आप दराज खोलते हैं तो एफएबी अल्फा बदलें। इसके अलावा आप onDrawerClose() या onDrawerOpen() विधियों के अंदर भी इसकी दृश्यता टॉगल कर सकते हैं।

संपादित करें:

@Override 
public void onDrawerSlide(View drawerView, float offset){ 
    fabButton.setAlpha(offset); 
} 
+0

मैं दृश्यता को बदलने की कोशिश की है और यह काम करता है, लेकिन एनीमेशन दराज से और बटन की दिशा में दूर ध्यान आकर्षित करता है। क्या आप अल्फा पर विस्तार से बता सकते हैं, मैं इससे बहुत परिचित नहीं हूं। –

+1

ठीक है, आपके पास दो और विकल्प हैं: अपने कार्यान्वयन लेआउट में FAB जोड़ने के लिए मूल क्रियान्वयन को संशोधित करें या जैसे ही नौसेना के दराज देख रहे हों, वैब को छुपाएं। अल्फा बदलने के बारे में अपने प्रश्न पर मेरा संपादन देखें। –

+0

कार्यान्वयन एनीमेशन के साथ मदद करता है। मैं आदर्श रूप से एनवी ड्रॉवर बटन को ओवरले करना चाहता हूं। मेरे पास जो मुद्दा है वह यह है कि एनवी ड्रावर कार्यान्वयन मुझे ऑन-क्रेट विधि नहीं होने के लिए मजबूर करता है, इसलिए मैं सामग्री दृश्य सेट नहीं कर सकता। इसके बजाए, यह दराज में पहले खंड में तय खंड को लॉन्च करता है, इसलिए उस बिंदु पर खंड का लेआउट उपलब्ध नहीं है। क्या सामग्री दृश्य में ऑर्डर बदलने का कोई तरीका है? –

2

मैं एक स्वच्छ समाधान है कि यह में अल्फा शामिल नहीं करता है या बटन टॉगल पाया है कि जब दराज के खोला या बंद (बनाता है जो इसे एक देरी की तरह लग रहे)। प्रोग्रामेटिक रूप से, आप बटन के अंत मार्जिन को संशोधित कर सकते हैं ताकि ड्रॉवर के ऑफसेट में परिवर्तन होने पर यह गतिविधि की विंडो से संक्रमण हो।

final FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) fab.getLayoutParams(); 

:

तो सब से पहले, onDrawerSlide विधि के बाहर, तो आपको निम्न कोड के साथ फैब के लेआउट मापदंडों प्राप्त करना होगा (लेआउट पर बटन के दशक में निर्भर करता है, मेरे मामले में, यह एक FrameLayout है) समझें कि मैं इसे एक साधारण गणितीय रैखिक समीकरण के आधार पर कर रहा हूं: y = mx + n, जबकि 'y' मार्जिन है, 'एम' ढलान है (आप इसे संशोधित कर सकते हैं), 'x' slideOffset है और ' एन 'डिफ़ॉल्ट/मूल मार्जिन (16 डीपी) है।

int density = (int) Resources.getSystem().getDisplayMetrics().density; 
final int defaultMargin = 16 * density; 
final int slope = -100 * density; 

फिर, onDrawerSlide अंदर, निम्न करें::

params.setMarginEnd((int) (slope * slideOffset + defaultMargin)); 
fab.setLayoutParams(params); 

यदि यह नहीं करता है 'इस तरह आप प्रदर्शन घनत्वों की बहुतायत का सम्मान करते हुए पिक्सल के रूप में चर के लिए डिफ़ॉल्ट मार्जिन और ढलान आवंटित आप के लिए काम नहीं, बटन के marginEnd स्थापित करने के लिए जब यह निर्माण इस तरह लेआउट के मानकों के हाशिये सेट (हालांकि आप की जाँच करने के लिए यदि marginEnd सही है या छोड़ दिया होता) प्रयास करें, या:

params.setMargins(int left, int top, int right, int bottom); 

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

1

यह एक वैकल्पिक समाधान है जो मेरे लिए काम करता है। मान लीजिए कि आप अपनेlayout.xml में FAB जोड़ना चाहते हैं। अब एक framelayout yourlayout.xml

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

में अब FloatingActionButton.java में बदलने के विधि

public FloatingActionButton create() { 
    ... 
    ViewGroup root = (ViewGroup) activity.findViewById(android.R.id.content); 
    root.addView(button, params); 
    return button; 
} 

public FloatingActionButton create(FrameLayout framelayout) { 
    ... 
    framelayout.addView(button, params); 
    return button; 
} 

साथ बनाने के अब इस तरह फैब घोषणा बदल जाते हैं।

FrameLayout yourframelayout = (FrameLayout)findViewById(R.id.myframelayout); 

fabButton = new FloatingActionButton.Builder(this) 
     .withDrawable(getResources().getDrawable(R.drawable.ic_action_edit)) 
     .withButtonColor(0xFF2196F3) 
     .withGravity(Gravity.BOTTOM | Gravity.END) 
     .withMargins(0, 0, 16, 16) 
     .create(yourframelayout); 

यह है !!

0

मैं निकोला Despotoski समाधान अद्यतन करने हूँ:

तो तुम अल्फा सेट करने के बाद निष्क्रिय करने के लिए/छिपाने फैब भी यदि ऐसा है तो किसी भी समय उपयोगकर्ता जगह है जहाँ फैब तो कुछ भी नहीं होगा दिखाया गया है पर टैप करता है।

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.drawer_open, 
       R.string.drawer_close) { 
    public void onDrawerClosed(View view) { 
       // Visible/Enable the FAB 
    } 

    public void onDrawerOpened(View drawerView) { 
       // Hide/Disable the FAB 
    } 

    @Override 
    public void onDrawerSlide(View drawerView, float slideOffset) { 
       // invert the slideOffset value 
       fab.setAlpha(1-slideOffset); 
    } 
}; 
संबंधित मुद्दे