2016-02-25 9 views
22

मैं कोशिश करना चाहता हूं BottomSheetDialog एंड्रॉइड सपोर्ट लाइब्रेरी 23.2 में पेश किया गया लेकिन यह सही तरीके से काम नहीं कर रहा है।BottomSheetDialog का उपयोग कैसे करें?

BottomSheetBehavior लगातार नीचे चादर मामले कब्जा है, इस रिलीज भी भरने के लिए मॉडल नीचे शीट मामले का प्रयोग कर एक BottomSheetDialog और BottomSheetDialogFragment प्रदान करता है: यहाँ क्या दस्तावेज़ कहते है। बस शीट के रूप में अपना संवाद स्टाइल करने के लिए अपने नीचे शीट समकक्षों के साथ AppCompatDialog या AppCompatDialogFragment को प्रतिस्थापित करें। "

तो मैं बदल मेरी AppCompatDialogBottomSheetDialog रहे हैं:

package my.package.ui.dialog; 

import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.support.design.widget.BottomSheetDialog; 

import my.package.R; 

public class AccountActionsDialog extends BottomSheetDialog { 
    public AccountActionsDialog(Context context) { 
     super(context); 

     if (context instanceof Activity) { 
      setOwnerActivity((Activity) context); 
     } 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(getLayoutInflater().inflate(R.layout.dialog_account_actions, null)); 
    } 
} 

यहाँ मेरी लेआउट फ़ाइल है:

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="#ff0000" 
     android:padding="16dp" 
     android:text="Delete account" 
     android:textColor="#ffffff" /> 

</LinearLayout> 

तब मैं अपने गतिविधि में निम्न कोड का उपयोग करें:

new AccountActionsDialog(this).show(); 

मेरी स्क्रीन मंद हो गई है लेकिन मेरे संवाद की सामग्री दिखाई नहीं दे रही है। क्या हो सकता है पर कोई विचार? यह ठीक काम करता है जब मैं AppCompatDialog का उपयोग करता हूं।

+0

वहाँ एक विशेष कारण है कि आप 'setContentView (R.layout.dialog_account_actions)' उपयोग नहीं कर रहे है? – ianhanniballake

+0

हां। शुरुआत में मैंने पहले रूट दृश्य को फुलाया और खोजने के लिए सभी दृश्यों को खोजने के लिए findViewById() का उपयोग किया और उनके लिए उचित श्रोताओं को सेट किया। मैंने इस उदाहरण के लिए कोड को सरल बना दिया और इस भाग को बदलने के लिए भूल गए। मुद्दा कोई फर्क नहीं पड़ता कि लेआउट कैसे सेट किया गया है। –

+0

यह समर्थन लाइब्रेरी में निश्चित रूप से एक बग है - कृपया एक छोटे नमूना प्रोजेक्ट के साथ b.android.com पर एक फ़ाइल करें और यहां एक लिंक शामिल करें ताकि मैं इसे टीम में ला सकूं - यहां तक ​​कि एक पागल व्यवहार के लिए - अपना ' ~ 250dp की ऊंचाई तक LinearLayout'। – ianhanniballake

उत्तर

2

यह BottomSheetDialog की लेआउट फ़ाइल है।

<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:soundEffectsEnabled="false"> 

<FrameLayout 
     android:id="@+id/design_bottom_sheet" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     app:layout_behavior="@string/bottom_sheet_behavior" 
     style="?attr/bottomSheetStyle"/> 

</android.support.design.widget.CoordinatorLayout> 

अपनी सामग्री को देखने दृश्य design_bottom_sheet अंदर है, यह CoordinatorLayout द्वारा खड़ी केंद्र तैनात किया जाएगा, और BottomSheetBehavior यह भरपाई करेगा।

mParentHeight = parent.getHeight(); 
mMinOffset = Math.max(0, mParentHeight - child.getHeight()); 
mMaxOffset = mParentHeight - mPeekHeight; 
if (mState == STATE_EXPANDED) { 
    ViewCompat.offsetTopAndBottom(child, mMinOffset); 
} else if (mHideable && mState == STATE_HIDDEN) { 
    ViewCompat.offsetTopAndBottom(child, mParentHeight); 
} else if (mState == STATE_COLLAPSED) { 
    ViewCompat.offsetTopAndBottom(child, mMaxOffset); 
} 

यह mMaxOffset पर design_bottom_sheet स्थान पर ले intented, लेकिन वास्तव में बच्चे को देखने की प्रारंभिक getTop ताकि आप देख अगर अधिक से अधिक वांछित ऑफसेट ऑफसेट 0 नहीं है, लेकिन (mParentHeight - childHeight)/2 है।

design_bottom_sheet देखें और Gravity.TOP | Gravity.CENTER_HORIZONTAL पर इसकी गुरुत्वाकर्षण सेट करें इसे ठीक कर देगा। लेकिन, अगर बच्चा हाइट mpeekHeight से कम है, तो सामग्री दृश्य के नीचे खाली क्षेत्र होगा।

हालांकि, peekHeight > childHeight, mMaxOffsetmMinOffset से कम होगा, जो अजीब व्यवहार का कारण बन जाएगा।

हो सकता है कि कोड

mMaxOffset = Math.max((mParentHeight - mPeekHeight), mMinOffset); 

को बदला जाना चाहिए

mMaxOffset = mParentHeight - child.getHeight(); 
+0

यह वह मुद्दा है जिसे मैं भी देख रहा हूं। Framelayout जो आपके सामग्री दृश्य लपेटता है किसी कारण से लंबवत केंद्रित है। जब BottomSheetBehavior तब Framelayout को बताता है, यह वाई मान> 0 से शुरू होता है। उस व्यवहार के अंदर सभी गणित माता-पिता के शीर्ष से दृश्य को ऑफ़सेट करके काम करने के लिए हैं, जिसके परिणामस्वरूप सामग्री अपेक्षा से बहुत कम है (ऑफ स्क्रीन) –

+0

@ एडवर्ड किममेल फ्रेमलाउट यह जांच करेगा कि क्या आप गुरुत्वाकर्षण शीर्ष, नीचे या center_vertical सेट करते हैं, यदि इनमें से कोई भी सेट नहीं है, तो फ्रेमलेआउट शीर्ष पर लेआउट बच्चे होगा। हालांकि, 'CoordinatorLayout.layoutChild' अपने बच्चों को लेआउट करने के लिए 'Gravity.apply' का उपयोग करता है,' गुरुत्वाकर्षण.प्ली 'में, यदि इनमें से कोई भी गुरुत्वाकर्षण सेट नहीं है, तो यह माता-पिता के केंद्र में लेआउट बाल दृश्य होगा। व्यवहार प्राप्त करने के लिए [Gravity.apply] देखें (http://androidxref.com/6.0.1_r10/xref/frameworks/base/core/java/android/view/Gravity.java#231) –

2

के insted मैं एक ही मुद्दा है, मंद हो पृष्ठभूमि और सामग्री दिखाई नहीं expriencing किया गया था। यहां बताया गया है कि मैंने सामग्री दृश्य को setupDialog() छिपी विधि में सेट करके इसे कैसे प्रबंधित किया।

public class CustomBottomSheetDialogFragment extends BottomSheetDialogFragment { 

    private TextView mOffsetText; 
    private TextView mStateText; 
    private BottomSheetBehavior.BottomSheetCallback mBottomSheetBehaviorCallback = new BottomSheetBehavior.BottomSheetCallback() { 

     @Override 
     public void onStateChanged(@NonNull View bottomSheet, int newState) { 
      setStateText(newState); 
      if (newState == BottomSheetBehavior.STATE_HIDDEN) { 
       dismiss(); 
      } 

     } 

     @Override 
     public void onSlide(@NonNull View bottomSheet, float slideOffset) { 
      setOffsetText(slideOffset); 
     } 
    }; 
    private LinearLayoutManager mLinearLayoutManager; 
    private ApplicationAdapter mAdapter; 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     return super.onCreateDialog(savedInstanceState); 
    } 

    @Override 
    public void onViewCreated(View contentView, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(contentView, savedInstanceState); 
    } 

    @Override 
    public void setupDialog(Dialog dialog, int style) { 
     super.setupDialog(dialog, style); 
     View contentView = View.inflate(getContext(), R.layout.bottom_sheet_dialog_content_view, null); 
     dialog.setContentView(contentView); 
     mBottomSheetBehavior = BottomSheetBehavior.from(((View) contentView.getParent())); 
     if (mBottomSheetBehavior != null) { 
      mBottomSheetBehavior.setBottomSheetCallback(mBottomSheetBehaviorCallback); 
     } 
     mOffsetText = (TextView) contentView.findViewById(R.id.offsetText); 
     mStateText = (TextView) contentView.findViewById(R.id.stateText); 
    } 

} 

और लेआउट:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 


    <TextView 
     android:id="@+id/offsetText" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textColor="@android:color/black" /> 

    <TextView 
     android:id="@+id/stateText" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textColor="@android:color/black" /> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 
</LinearLayout> 
+0

आप BottomSheetBehavior.from का भी उपयोग कर सकते हैं (देखें v) हालांकि यह अपवाद –

2

यहाँ code.google.com पर मुद्दा है https://code.google.com/p/android/issues/detail?id=201793

एक मुद्दा कुछ उपयोगकर्ताओं को देख रहे हैं FrameLayout हमारे सामग्री देखने लपेटता है कि केन्द्रित किया जा रहा करने पर निर्भर करता खड़ी। BottomSheetBehavior केवल तभी काम करता है जब यह दृश्य शीर्ष गठबंधन हो। मैं पता लगा नहीं किया है क्या FrameLayout का कारण बनता है खड़ी अभी तक केंद्रित हो जाते हैं, लेकिन यहाँ एक संभावित समाधान है:,

View contentView = ... 
// You may have to measure your content view first. 
dialog.setContentView(contentView); 

// Change this to a percentage or a constant, whatever you want to do. 
// The default is 1024 - any views smaller than this will be pulled off 
// the bottom of the screen. 
float peekHeight = contentView.getMeasuredHeight(); 

View parent = (View)contentView.getParent(); 
BottomSheetBehavior behavior = BottomSheetBehavior.from(parent); 
behavior.setPeekHeight(peekHeight); 
CoordinatorLayout.LayoutParams layoutParams = 
    (CoordinatorLayout.LayoutParams)parent.getLayoutParams(); 
layoutParams.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL; 
+0

फेंकता है यह कुछ भी ठीक नहीं करता है। – 0101100101

0

यह शुरू काम करने के लिए जब मैं अपने TextView (200dp) के लिए निर्धारित ऊंचाई सेट कुछ ऊंचाई के मान के लिए हालांकि यह अभी भी गलत तरीके से व्यवहार करता है। जाहिर है यह समर्थन lib का मुद्दा है। वहां पहले से ही कुछ बग ट्रैकर में BottomSheetDialog से संबंधित रिपोर्ट हैं:

https://code.google.com/p/android/issues/detail?id=201793&sort=-opened&colspec=ID%20Status%20Priority%20Owner%20Summary%20Stars%20Reporter%20Opened

https://code.google.com/p/android/issues/detail?id=201826

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