বটমশিটে ব্যবহারকারীকে টেনে আনতে অক্ষম করা হচ্ছে


102

আমি ব্যবহারকারীকে টেনে আনতে অক্ষম করার চেষ্টা করছি BottomSheet। আমি অক্ষম করতে চাই কারণ দুটি জিনিস। ১. এটি ListViewনীচের দিকে স্ক্রোল হওয়া থেকে বাধা দিচ্ছে , ২. আমি চাই না যে ব্যবহারকারীরা টেনে আনার মাধ্যমে বরখাস্ত করুন তবে এর উপর একটি বোতাম রেখে BottomSheetView। এটাই আমি করেছি

 bottomSheetBehavior = BottomSheetBehavior.from(bottomAnc);
    bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
        @Override
        public void onStateChanged(@NonNull View bottomSheet, int newState) {
            if (newState == BottomSheetBehavior.STATE_EXPANDED) {
                //Log.e("BottomSheet", "Expanded");
            } else if (newState == BottomSheetBehavior.STATE_COLLAPSED) {
                //Log.e("BottomSheet", "Collapsed");
            }
        }

        @Override
        public void onSlide(@NonNull View bottomSheet, float slideOffset) {
            // React to dragging events
            bottomSheet.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    int action = MotionEventCompat.getActionMasked(event);
                    switch (action) {
                        case MotionEvent.ACTION_DOWN:
                            return false;
                        default:
                            return true;
                    }
                }
            });
        }
    });

নীচের অংশে শীটলয়আউট

    <?xml version="1.0" encoding="utf-8"?><FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
app:behavior_hideable="true"
app:behavior_peekHeight="0dp"
app:layout_behavior="@string/bottom_sheet_behavior"
android:id="@+id/bottomSheet">

<android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:elevation="10dp">

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

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

            <TextView
                android:id="@+id/text1"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="Order Items"
                android:layout_margin="16dp"
                android:textAppearance="@android:style/TextAppearance.Large"/>


            <Button
                android:layout_width="50dp"
                android:layout_height="wrap_content"
                android:layout_marginRight="5dp"
                android:background="@drawable/bg_accept"/>

            <Button
                android:layout_width="50dp"
                android:layout_height="wrap_content"
                android:layout_marginRight="8dp"
                android:background="@drawable/bg_cancel"/>

        </LinearLayout>

        <ListView
            android:id="@+id/item_edit"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/white"
            android:divider="@color/md_divider_black"
            android:dividerHeight="1dp"/>

    </LinearLayout>

</android.support.v7.widget.CardView>


দয়া করে আমার উত্তরটি পরীক্ষা করুন। আমি লক্ষ্য করেছি যে এটি গৃহীত উত্তরের চেয়ে বেশি প্রাসঙ্গিক
ভিটালি ওবাইডিকো

উত্তর:


94

এটি এখন আর প্রাসঙ্গিক হতে পারে না তবে আমি এটি এখানে রেখে দেব:

import android.content.Context
import android.util.AttributeSet
import androidx.coordinatorlayout.widget.CoordinatorLayout
import android.view.MotionEvent
import android.view.View
import com.google.android.material.bottomsheet.BottomSheetBehavior

@Suppress("unused")
class LockableBottomSheetBehavior<V : View> : BottomSheetBehavior<V> {
    constructor() : super()
    constructor(context: Context, attrs: AttributeSet) : super(context, attrs)

    var swipeEnabled = true

    override fun onInterceptTouchEvent(
        parent: CoordinatorLayout,
        child: V,
        event: MotionEvent
    ): Boolean {
        return if (swipeEnabled) {
            super.onInterceptTouchEvent(parent, child, event)
        } else {
            false
        }
    }

    override fun onTouchEvent(parent: CoordinatorLayout, child: V, event: MotionEvent): Boolean {
        return if (swipeEnabled) {
            super.onTouchEvent(parent, child, event)
        } else {
            false
        }
    }

    override fun onStartNestedScroll(
        coordinatorLayout: CoordinatorLayout,
        child: V,
        directTargetChild: View,
        target: View,
        axes: Int,
        type: Int
    ): Boolean {
        return if (swipeEnabled) {
            super.onStartNestedScroll(
                coordinatorLayout,
                child,
                directTargetChild,
                target,
                axes,
                type
            )
        } else {
            false
        }
    }

    override fun onNestedPreScroll(
        coordinatorLayout: CoordinatorLayout,
        child: V,
        target: View,
        dx: Int,
        dy: Int,
        consumed: IntArray,
        type: Int
    ) {
        if (swipeEnabled) {
            super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type)
        }
    }

    override fun onStopNestedScroll(
        coordinatorLayout: CoordinatorLayout,
        child: V,
        target: View,
        type: Int
    ) {
        if (swipeEnabled) {
            super.onStopNestedScroll(coordinatorLayout, child, target, type)
        }
    }

    override fun onNestedPreFling(
        coordinatorLayout: CoordinatorLayout,
        child: V,
        target: View,
        velocityX: Float,
        velocityY: Float
    ): Boolean {
        return if (swipeEnabled) {
            super.onNestedPreFling(coordinatorLayout, child, target, velocityX, velocityY)
        } else {
            false
        }
    }
}

এবং এটি আপনার এক্সএমএল ফাইলে ব্যবহার করুন:

app:layout_behavior="com.your.package.LockableBottomSheetBehavior"

এটি সমস্ত ব্যবহারকারীর ক্রিয়া অক্ষম করে, আপনি কেবল প্রোগ্রামিয়মে বটমশিট নিয়ন্ত্রণ করতে চাইলে এটি ব্যবহার করা যেতে পারে।


4
বটমশিটবিহাভিওর অক্ষম করার জন্য এটি সেরা উত্তর। উপরের একজন ব্যক্তিও অবিস্মরণীয় সমাধান পোস্ট করেছেন, তবে তিনি অন ​​টচএভেন্ট () এর মতো অন্য ইভেন্টগুলিকে ওভাররাইড করতে লিখেন নি । অন্যদিকে আপনি মিথ্যা
মার্ট করুন

4
আপনি কীভাবে এটি বটমশিটফ্র্যাগমেন্ট দিয়ে ব্যবহার করবেন?
ব্যবহারকারী3144836

7
আপনার এক্সএমএলে আপনাকে বিশেষভাবে এই শ্রেণিটি উল্লেখ করতে হবে। অ্যাপ্লিকেশন: লেআউট_বেহেভিয়ার = "com.my.package.UserLockBottomSheetBehaviour"
স্টিভ

4
কিছু ক্ষেত্রে, এটি এখনও কাজ করে না, নীচে শীট খণ্ডে যদি আমাদের একটি তালিকা থাকে তবে এটি টানছে
দীপক যোশি

4
@ প্রদীপ জোশি হয়ত আপনার পুনরায় ব্যবহারকারীর দৃশ্য বাড়িয়ে দিতে পারেন এবং 'হ্যাস্টনেস্টড্রোকলিং প্যারেন্ট' এর মতো কয়েকটি পদ্ধতির ওভাররাইড করতে পারেন, তবে আমি নিশ্চিত নই
ভিটিলি ওবদিইকো

77

রাষ্ট্রের onStateChangedপদ্ধতিতে setBottomSheetCallbackযদি রাষ্ট্রটি পরীক্ষা করে থাকে BottomSheetBehavior.STATE_DRAGGINGতবে এটিকে BottomSheetBehavior.STATE_EXPANDEDএভাবে পরিবর্তন করুন আপনি STATE_DRAGGINGব্যবহারকারীর দ্বারা থামতে পারবেন । নীচের মত

final BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);
        behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
            @Override
            public void onStateChanged(@NonNull View bottomSheet, int newState) {
                if (newState == BottomSheetBehavior.STATE_DRAGGING) {
                    behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
                }
            }

            @Override
            public void onSlide(@NonNull View bottomSheet, float slideOffset) {
            }
        });

নীচের মত বন্ধ নীচের শীট খুলতে বোতাম ব্যবহার করুন

fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (behavior.getState() == BottomSheetBehavior.STATE_HIDDEN) {
                    behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
                } else {
                    behavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
                }
            }
        });

ব্যবহার করবেন না setPeekHeightবাapp:behavior_peekHeight

উপরের উপায়ে আপনি আপনার লক্ষ্যে পৌঁছাতে পারবেন


4
দুর্দান্ত কৌশল। তা খেয়াল করেনি। ধন্যবাদ এবং এছাড়াও, আপনি এই সাহায্য করতে পারেন? আমি যখন প্রথমে এটি প্রসারিত করতে বলি, এটি স্বচ্ছ এবং আমি পিছনে দৃশ্যটি দেখতে পাচ্ছি, তবে আমি দৃশ্যমান করার আগে শিটভিউতে সম্পাদনা পাঠ্য ট্যাপ না করা পর্যন্ত আমি ইন্টারঅ্যাক্ট করতে পারব না।
টোনস্পি

আমি আমার তৈরি করেছি BottomSheet View match_parentএবং যখনই আমি এটি আমার সামনে আনার চেষ্টা করেছি Activityআমি লক্ষ্য করেছি এটি স্লাইড উপরে উঠে গেছে, তবে এটি উপস্থিত না হওয়া অবধি আমি এতে ট্যাপ EditTextনা করি যা উপস্থিত করে Keyboardএবং BottomSheet Viewদৃশ্যমান করে
টোনস্পি

4
আমি এটি চেষ্টা করেছিলাম, কিন্তু রাজ্যগুলি শেষ হয় STATE_SETTLING। নীচে শীটটি খুলতে এবং বন্ধ করতে আমার কাছে একটি বোতাম আছে, যদি এটি লুকানো থাকে তবে আমি এটি প্রসারিত করি। যদি এটি প্রসারিত হয় তবে আমি এটি লুকিয়ে রাখি। যেহেতু এটি সেটলিংয়ে আটকে যায়, নীচে শীটটি টেনে আনার পরে আমার বোতামটি কাজ করে না। কোন ধারণা?
গোখন আরিক

4
এই সমাধানটি অবিশ্বাস্য; নীচের শীটটি খারাপ অবস্থায় চলে যায়, যেমন গোখান বলেছিল ... এবং যখন এই খারাপ অবস্থা হয় তখন নীচের শীটে কোনও নতুন টুকরো লোড করার মতো কলগুলি খালি ফাঁকা হয়ে যায়।
রায় ডব্লিউ

8
এটি কাজ করবে না যদি আপনি nestedscrollview ভিতরে নীচে চাদর আছে
Rishabh Chandel

33

ঠিক আছে, সুতরাং গৃহীত উত্তরটি আমার পক্ষে কার্যকর হয়নি। তবে Виталий Обидейко এর উত্তর আমার চূড়ান্ত সমাধানকে অনুপ্রাণিত করেছে।

প্রথমত, আমি নীচের কাস্টম বটমশিটবিভাভিয়ার তৈরি করেছি। এটি স্পর্শযুক্ত সমস্ত পদ্ধতিতে ওভাররাইড করে এবং লক করা থাকলে মিথ্যা (বা কিছুই করেনি) ফেরত দেয়। অন্যথায়, এটি একটি সাধারণ বটমশীট বিহেভিয়ারের মতো কাজ করে। এটি ব্যবহারকারীর নীচে টেনে নেওয়ার ক্ষমতা অক্ষম করে এবং কোডে রাষ্ট্র পরিবর্তন করা প্রভাবিত করে না।

লকযোগ্যবটমশীট বিহাইভিয়ার.জভা

public class LockableBottomSheetBehavior<V extends View> extends BottomSheetBehavior<V> {

    private boolean mLocked = false;

    public LockableBottomSheetBehavior() {}

    public LockableBottomSheetBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setLocked(boolean locked) {
        mLocked = locked;
    }

    @Override
    public boolean onInterceptTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) {
        boolean handled = false;

        if (!mLocked) {
            handled = super.onInterceptTouchEvent(parent, child, event);
        }

        return handled;
    }

    @Override
    public boolean onTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) {
        boolean handled = false;

        if (!mLocked) {
            handled = super.onTouchEvent(parent, child, event);
        }

        return handled;
    }

    @Override
    public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, V child, View directTargetChild, View target, int nestedScrollAxes) {
        boolean handled = false;

        if (!mLocked) {
            handled = super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes);
        }

        return handled;
    }

    @Override
    public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, V child, View target, int dx, int dy, int[] consumed) {
        if (!mLocked) {
            super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed);
        }
    }

    @Override
    public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, V child, View target) {
        if (!mLocked) {
            super.onStopNestedScroll(coordinatorLayout, child, target);
        }
    }

    @Override
    public boolean onNestedPreFling(CoordinatorLayout coordinatorLayout, V child, View target, float velocityX, float velocityY) {
        boolean handled = false;

        if (!mLocked) {
            handled = super.onNestedPreFling(coordinatorLayout, child, target, velocityX, velocityY);
        }

        return handled;

    }
}

এটি কীভাবে ব্যবহার করতে হয় তার একটি উদাহরণ এখানে। আমার ক্ষেত্রে, আমার এটির প্রয়োজন ছিল যাতে প্রসারিত হওয়ার পরে নীচের শীটটি লক করা হয়।

ক্রিয়াকলাপ_হোম.এক্সএমএল

<?xml version="1.0" encoding="utf-8"?>
<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.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <android.support.design.widget.CollapsingToolbarLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_scrollFlags="scroll|snap"
            app:titleEnabled="false"/>
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"/>
    </android.support.design.widget.AppBarLayout>

    <!-- Use layout_behavior to set your Behavior-->
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layoutManager="android.support.v7.widget.LinearLayoutManager"
        app:layout_behavior="com.myapppackage.LockableBottomSheetBehavior"/>

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

হোমঅ্যাক্টিভিটি.জভা

public class HomeActivity extends AppCompatActivity {
    BottomSheetBehavior mBottomSheetBehavior;

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

        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
        recyclerView.setAdapter(new SomeAdapter());

        mBottomSheetBehavior = BottomSheetBehavior.from(recyclerView);
        mBottomSheetBehavior.setBottomSheetCallback(new MyBottomSheetCallback());
    }

    class MyBottomSheetCallback extends BottomSheetBehavior.BottomSheetCallback() {
        @Override
        public void onStateChanged(@NonNull View bottomSheet, int newState) {
            if (newState == BottomSheetBehavior.STATE_EXPANDED) {
                if (mBottomSheetBehavior instanceof LockableBottomSheetBehavior) {
                    ((LockableBottomSheetBehavior) mBottomSheetBehavior).setLocked(true);
                }
            }
        }

        @Override
        public void onSlide(@NonNull View bottomSheet, float slideOffset) {}
    });
}

আশা করি এটি বিভ্রান্তি অনেকটা দূর করতে সহায়তা করে!


4
ভাল, এটি সর্বোত্তম উত্তর যে আমরা এই রাজ্যগুলিকে কার্যকরভাবে এড়াতে পারি যা ঘটনাগুলিকে মিস করে। ধন্যবাদ.
টান এনগুইন

@ জেমস - দুর্দান্ত উত্তর তবে এখন আমি পীকহাইট () সেট করতে পারছি না। কোন ধারণা?
আদর্শ যাদব

আমি এই চেষ্টা করেছিলাম। এটা আমার জন্য কাজ করে. আমার পাছা বাঁচানোর জন্য ধন্যবাদ ভাই
সুপার.আইএ

4
এটি আজকের মতো আপডেট না হলেও এটি একটি ভাল কাজ। অননিস্টপ্রেসক্রোল এবং অন্যান্য কয়েকটি পদ্ধতি অবচয় করা হয়েছে। এই পদ্ধতিগুলি আপডেট করা দরকার এবং এটি ঠিক কাজ করে।
অজয়

4
হ্যালো, এটি একটি বটমপত্রক ডায়ালগ ফ্রেমটিতে কাজ করে না, আমি এখনও বোতলশীটটি টানাতে পারি
ফ্লোরিয়ান

23

ব্যবহারকারীকে টেনে আনার ক্ষেত্রে এই ব্যবহারের ক্ষেত্রে গতিশীলরূপে অক্ষম করার জন্য আমি একটি কার্যপ্রণালী লিখে শেষ করেছি, যার মাধ্যমে বটমসীট বিহাইভিয়ারটি অনারসেপটচভেন্টকে ওভাররাইড করার জন্য সাবক্লাস করা হয়েছে এবং যখন একটি কাস্টম পতাকা (এই ক্ষেত্রে এমএলওয়েজারড্রেগিং) মিথ্যাতে সেট করা থাকে:

import android.content.Context;
import android.support.design.widget.BottomSheetBehavior;
import android.support.design.widget.CoordinatorLayout;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class WABottomSheetBehavior<V extends View> extends BottomSheetBehavior<V> {
    private boolean mAllowUserDragging = true;
    /**
     * Default constructor for instantiating BottomSheetBehaviors.
     */
    public WABottomSheetBehavior() {
        super();
    }

    /**
     * Default constructor for inflating BottomSheetBehaviors from layout.
     *
     * @param context The {@link Context}.
     * @param attrs   The {@link AttributeSet}.
     */
    public WABottomSheetBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setAllowUserDragging(boolean allowUserDragging) {
        mAllowUserDragging = allowUserDragging;
    }

    @Override
    public boolean onInterceptTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) {
        if (!mAllowUserDragging) {
            return false;
        }
        return super.onInterceptTouchEvent(parent, child, event);
    }
}

এবং আপনার বিন্যাসে এক্সএমএল:

    <FrameLayout
        android:id="@+id/bottom_sheet_frag_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:behavior_hideable="true"
        app:behavior_peekHeight="@dimen/bottom_sheet_peek_height"
        app:elevation="@dimen/bottom_sheet_elevation"
        app:layout_behavior="com.example.ray.WABottomSheetBehavior" />

এখন অবধি, চাহিদার নীচে নীচে শীটটিতে ব্যবহারকারীকে টেনে আনার জন্য এটি সর্বাধিক ধারাবাহিকভাবে আচরণমূলক সমাধান।

অন ​​স্টেটচ্যাঞ্জড কলব্যাকের অন্য সেটস্টেট কল ফায়ার করার উপর নির্ভর করে এমন সমস্ত সমাধানের ফলে বটমশিটটি খারাপ অবস্থার মধ্যে পড়েছে বা উল্লেখযোগ্য ইউএক্স সমস্যা সৃষ্টি করে (সেট আপ স্টেট স্টেট কল চালানোর ক্ষেত্রে পোস্ট করার ক্ষেত্রে)।

আশা করি এটি কাউকে সাহায্য করবে :)

রশ্মি


4
এটি বেশ ঝরঝরে
ওডিস

4
ফ্রেমলআউটটির পরিবর্তে @ বিইংজেইকে, নেস্টেডস্ক্রোলভিউ ব্যবহার করুন এবং সেট করুনbottomSheetFragContainer.setNestedScrollingEnabled(false);
আফজাল এন

4
সলভড: কলব্যাক সমন্বয়কারী লেআউট.বিহেভিয়ার আচরণ = লেআউটপ্যারাম.সেটবিহেভিয়ার () সেট করে; যদি (আচরণ! = নাল && আচরণ উদাহরণস্বরূপ নীচে শীটবিহেভিয়ার) {((নীচে শীটবিহেভিয়ার) আচরণ) set .সেটবোটমশিটক্যালব্যাক (এমবটমশিটবিহেভিয়ারক্যালব্যাক); }
LOG_TAG

4
এটা আমার জন্য জাগবে না! পিএস: আমার বোতলশীটে একটি স্ক্রোলযোগ্য পাঠ্য রয়েছে
থোরভাল্ড ওলাভসেন

6
আপনি কীভাবে এটি আরম্ভের সময় নিক্ষেপ করবেন? এটি আমাকে WABottomSheetBehavior <ভিউ> আচরণ = (WABottomSheetBehavior) নীচে শীটবিভাবিয়ার.ফর্ম (শিটভিউ) সতর্কতা দেয়;
লিও ড্রয়েডকোডার

9

দেরীতে উত্তর, কিন্তু, এটিই আমার পক্ষে কাজ করেছিল, যা অন্যরা বলেছে তার থেকে কিছুটা আলাদা।

আপনি cancelableসম্পত্তিটিকে মিথ্যা হিসাবে সেট করার চেষ্টা করতে পারেন, যেমন

setCancelable(false);

এবং তারপরে ইভেন্টগুলিতে ম্যানুয়ালি হ্যান্ডেল করুন যেখানে আপনি setupDialogপদ্ধতিটিতে ডায়ালগটি খারিজ করতে চান ।

@Override
public void setupDialog(final Dialog dialog, final int style) {

    // handle back button
    dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
        @Override
        public boolean onKey(final DialogInterface dialog, final int keyCode, final KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                dialog.dismiss();
            }
            return true;
        }
    });

    // handle touching outside of the dialog
    final View touchOutsideView = getDialog().getWindow().getDecorView().findViewById(android.support.design.R.id.touch_outside);
    touchOutsideView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(final View view) {
            dialog.dismiss();
        }
    });
}

এটি ডায়ালগ খণ্ডের ভিতরে একটি তালিকাভিউর সাথে কাজ করে, যেখানে আমি অন্যান্য সমাধানগুলির সাথে কিছুটা আটকে যাচ্ছিলাম।


সুন্দর সংক্ষিপ্ত সমাধান। এটি পড়ার যে কারও কাছে, আপনি (সম্ভবত) ডায়ালগটি খারিজ করার আগে event.isCanceled()এবং এর event.getAction() == MotionEvent.ACTION_UPআগে অতিরিক্ত চেক চাইবেন - এটি ভুল ক্লিকগুলিকে বরখাস্তকে গুলি চালানো থেকে বিরত করবে।
এরিক বাচ্চুবার

এর জন্য ধন্যবাদ. এটি টেনে আনতে অক্ষম করার সহজতম সমাধান।
এভিজে

7

গৃহীত উত্তরটি আমার ব্যবহৃত প্রথম পরীক্ষার ডিভাইসে কাজ করে না। এবং ফিরে বাউন মসৃণ হয় না। কোনও ব্যবহারকারী টানাটানি প্রকাশের পরে কেবল রাজ্যটিকে STATE_EXPANDED এ সেট করা ভাল বলে মনে হয়। নিম্নলিখিতটি আমার সংস্করণ:

    final BottomSheetBehavior behavior = BottomSheetBehavior.from(findViewById(R.id.bottomSheet));
    behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
        @Override
        public void onStateChanged(@NonNull View bottomSheet, int newState) {
            if (newState > BottomSheetBehavior.STATE_DRAGGING)
                bottomSheet.post(new Runnable() {
                    @Override public void run() {
                        behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
                    }
                });
        }

        @Override
        public void onSlide(@NonNull View bottomSheet, float slideOffset) {
        }
    });

4
আপনি যা চান তা না হলে চালানোতে ফেলে দেওয়ার সমস্যাটি আমাকে বলি। আপনি এটিকে একটি বোতাম দিয়ে বরখাস্ত করতে পারবেন না কারণ, খারিজ করার জন্য এটি টেনে আনতে হবে। এবং, এটি সর্বদা টেনে আনার প্রতিক্রিয়া জানাবে, কেবল এটি ব্যবহারকারীকে বরখাস্ত করতে টেনে আনতে বাধা দিতে পারে
টোনস্পি

7

এই কোডটি বটমশিট বিহাইভিয়ার অবজেক্টে যুক্ত করুন। টেনে আনতে অক্ষম করা হবে। আমার জন্য ভাল কাজ করে।

final BottomSheetBehavior behavior = BottomSheetBehavior.from((View) view.getParent());
    behavior.setHideable(false);
    behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {

      @Override
      public void onStateChanged(@NonNull View bottomSheet, int newState) {
        if (newState == BottomSheetBehavior.STATE_DRAGGING) {
          behavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
        }

      }
      @Override
      public void onSlide(@NonNull View bottomSheet, float slideOffset) {

      }
});

4
এটি সোয়াইপিং অক্ষম করে না। এটি নীচে শীটটি পুরোপুরি ধসে পড়ে।
অ্যাডাম হুরউইটজ

7

প্রত্যাশিত আচরণ:

  • বটমশিটটি ড্র্যাগ-ডাউন-এ বন্ধ হয় না
  • ডায়ালগ উইন্ডোটির বাইরের দিকে স্পর্শ করা থাকলে নীচের অংশটি বন্ধ হয়ে যায়

কোড:

class MyBottomSheet : BottomSheetDialogFragment () {

   override fun onActivityCreated(savedInstanceState: Bundle?) {
       super.onActivityCreated(savedInstanceState)
       disableBottomSheetDraggableBehavior()
   }

   private fun disableBottomSheetDraggableBehavior() {
      this.isCancelable = false
      this.dialog?.setCanceledOnTouchOutside(true)
   }

 }

কোনও কারণে, আমি বাইরে স্পর্শ করে ডায়ালগটি বন্ধ করতে পারি না, তবে এটি
টানাটি

5

বটমশিটটি লক করতে এবং ব্যবহারকারীর এটিকে সোয়াইপ করতে এড়াতে আমি এটাই করেছি

public void showBottomSheet() {
    bsb.setHideable(false);
    bsb.setState(BottomSheetBehavior.STATE_EXPANDED);
}

public void hideBottomSheet() {
    bsb.setHideable(true);
    bsb.setState(BottomSheetBehavior.STATE_COLLAPSED);
}

এটি আমার পক্ষে বেশ ভাল কাজ করে।


এই সমাধানটি আবেদনকরছিল তবে উদ্ভট কারণে নীচের পরিবর্তে নীচের পাতটি পর্দার শীর্ষ থেকে প্রদর্শিত হবে! এটি তবে স্বাভাবিকভাবে অদৃশ্য হয়ে যায়। এটি খুব স্টার ট্রেক।
টুঙ্গা

আমার দৃষ্টি পরিবর্তন এবং পরিবর্তে ব্যবহার করা দরকার BottomSheetBehavior.STATE_HIDDEN। এই ক্ষেত্রে, আপনি কল করতে হবে না setPeekHeight()। এটি অন্যান্য সমাধানগুলির তুলনায় এখানে অনেক কম জটিল।
হলি সামোসা

5

লক টেনে আনার সহজ উপায়টি হ'ল উচ্চতার সমান সেট পিকহাইট। উদাহরণ স্বরূপ:

private LinearLayout bottomSheet;
private BottomSheetBehavior bottomBehavior;

@Override
public void onResume() {
    super.onResume();
    bottomBehavior = BottomSheetBehavior.from((bottomSheet);
    bottomBehavior.setPeekHeight(bottomSheet.getHeight());
    bottomBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
}

5
implementation 'com.google.android.material:material:1.2.0-alpha05'

আপনি বটমশিটটিকে এভাবে টেনে আনতে অক্ষম করতে পারেন।

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

//another code

this.bottomSheetBehavior = BottomSheetBehavior.from(view)
this.bottomSheetBehavior.state = STATE_EXPANDED
this.bottomSheetBehavior.isDraggable = false // disable dragging

//another code
this.bottomSheetbehavior.isDraggable = true //draggable

(কোটলিন), আমি আশা করি এই উত্তরটি আপনার সমস্যার সমাধান করতে পারে।

সম্পাদিত) গ্রন্থাগারটি আপডেট হয়েছিল! আপনি নতুন লাইব্রেরি সংস্করণ ব্যবহার করতে পারেন

implementation 'com.google.android.material:material:1.2.1'

উদাহরণগুলি হ'ল শুভকামনা এবং ভাল কোড


4
এই আলফা সংস্করণ ক্রেজি আচরণ করে। আমি প্রস্তাব দিচ্ছি না :(
অ্যাডাম স্টায়ার্ক

4

বটমশিটডায়ালগফ্রেগমেন্ট সহ একটি নমুনা। এটি পুরোপুরি কাজ করে।

09/04/2020 সম্পাদনা করুন: প্রতিস্থাপনের setBottomSheetCallback()সাথে প্রতিস্থাপিতaddBottomSheetCallback()

class FragMenuBDrawer : BottomSheetDialogFragment() {

    ...

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog

        dialog.setOnShowListener {
            val bottomSheet = (it as BottomSheetDialog).findViewById<View>(com.google.android.material.R.id.design_bottom_sheet) as FrameLayout?
            val behavior = BottomSheetBehavior.from(bottomSheet!!)
            behavior.state = BottomSheetBehavior.STATE_EXPANDED

            behavior.addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() {
                override fun onStateChanged(bottomSheet: View, newState: Int) {
                    if (newState == BottomSheetBehavior.STATE_DRAGGING) {
                        behavior.state = BottomSheetBehavior.STATE_EXPANDED
                    }
                }

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

        // Do something with your dialog like setContentView() or whatever
        return dialog
    }

    ...
}

3

নীচের শীটটি অক্ষম করা অবস্থায় আপনাকে সমস্ত ইভেন্টগুলি ব্লক করার দরকার নেই। আপনি কেবল ACTION_MOVE ইভেন্ট অবরুদ্ধ করতে পারবেন। এজন্য কাস্টম নীচে শীট আচরণটি ব্যবহার করুন

public class BottomSheetBehaviorWithDisabledState<V extends View> extends BottomSheetBehavior<V> {
    private boolean enable = true;

    /**
     * Default constructor for instantiating BottomSheetBehaviors.
     */
    public BottomSheetBehaviorWithDisabledState() {
        super();
    }

    /**
     * Default constructor for inflating BottomSheetBehaviors from layout.
     *
     * @param context The {@link Context}.
     * @param attrs   The {@link AttributeSet}.
     */
    public BottomSheetBehaviorWithDisabledState(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setEnable(boolean enable){
        this.enable = enable;
    }

    @Override
    public boolean onInterceptTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) {
        if (!enable && event.getAction() == MotionEvent.ACTION_MOVE){
            return false;
        }
        return super.onInterceptTouchEvent(parent, child, event);
    }
}

আপনি এই ক্লাসটি কীভাবে ব্যবহার করবেন? আমি একটি অবৈধ অরগমেন্ট ধারণাটি পেয়ে যাচ্ছি: ভিউটি
বটমশিট

3

এখানে কোটলিনের শীর্ষ সমাধানের একটি কার্যকারী সংস্করণ:

import android.support.design.widget.BottomSheetBehavior
import android.support.design.widget.CoordinatorLayout
import android.view.MotionEvent
import android.view.View

class CustomBottomSheetBehavior<V : View> : BottomSheetBehavior<V>() {

    @Suppress("UNCHECKED_CAST")
    companion object {
        fun <V : View> from(view: V): CustomBottomSheetBehavior<V> {
            val params = view.layoutParams as? CoordinatorLayout.LayoutParams ?:
                throw IllegalArgumentException("The view is not a child of CoordinatorLayout")
                params.behavior as? BottomSheetBehavior<V> ?:
                    throw IllegalArgumentException("The view is not associated with BottomSheetBehavior")
                params.behavior = CustomBottomSheetBehavior<V>()
            return params.behavior as CustomBottomSheetBehavior<V>
        }
    }

    override fun onInterceptTouchEvent(parent: CoordinatorLayout, child: V, event: MotionEvent): Boolean {
        return false
    }

    override fun onTouchEvent(parent: CoordinatorLayout, child: V, event: MotionEvent): Boolean {
        return false
    }

    override fun onStartNestedScroll(coordinatorLayout: CoordinatorLayout, child: V, directTargetChild: View, target: View, axes: Int, type: Int): Boolean {
        return false
    }

    override fun onNestedPreScroll(coordinatorLayout: CoordinatorLayout, child: V, target: View, dx: Int, dy: Int, consumed: IntArray, type: Int) {}

    override fun onStopNestedScroll(coordinatorLayout: CoordinatorLayout, child: V, target: View, type: Int) {}

    override fun onNestedPreFling(coordinatorLayout: CoordinatorLayout, child: V, target: View, velocityX: Float, velocityY: Float): Boolean {
        return false
    }
}

তারপরে আপনি যখনই ব্যবহার করতে চান:

val bottomSheetBehavior by lazy {
    CustomBottomSheetBehavior.from(bottom_sheet_main)
}

bottom_sheet_mainব্যবহার প্রকৃত দৃশ্য Kotlin অ্যান্ড্রয়েড এক্সটেনশানগুলি


3

ক্লিকলিস্ট অন্ট করতে নীচে শীট সেট করুন।

bottomSheet.setOnClickListener(null);

এই লাইনটি কেবল নীচে শীট সম্পর্কিত সমস্ত ক্রিয়া অক্ষম করে এবং অভ্যন্তরীণ দৃশ্যে প্রভাবিত করে না।


4
নীচে শীটটি বন্ধ করার চেষ্টা করা হ'ল এটি অপ্রত্যাশিত অ্যানিমেশন সৃষ্টি করে।
অ্যাডাম হুরউইটজ

2

আমি আশ্চর্য সমাধান খুঁজে পেয়েছি। প্রাথমিক সমস্যাটি ছিল একবার নীচে শীটটি HIDDEN অবস্থায় যাচ্ছিল তখন এটি নীচে শীটডায়ালগ.শো () এ প্রদর্শিত হচ্ছে না। তবে আমি শো () পদ্ধতিতে ডায়লগটি দৃশ্যমান করতে চেয়েছিলাম এবং এটির নীচে চেপে চেপে চেপে চেপে থাকার মতো ব্যবহারকারীটিকে সক্ষম করতেও চেয়েছিলাম। নীচে আমি যা করেছি ..

    BottomSheetDialog itemTypeDialog = new BottomSheetDialog(this);
    View bottomSheetView = getLayoutInflater().inflate(R.layout.dialog_bottomsheet, null);
    itemTypeDialog.setContentView(bottomSheetView);
    BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from((View) bottomSheetView.getParent());
    bottomSheetBehavior.setBottomSheetCallback(bottomSheetCallback); // You can also attach the listener here itself.

    BottomSheetBehavior.BottomSheetCallback bottomSheetCallback =  new BottomSheetBehavior.BottomSheetCallback() {
    @Override
    public void onStateChanged(@NonNull View bottomSheet, int newState) {
        Log.d(TAG, "BottomSheetCallback: " + newState);
        if (newState == BottomSheetBehavior.STATE_HIDDEN) {
            bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
            itemTypeDialog.dismiss();
        } 
    }

    @Override
    public void onSlide(@NonNull View bottomSheet, float slideOffset) {

    }
};

এটি একটি সঠিক উত্তর
বিবেক কুমার শ্রীবাস্তব

2
  1. BottomSheetDialogআপনার প্রকল্পে অনুলিপি করুন এবং নাম পরিবর্তন করুনMyBottomSheetDialog
  2. যোগ getBottomSheetBehaviorকরুনMyBottomSheetDialog
  3. MyBottomSheetDialogপরিবর্তে ব্যবহার করুনBottomSheetDialog
  4. ডাউনশীটবিহিয়োয়ার.সেটবোটমশিটক্যালব্যাক

এই মত কোড

public class MyBottomSheetDialog extends AppCompatDialog {

    // some code

    public BottomSheetBehavior<FrameLayout> getBottomSheetBehavior() {
        return mBehavior;
    }

    // more code

আপনার কোডে

    final BottomSheetBehavior<FrameLayout> bottomSheetBehavior = myBottomSheetDialog.getBottomSheetBehavior();
    bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
        @Override
        public void onStateChanged(@NonNull View bottomSheet, int newState) {
            if (newState == BottomSheetBehavior.STATE_DRAGGING) {
                bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
            }
        }

        @Override
        public void onSlide(@NonNull View bottomSheet, float slideOffset) {

        }

2

এটি মূলত শীর্ষে সঠিক উত্তরের কোটলিন সংস্করণ:

    class LockedBottomSheetBehavior<V : View>(context: Context, attrs: AttributeSet) :
        BottomSheetBehavior<V>(context, attrs) {

    companion object {
        fun <V : View> from(view: V): LockedBottomSheetBehavior<*> {
            val params = view.layoutParams as? CoordinatorLayout.LayoutParams
                    ?: throw IllegalArgumentException("The view is not a child of CoordinatorLayout")
            return params.behavior as? LockedBottomSheetBehavior<*>
                    ?: throw IllegalArgumentException(
                            "The view is not associated with BottomSheetBehavior")
        }
    }

    override fun onInterceptTouchEvent(
            parent: CoordinatorLayout,
            child: V, event: MotionEvent
    ) = false

    override fun onTouchEvent(
            parent: CoordinatorLayout,
            child: V,
            event: MotionEvent
    ) = false

    override fun onStartNestedScroll(
            coordinatorLayout: CoordinatorLayout,
            child: V,
            directTargetChild: View,
            target: View,
            axes: Int,
            type: Int) = false

    override fun onNestedPreScroll(
            coordinatorLayout: CoordinatorLayout,
            child: V,
            target: View,
            dx: Int,
            dy: Int,
            consumed: IntArray,
            type: Int) {
    }

    override fun onStopNestedScroll(
            coordinatorLayout: CoordinatorLayout,
            child: V,
            target: View,
            type: Int) {
    }

    override fun onNestedPreFling(
            coordinatorLayout: CoordinatorLayout,
            child: V,
            target: View,
            velocityX: Float,
            velocityY: Float
    ) = false
}

আপনি এই ক্লাসটি কীভাবে ব্যবহার করবেন? আমি একটি অবৈধআর্গুমেন্টএকসেপশন পাচ্ছি: ভিউটি
বটমশীট

4
অ্যাপ্লিকেশন: লেআউট_বেহেভিয়ার = "ইউজারলকবটমশীট বিহেভিয়ার"> এক্সএমএল এবং তারপরে কোডে আপনি নিম্নলিখিতটি করছেন। // নীচের শীটটি দেখুন লিনিয়ারলআউট llBottomSheet = (লিনিয়ারলআউট) সন্ধান করুন ভিউবিআইআইডি (আর.আইডি.বোটম_শিট) পান; // আরআরটি নীচের শীট আচরণ নীচটি শীট বিহাইভার নীচটি শীটবিহেভিয়ার = বটমশীট বিহ্যাভিয়ার.ফ্রোম (এলএল বটমশিট);
জামাল

2

এটা চেষ্টা কর.

1) নীচে শীট তৈরি করুন এবং আপনার জাভা ক্লাসে মত ভেরিয়েবল ঘোষণা করুন

private BottomSheetBehavior sheetBehavior;

2) sheetBehavior = BottomSheetBehavior.from(bottomSheet);

3) নীচের শীট কলব্যাক ফাংশনে নিম্নলিখিত লাইনগুলি যুক্ত করুন।

sheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
            @Override
            public void onStateChanged(@NonNull View bottomSheet, int newState) {
                switch (newState) {
                    case BottomSheetBehavior.STATE_HIDDEN:
                        Log.d(TAG, "--------------  STATE_HIDDEN");
                        break;
                    case BottomSheetBehavior.STATE_EXPANDED: {
                        Log.d(TAG, "--------------  STATE_EXPANDED");
                    }
                    break;
                    case BottomSheetBehavior.STATE_COLLAPSED: {
                        Log.d(TAG, "--------------  STATE_COLLAPSED");
                    }
                    break;
                    case BottomSheetBehavior.STATE_DRAGGING:
                        sheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
                        break;
                    case BottomSheetBehavior.STATE_SETTLING:
                        Log.d(TAG, "--------------  STATE_SETTLING");
                        break;
                }
            }

            @Override
            public void onSlide(@NonNull View bottomSheet, float slideOffset) {

            }
        });

2

সঙ্গে 'com.google.android.material:material:1.2.0-alpha06'

NestedScrollViewএবং সঙ্গে দুর্দান্ত কাজ করেRecyclerView

উদাহরণ কোড:

    LinearLayout contentLayout = findViewById(R.id.contentLayout);
    sheetBehavior = BottomSheetBehavior.from(contentLayout);
    sheetBehavior.setDraggable(false);

2

শুধু ব্যবহার

bottomSheetBehavior.isDraggable = false

বা

bottomSheetBehavior.setDraggable(false)

1

প্রথমে, আমি আপনারা যারা উত্তর দেওয়ার চেষ্টা করেছিলেন তাদের সবাইকে ধন্যবাদ জানাতে চাই। আমি চাই হিসাবে এই সমস্যাটি সমাধান করে এই উত্তরটি লিখছি। আমি এখানে থেকে সহায়তা নিয়ে কীভাবে ধাপে ধাপে এটি করব তা বর্ণনা করতে যাচ্ছি।

ভিজ্যুয়ালাইজেশন: বোতামটি ক্লিক করার পরে Show BottomSheetআপনি দ্বিতীয় স্ক্রিনটি দেখতে পাবেন । এখন আপনি দেখতে পাবেন যে বটমশিটটি কেবল টেনে আনার জন্য লক করা আছে । তবে আপনি যদি কান্ট্রি লিস্টে ক্লিক করেন তবে নীচের অংশটি লুকিয়ে থাকবে। এই বিবরণটি এখন কোডটি খনন করি।

  • প্রথমে, আপনার বিল্ড.gradle ফাইলটিতে নকশা সমর্থন লাইব্রেরি যুক্ত করুন:

    বাস্তবায়ন 'com.android.support:design:28.0.0'

  • ইউজারলকবটমশীটবিভাভিয়ার.জভা : ক্রেডিট: জেমস ডেভিস (ধন্যবাদ ম্যান)

public class UserLockBottomSheetBehavior<V extends View> extends BottomSheetBehavior<V> {

    public UserLockBottomSheetBehavior() {
        super();
    }

    public UserLockBottomSheetBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onInterceptTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) {
        return false;
    }

    @Override
    public boolean onTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) {
        return false;
    }

    @Override
    public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, V child, View directTargetChild, View target, int nestedScrollAxes) {
        return false;
    }

    @Override
    public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, V child, View target, int dx, int dy, int[] consumed) {
    }

    @Override
    public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, V child, View target) {
    }

    @Override
    public boolean onNestedPreFling(CoordinatorLayout coordinatorLayout, V child, View target, float velocityX, float velocityY) {
        return false;
    }

}
  • bottomsheet.xML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/bottomSheet"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_vertical"
    android:orientation="vertical"
    app:behavior_hideable="true"
    app:layout_behavior="com.samsolution.custombottomsheet.UserLockBottomSheetBehavior">

 <RelativeLayout
     android:id="@+id/minimizeLayout"
     android:background="@color/colorPrimary"
     android:layout_width="match_parent"
     android:layout_height="?android:attr/actionBarSize">

     <TextView
         android:layout_centerHorizontal="true"
         android:padding="16dp"
         android:layout_width="wrap_content"
         android:layout_height="?android:attr/actionBarSize"
         android:gravity="center_horizontal|center"
         android:text="Country List"
         android:textColor="#FFFFFF"
         android:textStyle="bold" />
 </RelativeLayout>

    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ListView
            android:id="@+id/homeCountryList"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </android.support.v7.widget.CardView>

</LinearLayout>
  • কার্যকলাপ_মাইন.এক্সএমএল
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFF"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_gravity="center"
        android:onClick="showCountryListFromBottomSheet">

        <Button
            android:layout_gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@android:color/holo_red_light"
            android:onClick="showCountryListFromBottomSheet"
            android:padding="16dp"
            android:text="Show BottomSheet"
            android:textAllCaps="false"
            android:textColor="#ffffff" />

    </LinearLayout>

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

</android.support.design.widget.CoordinatorLayout>
  • মেইনএ্যাকটিভিটি.জভা
public class MainActivity extends AppCompatActivity {

    private BottomSheetBehavior<LinearLayout> bottomSheetBehavior;                                  // BottomSheet Instance
    LinearLayout bottomsheetlayout;
    String[] list = {"A", "B", "C", "D", "A", "B", "C", "D","A", "B", "C", "D","A", "B", "C", "D","A", "B", "C", "D"};

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

        bottomsheetlayout = findViewById(R.id.bottomSheet);
        bottomSheetBehavior = BottomSheetBehavior.from(bottomsheetlayout);

        ListView listView = findViewById(R.id.homeCountryList);
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,list);
        listView.setAdapter(adapter);

        bottomSheetHide();                                                                          //BottomSheet get hide first time

        RelativeLayout minimizeLayoutIV;                                                            // It will hide the bottomSheet Layout
        minimizeLayoutIV = findViewById(R.id.minimizeLayout);
        minimizeLayoutIV.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               bottomSheetHide();
            }
        });
    }

    public void showCountryListFromBottomSheet(View view) {
        bottomSheetBehavior.setHideable(false);
        bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
    }

    public void bottomSheetHide(){
        bottomSheetBehavior.setHideable(true);
        bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
    }
}

প্রথম স্ক্রিন দ্বিতীয় পর্দা


1

গৃহীত উত্তরের সমাধানটি বেশিরভাগ ক্ষেত্রে আমার পক্ষে কাজ করেছিল, তবে একটি ইস্যু নিয়ে: নীচের শীটের দৃশ্যের পিছনে থাকা ভিউগুলি, স্পর্শ ইভেন্টগুলিতে প্রতিক্রিয়া দেখাতে শুরু করেছে, যদি স্পর্শ ইভেন্টটি নীচের শীটের অংশে ঘটে থাকে, যা শিশুদের দৃষ্টিভঙ্গি মুক্ত। অন্য কথায়, আপনি নীচের চিত্রটিতে দেখতে পাচ্ছেন, যখন ব্যবহারকারী নীচের শীটের অভ্যন্তরে আঙুলটি স্লাইড করে, তখন মানচিত্র এটিতে প্রতিক্রিয়া দেখাতে শুরু করে।

নীচে শীট স্পর্শ অঞ্চল

সমস্যা সমাধানের জন্য, আমি নীচে শীট ভিউতে onInterceptTouchEventসেট touchListenerকরে পদ্ধতিটি পরিবর্তন করেছি (কোডের বাকী অংশ গ্রহণিত সমাধানের মতো থাকবে)।

override fun onInterceptTouchEvent(
        parent: CoordinatorLayout,
        child: V, event: MotionEvent
    ): Boolean {
        child.setOnTouchListener { v, event ->
            true
        }
        return false
    }

1

আমি একই সমস্যা আছে BottomSheetDialogFragmentএবং ব্যবহার করে অনেকগুলি সমাধান প্রয়োগ behaviorএর dialogকিন্তু যারা তাদের কেউই আমার সমস্যা সমাধানের এবং তারপর আমি এটা কিন্তু সেটিং মীমাংসিত setCancelable(false);আরম্ভের সময় dialog

DialogEndRide dialogCompleteRide = new DialogEndRide();
dialogCompleteRide.setCancelable(false);
dialogCompleteRide.show(getChildFragmentManager(), "");

এটি অঙ্গভঙ্গিটি অক্ষম করবে BottomSheetDialogFragmentএবং আপনি ফাংশন dialogব্যবহার করে প্রোগ্রামগতভাবে বরখাস্ত করতে পারেন dismiss();



0

peakHeightমানটি সামঞ্জস্য করা আমার পক্ষে কাজ করেছিল।

আমি বটমশীটের উচ্চতা হিসাবে এটি প্রসারিত হলে উচ্চতা নির্ধারণ করেছি।

    private val bottomSheetCallback = object : BottomSheetBehavior.BottomSheetCallback() {
    override fun onSlide(bottomSheet: View, slideOffset: Float) {

    }

    override fun onStateChanged(bottomSheet: View, newState: Int) {
        if (newState == BottomSheetBehavior.STATE_EXPANDED)
            bottomSheetBehavior.peekHeight = bottomSheet.height
    }
}

4
এটি আদর্শ নয় কারণ এটি অপ্রত্যাশিত অ্যানিমেশনগুলির কারণ হতে পারে।
অ্যাডাম হুরউইটজ

আমার ক্ষেত্রে. এটি মোটেও কোনও অ্যানিমেশন সমস্যার কারণ ঘটেনি। কার্ড প্রসারিত হওয়ার পরে এটি কেবল স্থানান্তরিত হবে না। এটি আদর্শ নয় তবে এটি প্রত্যাশার মতো কাজ করেছে!
pz64_

আকর্ষণীয়, এটি ক্ষেত্রে হতে পারে। আমি নীচের শীটটি খোলা থাকাকালীন কলসিংটুলবারআউটআউটটির সরঞ্জামদণ্ডটি অদৃশ্য বা চলে গিয়েছে সেটি অপ্রত্যাশিতভাবে বন্ধ করে আমার সমস্যাটি সমাধান করেছি closing টুলবারের সাথে সম্পর্কিত একটি স্পর্শ কথোপকথনটি নীচে থাকা সত্ত্বেও নীচের দিকে শীটটি অপ্রত্যাশিতভাবে বন্ধ করে দিচ্ছে। বিষয়টি এখন ঠিক হয়ে গেছে।
অ্যাডাম হুরউইটজ

0
    LayoutInflater inflater = LayoutInflater.from(context);
            View view = inflater.inflate(R.layout.bottomsheet_view_profile_image, null);
            BottomSheetDialog dialog = new BottomSheetDialog(context);
            dialog.setContentView(view);
            dialog.setCancelable(false);


            BottomSheetBehavior behavior = BottomSheetBehavior
                    .from(((View) view.getParent()));
            behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
                @Override
                public void onStateChanged(@NonNull View bottomSheet, int newState) {
                    if (newState == BottomSheetBehavior.STATE_DRAGGING) {
                        behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
                    }
                }

                @Override
                public void onSlide(@NonNull View bottomSheet, float slideOffset) {
                }
            });
            behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
            behavior.setSkipCollapsed(true);
            dialog.show();

0

গুগলে এটি প্রথম ফলাফল তাই আমি সাধারণ সমাধানটি এখানে রাখার একমাত্র ন্যায্য বিশ্বাস করি:

   private fun disableDragToDismiss() {
    if (dialog is BottomSheetDialog) {
        val bsDialog = dialog as BottomSheetDialog
        bsDialog.behavior.isHideable = false
    } else {
        Log.d(TAG, " BottomSheetDialog with dialog that is not BottomSheetDialog")
    }
}

এবং মাত্র থেকে এটা কল চেয়ে onCreateView()মধ্যে BottomSheetDialogFragmentবাস্তবায়ন


-1

আমার একই সমস্যা ছিল, আমি কোড দ্বারা এটি সমাধান করেছি। এটি ব্যবহারকারীর বোতল শীট টেনে আনতে দেয় না। আপনার প্রোগ্রামটিমেটিকভাবে রাষ্ট্র পরিচালনা করতে হবে।

 mBottomSheetBehavior.isDraggable = false

-2

সহজভাবে ব্যবহার করুন: bottomSheet.dismissOnDraggingDownSheet = false

মেটিরিয়াল.আইও ওয়েবসাইট থেকে অনুলিপি করা হয়েছে:

let viewController: ViewController = ViewController() let bottomSheet: MDCBottomSheetController = MDCBottomSheetController(contentViewController: viewController)

// **** এই লাইনটি নীচে পত্রকে টেনে নামিয়ে দিতে বাধা দেয় ****

bottomSheet.dismissOnDraggingDownSheet = false

present(bottomSheet, animated: true, completion: nil)


এটি আইওএসের জন্য এখানে অ্যান্ড্রয়েড নয়
ব্যাক প্যাকার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.