Android - नीचे शीट की STATE_HALF_EXPANDED स्थिति को अक्षम कैसे करें


14

मेरे पास एक नीचे की शीट है जिसे 2 राज्यों के बीच जाना चाहिए, STATE_COLLAPSEDऔर STATE_EXPANDED जब यह ढह जाता है तो ऊंचाई होनी चाहिए 200dpऔर जब यह पूरी स्क्रीन होगी।

तो मैं के BottomSheetBehaviorसाथ सेट कर रहा हूँ

isFitToContents = false
peekHeight = 200dp

और मैं में एक मान निर्धारित करने के लिए मजबूर कर रहा हूँ halfExpandedRatioअन्यथा जब से STATE_HALF_EXPANDEDनीचे चादर स्क्रीन के आधे ले जाएगा।

मैं w / काम कर रहा हूँ com.google.android.material:material:1.1.0-rc01

क्या STATE_HALF_EXPANDEDराज्य को निष्क्रिय करने का कोई तरीका है ?

या मैं वास्तव में स्थापित करना चाहिए skipCollapsed=true, अनुपात क्या 200dp साधन और के साथ काम करने के मामले में यह पता लगाने STATE_HALF_EXPANDEDऔर STATE_EXPANDEDके बजाय STATE_COLLAPSEDऔरSTATE_EXPANDED


कृपया अधिक विवरण प्रदान करें, जैसे कि नीचे की शीट कैसी दिखती है।
UD ..

@ UD.. मुझे नहीं लगता कि इस मामले में नीचे की शीट सामग्री प्रासंगिक है। यह एक अधिक सामान्य प्रश्न है, क्या नीचे की शीट राज्यों में से एक को अक्षम करना संभव है
नोआ ड्रेच

1
अपने प्रयोग के मामले के लिए, यह है कि सेटिंग लगता है halfExpandedRatio=0.25fऔर peekHeight = 200dpऔर फिर इलाज STATE_COLLAPSEDऔर STATE_HALF_EXPANDEDके रूप में यदि वे एक ही राज्य हल मुद्दा है। प्रश्न को खुला रखने के मामले में अन्य विचार हैं।
नोआ ड्रेच

आप इस लिंक का अनुसरण कर सकते हैं, यह androidhive.info/2017/12/android-working-with-bottom-sheet
UD .. में

यदि आपके प्रश्न में निर्धारित उद्देश्यों को पूरा करता है, तो इनमें से किसी एक उत्तर को स्वीकार करना सुनिश्चित करें!
कॉमन्सवेयर

जवाबों:


3

आधे विस्तारित अनुपात का मान 0 और 1 अनन्य के बीच कुछ मान पर सेट होना चाहिए , इसलिए इस मान को कुछ बहुत कम संख्या पर सेट करें जो आपके झांकने की ऊंचाई से कम होना निश्चित है, "0.0001f"। इस मान के साथ आपको STATE_HALF_EXPANDEDराज्य भी नहीं देखना चाहिए । राज्यों के बीच उतार चढ़ाव हो जाएगा STATE_EXPANDEDऔर STATE_COLLAPSED


वैकल्पिक समाधान

उपरोक्त समाधान काम करता है और प्रभावी रूप से STATE_HALF_EXPANDEDराज्य को निष्क्रिय करता है, लेकिन यह हैकिश (आईएमओ) है और भविष्य में टूट सकता है। उदाहरण के लिए, क्या होगा यदि आधे विस्तारित अनुपात के लिए एक उचित मूल्य जो कि कहीं ऊंचाई के बीच है और पूरी ऊंचाई लागू है? इससे परेशानी होगी।

ओपी द्वारा बताई गई आवश्यकताएं हैं कि नीचे की शीट को ऊंचाई और पूर्ण ऊंचाई के बीच संक्रमण करना चाहिए। झांकने की ऊंचाई के साथ कोई समस्या नहीं है, लेकिन ओपी isFitToContents = falseपूर्ण ऊंचाई तक पहुंचने के लिए निर्दिष्ट करता है। (मुझे लगता है कि उसकी निचली शीट कम जगह उपलब्ध हो सकती है।)

दुर्भाग्य से, जब isFitToContents == falseएक अतिरिक्त "आधा-ऊंचाई" व्यवहार पेश किया जाता है कि ओपी बचना चाहता है और इसलिए प्रश्न।

"आधा-ऊंचाई" व्यवहार के अलावा एक और व्यवहार पेश किया गया है जो "विस्तारित ऑफसेट" है। विस्तारित ऑफसेट निर्दिष्ट करता है कि पूर्ण-स्क्रीन से नीचे की शीट कितनी दूर बंद हो जाएगी। 100fउदाहरण के लिए, एक मान 100pxपूरी तरह से विस्तारित होने पर नीचे की शीट के शीर्ष पर एक सीमा छोड़ देगा । विस्तारित ऑफसेट के लिए डिफ़ॉल्ट शून्य है।

मैं किसी भी व्यवहार से अवगत नहीं हूं isFitToContents == falseजो ऊपर उल्लिखित के अलावा अन्य का परिचय देता है।

इसलिए, इन आवश्यकताओं को देखते हुए, क्या हम एक निचली शीट को फैशन कर सकते हैं जो कि पीक की ऊँचाई और पूरी ऊँचाई के बीच चलती है और isFitToContents == trueइस प्रकार "आधी ऊंचाई" की समस्या से बचती है? एक गैर-शून्य विस्तारित ऑफसेट के लिए कोई आवश्यकता नहीं है, इसलिए हमें इसके बारे में चिंता करने की आवश्यकता नहीं है।

यहां एक छोटा डेमो ऐप प्रदर्शित किया गया है कि हम इन आवश्यकताओं को सही तल शीट संरचना के साथ पूरा कर सकते हैं:

यहां छवि विवरण दर्ज करें

MainActivity5.kt

class MainActivity5 : BaseActivity() {  
    override fun onCreate(savedInstanceState: Bundle?) {  
        super.onCreate(savedInstanceState)  
        setContentView(R.layout.activity_main5)  

        val bottomSheet = findViewById<LinearLayout>(R.id.bottom_sheet)  
        val sheetBehavior: BottomSheetBehavior<LinearLayout> = BottomSheetBehavior.from(bottomSheet)  
        sheetBehavior.isFitToContents = true // the default  
  sheetBehavior.peekHeight = 200  

  // Log the states the bottom sheet passes through.  
  sheetBehavior.addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() {  
            override fun onStateChanged(bottomSheet: View, newState: Int) {  
                Log.d("MainActivity", "<<<< $newState = ${translateSheetState(newState)}")  
            }  

            override fun onSlide(bottomSheet: View, slideOffset: Float) {}  
        })  
    }  
}

BaseActivity.kt

open class BaseActivity : AppCompatActivity() {  

    protected fun translateSheetState(state: Int): String {  
        return when (state) {  
            BottomSheetBehavior.STATE_COLLAPSED -> "STATE_COLLAPSED"  
  BottomSheetBehavior.STATE_DRAGGING -> "STATE_DRAGGING"  
  BottomSheetBehavior.STATE_EXPANDED -> "STATE_EXPANDED"  
  BottomSheetBehavior.STATE_HALF_EXPANDED -> "STATE_HALF_EXPANDED"  
  BottomSheetBehavior.STATE_HIDDEN -> "STATE_HIDDEN"  
  BottomSheetBehavior.STATE_SETTLING -> "STATE_SETTLING"  
  else -> "Unknown state: $state"  
  }  
    }  
}

activity_main5.xml

<androidx.coordinatorlayout.widget.CoordinatorLayout 
    android:id="@+id/main_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:id="@+id/bottom_sheet"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/holo_orange_light"
        android:orientation="vertical"
        android:scrollbars="none"
        app:layout_behavior="@string/bottom_sheet_behavior">

        <TextView
            android:id="@+id/tv"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="16dp"
            android:text="@string/short_text"
            android:textSize="16sp" />

    </LinearLayout>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

अगर हमारे पास एक लंबी तली की चादर है तो निम्न संरचना उसे स्क्रॉल करने का काम करती है:

activity_main6.xml

<androidx.coordinatorlayout.widget.CoordinatorLayout 
    android:id="@+id/main_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:id="@+id/bottom_sheet"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/holo_orange_light"
        android:orientation="vertical"
        android:scrollbars="none"
        app:layout_behavior="@string/bottom_sheet_behavior">

        <androidx.core.widget.NestedScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TextView
                android:id="@+id/tv"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="16dp"
                android:text="@string/long_text"
                android:textSize="16sp" />
        </androidx.core.widget.NestedScrollView>
    </LinearLayout>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

आपकी प्रारंभिक प्रतिक्रिया के बारे में - मैंने देखा कि भले ही मैंने आधा विस्तारित अनुपात सेट किया हो, लेकिन नीचे की शीट का एक बहुत पतला संकेत अभी भी दिखाई दे रहा है। और वैसे भी, यह वह व्यवहार नहीं है जिसकी मुझे तलाश है। जैसा कि आपने "वैकल्पिक समाधान" में उल्लेख किया है - "निचली शीट को ऊंचाई और पूर्ण ऊंचाई के बीच संक्रमण करना चाहिए"
नोआ ड्रेच

आपका "वैकल्पिक समाधान" काम कर रहा है और यह मेरे लिए आवश्यक समाधान है, मेरे प्रारंभिक परीक्षण से पता चला है कि मुझे उपयोग करने की आवश्यकता है isFitToContents = false, लेकिन अब परीक्षण w / isFitToContents = trueकाम करता है ठीक है
नोआ ड्रेच

@NoaDrach यदि नीचे की शीट छिपाई जाती है तो नीचे की शीट ऑफसेट की गणना कैसे की जाती है, इस पर कम से कम 1px दिखाया जाएगा। मैं यह नहीं सोच रहा था कि शीट छिपाई जाएगी लेकिन, 1px दिखाने के साथ, शीट को केवल sheetBehavior.state = BottomSheetBehavior.STATE_HIDDENआधा विस्तारित स्थिति तक पहुंचने पर छिपाने के लिए मजबूर किया जा सकता है, लेकिन यह थोड़ा जटिल है। वैकल्पिक समाधान बेहतर है।
चेटकैंप

2

यहां छवि विवरण दर्ज करें

यदि आप छवि की तरह ऊपर कोशिश करना चाहते हैं, तो आप नीचे दिए गए कोड का पालन कर सकते हैं, यह आपकी मदद कर सकता है !!!

public class CollectionsBottomSheet extends BottomSheetDialogFragment {
    private BottomSheetBehavior mBehavior;


    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        BottomSheetDialog dialog = (BottomSheetDialog) super.onCreateDialog(savedInstanceState);
        View view = View.inflate(getContext(), R.layout.collections_layout, null);
        LinearLayout linearLayout = view.findViewById(R.id.root);
        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) linearLayout.getLayoutParams();
        params.height = getScreenHeight();
        linearLayout.setLayoutParams(params);
        dialog.setContentView(view);
        mBehavior = BottomSheetBehavior.from((View) view.getParent());
        return dialog;

    }

    @Override
    public void onStart() {
        super.onStart();
        mBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
    }

    public static int getScreenHeight() {
        return Resources.getSystem().getDisplayMetrics().heightPixels;
    }
}



xml 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/bottom_sheet"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    android:fitsSystemWindows="true">


    <LinearLayout
        android:id="@+id/root"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:orientation="horizontal">

            <TextView
                android:id="@+id/filter_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:drawableStart="@drawable/ic_cancel"
                android:drawableLeft="@drawable/ic_cancel"
                android:drawablePadding="30dp"
                android:gravity="center_vertical"
                android:padding="12dp"
                android:text="Filters"
                android:textColor="@color/black"
                android:textSize="18sp" />

            <View
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:layout_weight="1" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginEnd="10dp"
                android:layout_marginRight="10dp"
                android:padding="5dp"
                android:text="Reset ALL"
                android:textColor="#6f6f6f"
                android:textSize="12sp" />

        </LinearLayout>

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="#d8dbdb" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/sort_background"
            android:drawableStart="@drawable/ic_star"
            android:drawableLeft="@drawable/ic_star"
            android:drawablePadding="15dp"
            android:padding="15dp"
            android:text="GUEST RATINGS"
            android:textColor="#6f6f6f"
            android:textSize="16sp" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/sort_background"
            android:drawableStart="@drawable/ic_money"
            android:drawableLeft="@drawable/ic_money"
            android:drawablePadding="15dp"
            android:padding="15dp"
            android:text="PRICE RANGE"
            android:textColor="#6f6f6f"
            android:textSize="16sp" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/sort_background"
            android:drawableStart="@drawable/ic_loan"
            android:drawableLeft="@drawable/ic_star"
            android:drawablePadding="15dp"
            android:padding="15dp"
            android:text="PAY AT HOTEL"
            android:textColor="#6f6f6f"
            android:textSize="16sp" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/sort_background"
            android:drawableStart="@drawable/ic_folder"
            android:drawableLeft="@drawable/ic_folder"
            android:drawablePadding="15dp"
            android:padding="15dp"
            android:text="COLLECTIONS"
            android:textColor="#6f6f6f"
            android:textSize="16sp" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/sort_background"
            android:drawableStart="@drawable/ic_perm_identity_black_24dp"
            android:drawableLeft="@drawable/ic_perm_identity_black_24dp"
            android:drawablePadding="15dp"
            android:padding="15dp"
            android:text="FACILITIES"
            android:textColor="#6f6f6f"
            android:textSize="16sp" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/sort_background"
            android:drawableStart="@drawable/ic_apartment"
            android:drawableLeft="@drawable/ic_apartment"
            android:drawablePadding="15dp"
            android:padding="15dp"
            android:text="CATEGORIES"
            android:textColor="#6f6f6f"
            android:textSize="16sp" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/sort_background"
            android:drawableStart="@drawable/ic_hotel_building"
            android:drawableLeft="@drawable/ic_hotel_building"
            android:drawablePadding="15dp"
            android:padding="15dp"
            android:text="ACCOMMODATION TYPE"
            android:textColor="#6f6f6f"
            android:textSize="16sp" />

    </LinearLayout>


</LinearLayout>

बहुत अच्छा जवाब ... मेरा दिन बचाया
unownsp

1

addBottomSheetCallbackअपने पर सेट करने का प्रयास करें BottomSheetBehavior, और जब आप किसी STATE_HALF_EXPANDEDस्थिति का पता लगाते हैं , setState(STATE_HIDDEN)तो जब भी नीचे की शीट आधे रास्ते तक पहुंचने का प्रयास करती है , तो उसे कॉल करें ।


अच्छा विचार है, मेरे मामले में मैं राज्य को सेट करूँगा STATE_COLLAPSEDऔर नहीं STATE_HIDDEN। लेकिन मैंने इसे लागू करने की कोशिश की और संक्रमण से STATE_HALF_EXPANDEDलेकर STATE_COLLAPSEDभद्दा महसूस किया। राज्यों के बीच संक्रमण एनिमेटेड है, इसलिए आप नीचे की शीट को रोकते हुए देखते हैं STATE_HALF_EXPANDEDऔर फिर इसे आगे STATE_COLLAPSED
बढ़ाते हैं

क्या आप इसे 0 के आधे भाग के अनुपात के साथ जोड़ सकते हैं?
Ridcully

@Ridcully - 2 समस्याएँ यहाँ हैं - 1. अर्धप्रतिबंधित अनुपात 0 से ऊपर होना चाहिए। इसे बहुत कम मान पर सेट करने से यह मेरे लिए लगभग पूरी तरह से (आधी विस्तारित स्थिति) न्यूनतम हो जाएगी, इससे पहले कि ढह गई स्थिति में तड़क जाए। मैं इस सुझाव w / मेरे काम के समाधान के संयोजन के बारे में सोचाhalfExpandedState=0.25f , b / c तो राज्यों के बीच संक्रमण यह स्पष्ट नहीं होगा। लेकिन, मुझे यकीन नहीं है कि मेरे पास पहले की तुलना में एक बड़ा बदलाव होगा
नोआ ड्रेच

1

मेरे पास एक समान उपयोग का मामला था जहां लेआउट को ऊंचाई का एक तिहाई होना था। मैंने निम्नलिखित की कोशिश की और इसने बहुत अच्छा काम किया।

<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/bottom_sheet_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/grey"
    android:clickable="true">

    <LinearLayout
        android:id="@+id/bottom_sheet"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/rounded_bottom_sheet_background"
        android:orientation="vertical"
        app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recycler"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

मुझे इनको गतिशील रूप से बदलना था इसलिए मैंने नीचे शीट पर सेट किया लेकिन आप इसे xml में भी कर सकते हैं:

bottomSheet.setPeekHeight(200);// 200px
bottomSheet.setHideable(false);

खारिज करने के लिए, मैंने निम्नलिखित फ़ंक्शन का उपयोग करके अपने टुकड़े में एनीमेशन जोड़ा:

fragmentTransaction.setCustomAnimations(
                    R.anim.fade_in,
                    R.anim.fade_out,
                    R.anim.fade_in,
                    R.anim.fade_out)

उम्मीद है की यह मदद करेगा


1

सेटिंग का प्रयास करें BottomSheetBehavior.setHalfExpandedRatio(0f)। बहुत अधिक नहीं है जो प्रभावित करेगा STATE_HALF_EXPANDED, जब तक कि राज्य को स्पष्ट रूप से .setState () के साथ सेट नहीं किया जाता है । एक कस्टम बनाने के लिए भी संभव होना चाहिए Behavior, जो फैली हुई है CoordinatorLayout.Behavior<View>और नहीं है STATE_HALF_EXPANDED। जैसे। कोऑर्डिनेटर लयआउट बिहेवियर के साथ सब कुछ इंटरसेप्ट करना


0

मैंने विभिन्न तरीकों की कोशिश की, लेकिन किसी भी तकनीक ने सही काम नहीं किया। मैंने घटनाओं को रोकने की कोशिश कीBottomSheetBehavior.BottomSheetCallback {}dismiss() कस्टम लॉजिक के आधार पर और इसे झकझोर दिया।

तो, अंत में, मेरे में BottomSheetDialogFragmentमैंने जोड़ाbottomSheetBehavior.isDraggable = false और इससे टच एंड द्वारा नीचे की चादर को खींच दिया गया, मैंने अपने दम पर संवाद को खारिज कर दिया। खाली क्षेत्र संवाद पर वैसे भी खारिज हो जाते हैं।

ध्यान दें कि, नीचे की शीट अभी भी एनीमेशन के साथ फैली हुई है। वह 'वास्तव में महान!

मस्ती को ओवरराइड करेंडायरेगॉग (सेवइनस्टांसस्टेट: बंडल?): डायलॉग {वैल डायलॉग = super.onCreateDialog (saveInstanceState)

    dialog.setOnShowListener {
        val bottomSheetDialog = it as BottomSheetDialog
        val bottomSheet =
            bottomSheetDialog.findViewById<View>(com.google.android.material.R.id.design_bottom_sheet)
                ?: return@setOnShowListener

        //Making background to transparent to avoid white background to given space margin.
        bottomSheet.setBackgroundColor(ContextCompat.getColor(context!!, R.color.transparent))

        val inflatedView = fragmentProfileDialogBinding.root
        val parent = inflatedView.parent as View

        val bottomSheetBehavior = BottomSheetBehavior.from(parent)
        bottomSheetBehavior.state = BottomSheetBehavior.STATE_EXPANDED
        bottomSheetBehavior.isDraggable = false
    }

    return dialog
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.