Google नक्शे की निचली शीट 3 चरणों के व्यवहार की नकल कैसे करें?


110

पृष्ठभूमि

मुझे एक यूआई बनाने का काम सौंपा गया है, जिसमें पाया जाता है कि Google मैप्स एक पाया परिणाम के लिए नीचे की शीट कैसे दिखाता है।

इसके तीन अलग-अलग चरण हैं:

  1. नीचे की सामग्री। ऊपरी क्षेत्र अभी भी छूने योग्य है और नीचे कुछ भी स्क्रॉल नहीं करेगा
  2. पूर्ण स्क्रीन सामग्री, जबकि ऊपरी क्षेत्र में एक बड़ा हेडर है।
  3. पूर्ण स्क्रीन सामग्री, जबकि ऊपरी क्षेत्र में सिर्फ टूलबार है।

यहां मैं Google मानचित्र के बारे में बात कर रहा हूं:

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

समस्या

बात यह है, नीचे की शीट अभी तक डिजाइन लाइब्रेरी का हिस्सा नहीं है (हालांकि यह अनुरोध किया गया था, यहां )।

इतना ही नहीं, लेकिन यूआई काफी जटिल है और कई चरणों में टूलबार को संभालने की जरूरत है।

मैंने क्या कोशिश की है

मैंने नीचे शीट ( यहाँ ) के लिए एक अच्छा (पर्याप्त) पुस्तकालय पाया है , और इसके टुकड़े के नमूने में सामग्री जोड़ दी है, सामग्री डिजाइन नमूनों (जैसे यहां ) पर दिखाए गए समान विचारों के बारे में , एक CollapsingToolbarLayout है कि देखभाल करेगा चरणों के 2 + 3।

मेरे द्वारा बनाए जा रहे ऐप में, आपको स्क्रॉल करते ही एक आइकन भी बदलना होगा, लेकिन मुझे लगता है कि अगर मैं बाकी के साथ सफल होता हूं, तो यह आसान होना चाहिए। यहाँ कोड है:

fragment_my.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    android:id="@+id/main_content"
    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.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="@dimen/detail_backdrop_height"

        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsing_toolbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"

            app:contentScrim="?attr/colorPrimary"
            app:expandedTitleMarginEnd="64dp"
            app:expandedTitleMarginStart="48dp"
            app:layout_scrollFlags="scroll|exitUntilCollapsed|snap">

            <ImageView
                android:id="@+id/backdrop"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:scaleType="centerCrop"
                app:layout_collapseMode="parallax"/>

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
        </android.support.design.widget.CollapsingToolbarLayout>
    </android.support.design.widget.AppBarLayout>

    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

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

            <android.support.v7.widget.CardView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="@dimen/card_margin">

                <LinearLayout
                    style="@style/Widget.CardContent"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content">

                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="Info"
                        android:textAppearance="@style/TextAppearance.AppCompat.Title"/>

                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="@string/cheese_ipsum"/>
                </LinearLayout>
            </android.support.v7.widget.CardView>

            <android.support.v7.widget.CardView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="@dimen/card_margin"
                android:layout_marginLeft="@dimen/card_margin"
                android:layout_marginRight="@dimen/card_margin">

                <LinearLayout
                    style="@style/Widget.CardContent"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content">

                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="Friends"
                        android:textAppearance="@style/TextAppearance.AppCompat.Title"/>

                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="@string/cheese_ipsum"/>
                </LinearLayout>
            </android.support.v7.widget.CardView>

            <android.support.v7.widget.CardView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="@dimen/card_margin"
                android:layout_marginLeft="@dimen/card_margin"
                android:layout_marginRight="@dimen/card_margin">

                <LinearLayout
                    style="@style/Widget.CardContent"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content">

                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="Related"
                        android:textAppearance="@style/TextAppearance.AppCompat.Title"/>

                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="@string/cheese_ipsum"/>
                </LinearLayout>
            </android.support.v7.widget.CardView>
        </LinearLayout>
    </android.support.v4.widget.NestedScrollView>

    <android.support.design.widget.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="@dimen/fab_margin"
        android:clickable="true"
        android:src="@android:drawable/ic_menu_send"
        app:layout_anchor="@id/appbar"
        app:layout_anchorGravity="bottom|right|end"/>

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

MyFragment.java

public class MyFragment extends BottomSheetFragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.fragment_my, container, false);
        view.setMinimumHeight(getResources().getDisplayMetrics().heightPixels);
        CollapsingToolbarLayout collapsingToolbar = (CollapsingToolbarLayout) view.findViewById(R.id.collapsing_toolbar);
        collapsingToolbar.setTitle("AAA");
        final Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
        final AppCompatActivity activity = (AppCompatActivity) getActivity();
        activity.setSupportActionBar(toolbar);
        activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        //toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                NavUtils.navigateUpFromSameTask(getActivity());
            }
        });
        final ImageView imageView = (ImageView) view.findViewById(R.id.backdrop);

        Glide.with(this).load(R.drawable.cheese_1).centerCrop().into(imageView);
        return view;
    }
}

BottomSheetFragmentActivity.java

public final class BottomSheetFragmentActivity extends AppCompatActivity {

    protected BottomSheetLayout bottomSheetLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bottom_sheet_fragment);
        bottomSheetLayout = (BottomSheetLayout) findViewById(R.id.bottomsheet);
        findViewById(R.id.bottomsheet_fragment_button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new MyFragment().show(getSupportFragmentManager(), R.id.bottomsheet);
            }
        });
        bottomSheetLayout.setShouldDimContentView(false);
        bottomSheetLayout.setPeekOnDismiss(true);
        bottomSheetLayout.setPeekSheetTranslation(200);
        bottomSheetLayout.setInterceptContentTouch(false);
        bottomSheetLayout.setDefaultViewTransformer(new BaseViewTransformer() {
            @Override
            public void transformView(final float translation, final float maxTranslation, final float peekedTranslation, final BottomSheetLayout parent, final View view) {
                Log.d("AppLog", "translation:" + translation + " maxTranslation:" + maxTranslation + " peekedTranslation:" + peekedTranslation);
            }
        });
    }
}

यह लगभग अच्छी तरह से काम करता है। एकमात्र समस्या # 3 वापस # 2 से संक्रमण है:

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

प्रश्न

कोड में क्या गलत है? आवश्यक व्यवहार प्राप्त करने के लिए मैं क्या कर सकता हूं?


मेरे लिए गतिविधि परिवर्तन देखें। क्या आपने 2 गतिविधियाँ बनाने और उनके बीच सामग्री संक्रमण को लागू करने की कोशिश की है? और CoordinatorLayout2 स्क्रीन पर इस्तेमाल किया ?
एसडी

@ मुझे यकीन है कि यह 2 गतिविधियां नहीं हैं, क्योंकि आप चरणों के बीच स्क्रॉल करने और स्विच करने के लिए स्क्रीन को छूते रह सकते हैं। यह आपको अगली / पिछली गतिविधि पर जाने के लिए नहीं रोकता है। एक नई गतिविधि खोलते समय, मुझे नहीं लगता कि स्क्रॉल तंत्र के लिए समान स्पर्श घटनाओं को जारी रखना संभव है। मुझे यह भी पता नहीं है कि टुकड़ों का उपयोग करना संभव है, लेकिन यह संभवतः गतिविधियों से अधिक संभव है।
एंड्रॉयड डेवलपर

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

@SD क्या आप जानते हैं कि यह कैसे काम करता है? क्या मैंने जो पाया है, उससे बेहतर है?
एंड्रॉइड डेवलपर

1
मुझे लगता है कि आपको इस लाइब्रेरी पर एक नज़र डालनी चाहिए
Savelii Zagurskii

जवाबों:


18

नोट : नीचे दिए गए संपादन पढ़ें


ठीक है, मुझे इसे करने का एक तरीका मिल गया है, लेकिन मुझे कई वर्गों के कोड को बदलना पड़ा, ताकि नीचे की शीट को ऐपबर्लेआउट की स्थिति का पता चल जाए (विस्तारित या नहीं), और मामले में स्क्रॉल-अप को अनदेखा करें विस्तार नहीं:

BottomSheetLayout.java

जोड़े गए फ़ील्ड:

private AppBarLayout mAppBarLayout;
private OnOffsetChangedListener mOnOffsetChangedListener;
private int mAppBarLayoutOffset;

init () - इसे जोड़ा गया:

    mOnOffsetChangedListener = new OnOffsetChangedListener() {
        @Override
        public void onOffsetChanged(final AppBarLayout appBarLayout, final int verticalOffset) {
            mAppBarLayoutOffset = verticalOffset;
        }
    };

AppBarLayout सेट करने के लिए जोड़ा समारोह:

public void setAppBarLayout(final AppBarLayout appBarLayout) {
    if (mAppBarLayout == appBarLayout)
        return;
    if (mAppBarLayout != null)
        mAppBarLayout.removeOnOffsetChangedListener(mOnOffsetChangedListener);
    mAppBarLayout = appBarLayout;
    mAppBarLayout.addOnOffsetChangedListener(mOnOffsetChangedListener);
}

onDetachedFromWindow () - इसे जोड़ा:

    if (mAppBarLayout != null)
        mAppBarLayout.removeOnOffsetChangedListener(mOnOffsetChangedListener);

onTouchEvent () - इसे जोड़ा गया:

      ...
      if (bottomSheetOwnsTouch) {
        if (state == State.EXPANDED && scrollingDown && mAppBarLayout != null && mAppBarLayoutOffset != 0) {
            event.offsetLocation(0, sheetTranslation - getHeight());
            getSheetView().dispatchTouchEvent(event);
            return true;
        }
      ...

वे मुख्य बदलाव थे। अब उन्हें क्या सेट करना है:

MyFragment.java

onCreateView () - इसे जोड़ा गया:

    mBottomSheetLayout.setAppBarLayout((AppBarLayout) view.findViewById(R.id.appbar));

मैंने यह फ़ंक्शन भी जोड़ा:

 public void setBottomSheetLayout(final BottomSheetLayout bottomSheetLayout) {
    mBottomSheetLayout = bottomSheetLayout;
}

अब यह कैसे गतिविधि appBarLayout के बारे में टुकड़ा बताता है:

            final MyFragment myFragment = new MyFragment();
            myFragment.setBottomSheetLayout(bottomSheetLayout);
            myFragment.show(getSupportFragmentManager(), R.id.bottomsheet);

प्रोजेक्ट अब GitHub पर उपलब्ध है:

https://github.com/AndroidDeveloperLB/ThreePhasesBottomSheet

मुझे आशा है कि यह कोई बग नहीं है।


समाधान में कीड़े हैं, दुख की बात है, इसलिए मैं इस उत्तर को सही नहीं मानूंगा:

  1. यह केवल एंड्रॉइड 6 और इसके बाद के संस्करण पर अच्छा काम करता है। अन्य में एक समय के एक छोटे से अंश के लिए नीचे की चादर का विस्तार दिखाने का एक अजीब व्यवहार होता है, हर बार इसे दिखाते समय।
  2. ओरिएंटेशन परिवर्तन स्क्रॉल की स्थिति को बिल्कुल भी नहीं बचाते हैं, इसलिए मैंने इसे अक्षम कर दिया है।
  3. नीचे की शीट की सामग्री को स्क्रॉल करने में सक्षम होने का दुर्लभ मुद्दा, जबकि यह अभी भी ध्वस्त है (तल पर)
  4. यदि पहले कोई कीबोर्ड दिखाया गया था, तो नीचे की शीट को फुल स्क्रीन पर देखा जा सकता है जब उसे खींचने की कोशिश की जा रही हो।

अगर कोई इसके साथ मदद कर सकता है, तो कृपया करें।


# 1 अंक के लिए, मैंने दृश्यता को INVISIBLE पर दृश्यता सेट करके एक फिक्स जोड़ने की कोशिश की है जब नीचे की शीट अभी तक नहीं देखी गई है, लेकिन यह हमेशा काम नहीं करता है, खासकर अगर एक कीबोर्ड दिखाया जाता है।


समस्या # 1 के लिए, मैंने पाया है कि इसे कैसे ठीक किया जाए, केवल "रैपिंग (" fragment_my.xml ") में समन्वयक किसी भी दृश्य के साथ जिसे आप उपयोग करना चाहते हैं (मैंने फ्रेमलेयआउट का उपयोग किया था), और एक पूर्ण-आकार वाला दृश्य भी डाला। यह (मैंने सिर्फ "दृश्य" डाला), जैसे:

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!--This full sized view, together with the FrameLayout above, are used to handle some weird UI issues on pre-Android-6 -->
    <View
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <...CollapsingToolbarLayout 
    ...

संभवत: इसने बॉटमशीट को भ्रमित कर दिया था जब मुझे कोऑर्डिनेटर लयआउट था। मैंने परियोजना को अपडेट किया है, लेकिन फिर भी, अगर कोई अच्छा उपाय है, तो मैं इसके बारे में जानना चाहूंगा।


हाल के महीनों में, Google ने अपने स्वयं के बॉटमशीट वर्ग को प्रकाशित किया है, लेकिन जैसा कि मैंने पाया है कि इसमें बहुत सारे मुद्दे हैं, इसलिए मैं इसे आज़मा भी नहीं सकता।


लेकिन इस छवि के बारे में क्या? Cloud.githubusercontent.com/assets/5357526/11641271/… मैं इस तरह की छवि को लागू करना चाहता हूं, साथ ही बॉटमशीट ऊपर जाती है
हार्डी

@HBroid मुझे लगता है कि यह संभव है। शायद "onOffsetChanged" फ़ंक्शन के लिए, mBottomSheetBackgroundIfageView का अनुवाद भी बदलें? मेरे मामले में आवश्यकता पहले 3 चरणों को संभालने की थी। अब यह एक सवाल है कि क्या परिवर्तन करना है और कैसे करना है, और यह बहुत ही अनुकूलित है और यह आपकी आवश्यकताओं पर निर्भर करता है। इसके लिए बहुत कष्टप्रद गणित की भी आवश्यकता होती है। मेरा सुझाव है कि त्वरित-सुविधा का उपयोग करके इसे तेज़ करने का प्रयास करें।
एंड्रॉयड डेवलपर

मैं समाधान खोजने में सक्षम नहीं हूं कृपया मेरी मदद करें
हार्डी

@HBdroid क्षमा करें मुझे नहीं पता। शायद इस ऐप को हटाने की कोशिश करें: layout_collapseMode = "लंबन"। ट्रांसफ़ॉर्म व्यू में अनुवाद करने का भी प्रयास करें।
एंड्रॉयड डेवलपर

2
@ हार्डी क्या आपने वह समाधान तैयार किया है जिसे आप चाहते थे? यदि हाँ यह खुला स्रोत है और क्या इसे साझा किया जा सकता है?
N Jay

15

बड़ा अद्यतन

क्योंकि एक ही विषय के बारे में 4 या 5 प्रश्न थे, लेकिन अलग-अलग आवश्यकताओं के साथ, और मैंने उन सभी का उत्तर देने की कोशिश की, लेकिन एक गैर-विनम्र व्यवस्थापक ने उन्हें हटा दिया / बंद कर दिया, जिससे मुझे प्रत्येक के लिए एक टिकट बना और उन्हें बदल दिया गया। "कॉपी पेस्ट" से बचें, मैं आपको पूर्ण उत्तर के लिए एक लिंक दूंगा जहां आप Google मैप्स की तरह पूर्ण व्यवहार प्राप्त करने के बारे में सभी विवरण पा सकते हैं।


आपके सवाल का जवाब दे रहा हूं

Google नक्शे की निचली शीट 3 चरणों के व्यवहार की नकल कैसे करें?

समर्थन पुस्तकालय के साथ 23.x.x + आप इसे डिफ़ॉल्ट रूप में संशोधित कर सकते हैं BottomSheetBehavior, निम्न चरणों के साथ एक और स्टेट जोड़ सकते हैं :

  1. एक जावा वर्ग बनाएं और इसे आगे बढ़ाएं CoordinatorLayout.Behavior<V>
  2. BottomSheetBehaviorअपने नए के लिए डिफ़ॉल्ट फ़ाइल से पेस्ट कोड कॉपी करें ।
  3. clampViewPositionVerticalनिम्नलिखित कोड के साथ विधि को संशोधित करें :

    @Override
    public int clampViewPositionVertical(View child, int top, int dy) {
        return constrain(top, mMinOffset, mHideable ? mParentHeight : mMaxOffset);
    }
    int constrain(int amount, int low, int high) {
        return amount < low ? low : (amount > high ? high : amount);
    }
  4. एक नई स्थिति जोड़ें:

    public static final int STATE_ANCHOR_POINT = X;
  5. अगले तरीकों संशोधित करें: onLayoutChild, onStopNestedScroll, BottomSheetBehavior<V> from(V view)और setState(वैकल्पिक)

मैं उन संशोधित तरीकों और उदाहरण परियोजना के लिए एक कड़ी जोड़ने जा रहा हूं ।

और यहाँ है कि इसकी तरह दिखता है:
CustomBottomSheetBehavior


मैं अब github रेपो का परीक्षण कर चुका हूं, और यह अच्छा लगता है। लेकिन ऊपरी नीला क्षेत्र कभी-कभी आंशिक दिखता है। इसके अलावा, मैं यह नहीं जान सकता कि जहाँ आप नीचे की शीट को खींचते हैं, वहाँ उन विचारों को कैसे संभालना चाहिए। मेरे द्वारा किए गए रेपो में (यहाँ: github.com/AndroidDeveloperLB/ThreePhasesBottomSheet ), छवि धूमिल होती है, और छोटी छवि एक स्थान से दूसरे स्थान पर जाती है, जिसमें इसका आकार बदलना भी शामिल है। मैं यह जानना चाहूंगा कि उन से निपटने के लिए कहां जोड़ना है।
Android डेवलपर

नमस्ते वहाँ, मैं लंबन छवि के साथ एक स्थानीय संस्करण है, लेकिन यह अभी तक अच्छी तरह से काम नहीं कर रहा है (अगर आप इसे देखना चाहते हैं तो मैं इसे आगे बढ़ा सकता हूं)। आप के अंदर किसी भी दृश्य में जोड़ सकते हैं CoordinatorLayoutमें activity_main.xml। मुझे लगता है कि आपके पास समन्वयक लेआउट के साथ अच्छा अनुभव है, अन्यथा इस लिंक
मिगुएलहिनकपी

मैं यह देखने जा रहा हूं कि आपको टूलबार का व्यवहार कैसे मिला और वह मेरा उपयोग करेगा: डी। वैसे थोड़ा व्यवहार है कि मैं केवल समर्थन कर सकता हूं अगर मैं समर्थन पुस्तकालय का उपयोग करता हूं 23.2: Google मानचित्र में यदि आप छवि को खींचते हैं तो टूलबार के नीचे यह बॉटलशीट को स्थानांतरित कर देगा, लेकिन यदि आप 23.4 या minsdkortersion 14 पर अपग्रेड करते हैं तो आप करेंगे इस व्यवहार को खोएं o_O '
मिगेलहिनकपी

@androiddeveloper मुझे मिल गया! अब इसकी छवि लंबन प्रभाव और टूलबार एनिमेशन के साथ काम कर रही है ... मैं केवल उस रंग को याद कर रहा हूं जब आप टूलबार लेते हैं जब आप ऊपर स्लाइड करते रहते हैं: D
MiguelHincapieC

@MiguelHincapieC हाय, मैं केवल मुख्य टूलबार प्रदर्शित करना चाहता हूं और मैंने मर्ज किए गए ऐपबार लेआउट को हटा दिया है, लेकिन नीचे की शीट पर टाइम स्टेटस बार को प्रदर्शित नहीं करने के लिए और स्टेट बार की स्थिति के लिए पैरालेलेक्स छवि अंत प्रदर्शित नहीं करना चाहता हूं और मैं मुख्य टूलबार के नीचे छवि को लकवाग्रस्त करना चाहता हूं। क्या आप बता सकते हैं कि मैं यह कैसे कर सकता हूँ
विजय राजपूत

0

क्या आपने यह कोशिश की? http://android-developers.blogspot.in/2016/02/android-support-library-232.html?m=1 यहां पर यह कहा गया है कि हम सिर्फ एक नीचे की शीट लेआउट व्यवहार को निर्दिष्ट कर सकते हैं।

अपडेट करें:

मूल रूप से लिंक बताता है-

एक बच्चे के लिए एक बॉटमशीटबाइहेयर संलग्न करके एक समन्वयकलेयआउट का दृश्य देखें (जैसे, ऐप जोड़ना: Layout_behavior = "android.support.design.widget.BottomSheetBevivior"), आपको स्वचालित रूप से पांच राज्य के बीच संक्रमण के लिए उपयुक्त स्पर्श का पता लग जाएगा:

STATE_COLLAPSED: this collapsed state is the default and shows just a portion of the layout along the bottom. The height can be controlled with the app:behavior_peekHeight attribute (defaults to 0)
STATE_DRAGGING: the intermediate state while the user is directly dragging the bottom sheet up or down
STATE_SETTLING: that brief time between when the View is released and settling into its final position
STATE_EXPANDED: the fully expanded state of the bottom sheet, where either the whole bottom sheet is visible (if its height is less than the containing CoordinatorLayout) or the entire CoordinatorLayout is filled
STATE_HIDDEN: disabled by default (and enabled with the app:behavior_hideable attribute), enabling this allows users to swipe down on the bottom sheet to completely hide the bottom sheet
Keep in mind that scrolling containers in your bottom sheet must support nested scrolling (for example, NestedScrollView, RecyclerView, or ListView/ScrollView on API 21+).

यदि आप राज्य परिवर्तन के कॉलबैक प्राप्त करना चाहते हैं, तो आप एक बॉटमशीट कॉलबैक जोड़ सकते हैं:

// The View with the BottomSheetBehavior  
 View bottomSheet = coordinatorLayout.findViewById(R.id.bottom_sheet);  
 BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);  
 behavior.setBottomSheetCallback(new BottomSheetCallback() {  
    @Override  
    public void onStateChanged(@NonNull View bottomSheet, int newState) {  
      // React to state change  
    }  
      @Override  
      public void onSlide(@NonNull View bottomSheet, float slideOffset) {  
       // React to dragging events  
   }  
 });  

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


Google द्वारा अपना समर्थन लाइब्रेरी वर्ग दिखाए जाने से पहले प्रश्न किया गया था। यदि आपके पास इसका उपयोग करने का कार्यशील समाधान है, तो कृपया इसे यहां दिखाएं।
Android डेवलपर

@androiddeveloper मैंने प्रश्न की तारीख नहीं पढ़ी और इसलिए मैंने यह उत्तर सुझाया। लेकिन अगर आप इस पुस्तकालय का उपयोग करना चाहते हैं तो आप इसका उपयोग कर सकते हैं। जहाँ तक इस कोड के लिए काम करने का उपाय है, मेरे पास नहीं है। माफ़ करना।
वैभव शर्मा

0

मुझे एक दृश्य के समान भी लागू करना पड़ा कि Google मैप्स किसी परिणाम के लिए नीचे-शीट कैसे दिखाता है।

यहाँ मेरा कैसे दिखता है:

झांकने का दृश्य

विस्तृत दृश्य ऊपर स्क्रॉल किया गया

विस्तृत दृश्य नीचे तक स्क्रॉल किया गया

सबसे पहले, मैंने हेडर और स्क्रॉल करने योग्य सामग्री के साथ एक निचली शीट को परिभाषित किया था लेकिन लेआउट_हाइट निर्दिष्ट करने के बावजूद न तो हेडर की सामग्री को लपेटता था और न ही स्क्रॉल करने योग्य सामग्री wrap_content

यही कारण है कि समस्या दूर चला गया जब मैं प्रयोग किया जाता LinearLayoutके बजाय ConstraintLayoutके लिए CoordinatorLayoutके बच्चे लेआउट (और उसके बच्चों के लिए)।

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/buttonPeek"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Peek"
        app:layout_constraintEnd_toStartOf="@+id/buttonExpand"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/buttonExpand"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Expand"
        app:layout_constraintEnd_toStartOf="@+id/buttonClose"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/buttonPeek"
        app:layout_constraintTop_toTopOf="@+id/buttonPeek" />

    <Button
        android:id="@+id/buttonClose"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Close"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/buttonExpand"
        app:layout_constraintTop_toTopOf="@+id/buttonExpand" />

    <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/layout_coordinator"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <LinearLayout
            android:id="@+id/layout_coordinator_child"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:behavior_hideable="true"
            app:layout_behavior="@string/bottom_sheet_behavior">

            <LinearLayout
                android:id="@+id/layout_bottom_sheet_header"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="#FFFF0000"
                android:orientation="vertical" >

                <TextView
                    android:id="@+id/headerTextView_a"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="a" />

                <TextView
                android:id="@+id/headerTextView_b"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="b" />

                <TextView
                android:id="@+id/headerTextView_c"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="c" />

                <TextView
                android:id="@+id/headerTextView_d"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="d" />

                <TextView
                android:id="@+id/headerTextView_e"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="e" />

                <TextView
                android:id="@+id/headerTextView_f"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="f" />

                <TextView
                android:id="@+id/headerTextView_g"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="g" />

                <TextView
                android:id="@+id/headerTextView_h"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="h" />

                <TextView
                android:id="@+id/headerTextView_i"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="i" />

                <TextView
                android:id="@+id/headerTextView_j"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="j" />

                <TextView
                android:id="@+id/headerTextView_k"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="k" />

            </LinearLayout>

            <androidx.core.widget.NestedScrollView
                android:id="@+id/layout_bottom_sheet_scrollable_view"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="#FF00FF00"
                android:fillViewport="true" >

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

                    <TextView
                        android:id="@+id/textView0"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="0" />

                    <TextView
                        android:id="@+id/textView1"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="1" />

                    <TextView
                        android:id="@+id/textView2"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="2" />

                    <TextView
                        android:id="@+id/textView3"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="3" />

                    <TextView
                        android:id="@+id/textView4"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="4" />

                    <TextView
                        android:id="@+id/textView5"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="5" />

                    <TextView
                        android:id="@+id/textView6"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="6" />

                    <TextView
                        android:id="@+id/textView7"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="7" />

                    <TextView
                        android:id="@+id/textView8"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="8" />

                    <TextView
                        android:id="@+id/textView9"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="9" />

                    <TextView
                        android:id="@+id/textView10"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="10" />

                    <TextView
                        android:id="@+id/textView11"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="11" />

                    <TextView
                        android:id="@+id/textView12"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="12" />

                    <TextView
                        android:id="@+id/textView13"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="13" />

                    <TextView
                        android:id="@+id/textView14"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="14" />

                    <TextView
                        android:id="@+id/textView15"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="15" />

                    <TextView
                        android:id="@+id/textView16"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="16" />

                    <TextView
                        android:id="@+id/textView17"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="17" />

                    <TextView
                        android:id="@+id/textView18"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="18" />

                    <TextView
                        android:id="@+id/textView19"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="19" />

                    <TextView
                        android:id="@+id/textView20"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="20" />

                    <TextView
                        android:id="@+id/textView21"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="21" />

                    <TextView
                        android:id="@+id/textView22"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="22" />

                    <TextView
                        android:id="@+id/textView23"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="23" />

                    <TextView
                        android:id="@+id/textView24"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="24" />

                    <TextView
                        android:id="@+id/textView25"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="25" />

                    <TextView
                        android:id="@+id/textView26"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="26" />

                    <TextView
                        android:id="@+id/textView27"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="27" />

                    <TextView
                        android:id="@+id/textView28"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="28" />

                    <TextView
                        android:id="@+id/textView29"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="29" />

                    <TextView
                        android:id="@+id/textView30"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="30" />

                    <TextView
                        android:id="@+id/textView31"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="31" />

                    <TextView
                        android:id="@+id/textView32"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="32" />

                    <TextView
                        android:id="@+id/textView33"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="33" />

                    <TextView
                        android:id="@+id/textView34"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="34" />

                    <TextView
                        android:id="@+id/textView35"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="35" />

                    <TextView
                        android:id="@+id/textView36"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="36" />

                    <TextView
                        android:id="@+id/textView37"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="37" />

                    <TextView
                        android:id="@+id/textView38"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="38" />

                    <TextView
                        android:id="@+id/textView39"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="39" />

                    <TextView
                        android:id="@+id/textView40"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="40" />

                    <TextView
                        android:id="@+id/textView41"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="41" />

                    <TextView
                        android:id="@+id/textView42"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="42" />

                    <TextView
                        android:id="@+id/textView43"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="43" />

                    <TextView
                        android:id="@+id/textView44"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="44" />

                    <TextView
                        android:id="@+id/textView45"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="45" />

                    <TextView
                        android:id="@+id/textView46"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="46" />

                    <TextView
                        android:id="@+id/textView47"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="47" />

                    <TextView
                        android:id="@+id/textView48"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="48" />

                    <TextView
                        android:id="@+id/textView49"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="49" />

                </LinearLayout>

            </androidx.core.widget.NestedScrollView>
        </LinearLayout>

    </androidx.coordinatorlayout.widget.CoordinatorLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity.java

package com.example.bottomsheetwithscrollablecontent;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.google.android.material.bottomsheet.BottomSheetBehavior;

import androidx.appcompat.app.AppCompatActivity;
import androidx.coordinatorlayout.widget.CoordinatorLayout;

public class MainActivity extends AppCompatActivity {
    private CoordinatorLayout layout_coordinator;
    private View layout_coordinator_child;
    private View layout_bottom_sheet_header;

    private BottomSheetBehavior behavior;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        layout_coordinator = findViewById(R.id.layout_coordinator);
        layout_coordinator_child = layout_coordinator.findViewById(R.id.layout_coordinator_child);
        layout_bottom_sheet_header = layout_coordinator.findViewById(R.id.layout_bottom_sheet_header);

        behavior = BottomSheetBehavior.from(layout_coordinator_child);

        Button buttonPeek = findViewById(R.id.buttonPeek);
        buttonPeek.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                behavior.setPeekHeight(layout_bottom_sheet_header.getHeight());
                behavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
            }
        });

        Button buttonExpand = findViewById(R.id.buttonExpand);
        buttonExpand.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
            }
        });

        Button buttonClose = findViewById(R.id.buttonClose);
        buttonClose.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                behavior.setState(BottomSheetBehavior.STATE_HIDDEN);
            }
        });
    }
}

एप्लिकेशन / build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.example.bottomsheetwithscrollablecontent"
        minSdkVersion 24
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.0.0-beta01'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.1.0-alpha4'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-alpha4'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0-beta01'
    implementation "com.google.android.material:material:1.1.0-alpha04"
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.