গুগল ম্যাপের নীচের শিটের 3 টি পর্যায়ক্রমে আচরণ কীভাবে অনুকরণ করা যায়?


110

পটভূমি

আমাকে এমন একটি ইউআই তৈরি করার জন্য নিয়োগ দেওয়া হয়েছে যা গুগল ম্যাপস যেমন একটি ফলাফলের জন্য নীচের শিটটি দেখায় তার অনুরূপ আচরণ করে।

এর তিনটি ভিন্ন ধাপ রয়েছে:

  1. নীচের বিষয়বস্তু। উপরের অঞ্চলটি এখনও স্পর্শযোগ্য এবং নীচে কোনও কিছুই স্ক্রোল করবে না
  2. পূর্ণ স্ক্রিনের সামগ্রী, যখন উপরের অঞ্চলে একটি বড় শিরোনাম থাকে।
  3. পূর্ণ স্ক্রিনের সামগ্রী, যখন উপরের অঞ্চলে কেবলমাত্র সরঞ্জামদণ্ড রয়েছে।

আমি গুগল ম্যাপে যা বলছি তা এখানে:

এখানে চিত্র বিবরণ লিখুন

সমস্যাটি

কথাটি হ'ল, নীচের শীটটি এখনও ডিজাইন লাইব্রেরির একটি অংশ নয় (যদিও এটি অনুরোধ করা হয়েছিল, এখানে )।

কেবল তা-ই নয়, ইউআই বেশ জটিল বলে মনে হচ্ছে এবং একাধিক পর্যায়ে সরঞ্জামদণ্ডটি পরিচালনা করা দরকার।

আমি কি চেষ্টা করেছি

নীচের শীটটির জন্য এখানে একটি ভাল (পর্যাপ্ত) লাইব্রেরি পেয়েছি ( এখানে ), এবং উপাদানগুলির নকশার নমুনাগুলিতে প্রদর্শিত একই মতামতগুলি দেখতে তার খণ্ডের নমুনায় কন্টেন্ট যুক্ত করেছি ( এখানে এখানে ) রাখতে হবে, যত্ন নেবে এমন একটি ক্যাপসিংটুলবারলয়আউট পেতে করেছি পর্যায়ক্রমে 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 টি ক্রিয়াকলাপ তৈরি করার এবং তাদের মধ্যে উপাদান স্থানান্তর প্রয়োগ করার চেষ্টা করেছেন? এবং CoordinatorLayout২ য় পর্দায় ব্যবহৃত ?
এসডি

@ এসডি আমি খুব নিশ্চিত যে এটি 2 টি কার্যক্রম নয়, কারণ আপনি স্ক্রোল করতে এবং পর্বগুলির মধ্যে স্যুইচ করতে স্ক্রিনটি স্পর্শ করতে পারেন। এটি আপনাকে পরবর্তী / পূর্ববর্তী ক্রিয়াকলাপে যেতে বাধা দেয় না। কোনও নতুন ক্রিয়াকলাপ খোলার সময়, আমি মনে করি না যে স্ক্রোলিং প্রক্রিয়াটির জন্য একই স্পর্শ ইভেন্টগুলি চালিয়ে যাওয়া সম্ভব। আমি টুকরো টুকরো ব্যবহার করা সম্ভব কিনা তাও নিশ্চিত নই, তবে ক্রিয়াকলাপগুলির চেয়ে এটি সম্ভবত আরও বেশি সম্ভব।
অ্যান্ড্রয়েড বিকাশকারী

তারপরে আমি মনে করি যে সমস্ত দর্শন একটি নির্দিষ্ট আচরণ রয়েছে এবং এর সাথে একটি নির্দিষ্ট বিন্যাসে রয়েছে । এবং সমস্ত আচরণগুলি রুট বিন্যাসে উল্লম্ব স্ক্রোল বাধা থেকে ট্রিগার করা হচ্ছে যা সবকিছুকে সমন্বিত করে।
এসডি

@ এসডি আপনি কীভাবে এটি কার্যকরভাবে তৈরি করবেন জানেন? আমি যা খুঁজে পেয়েছি তার চেয়ে ভাল?
অ্যান্ড্রয়েড বিকাশকারী

1
আমি মনে করি আপনার এই লাইব্রেরিটি একবার দেখে নেওয়া উচিত ।
সাভেলি জাগুরস্কি

উত্তর:


18

বিঃদ্রঃ : নীচে সম্পাদনাগুলি পড়ুন


ঠিক আছে, আমি এটি করার একটি উপায় খুঁজে পেয়েছি, তবে আমাকে একাধিক ক্লাসের কোডটি পরিবর্তন করতে হয়েছিল, যাতে নীচের শীটটি অ্যাপবারিয়ালআউট (প্রসারিত বা না) এর অবস্থা জানতে পারে এবং স্ক্রোল-আপটিকে এড়ানোতে উপেক্ষা করতে পারে would প্রসারিত নয়:

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;
        }
    };

অ্যাপবারলআউটটি সেট করতে ফাংশন যুক্ত করা হয়েছে:

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

অনক্রেটভিউ () - এটি যুক্ত করেছে:

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

আমি এই ফাংশনটিও যুক্ত করেছি:

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

ক্রিয়াকলাপটি এইভাবে অ্যাপবারলআউট সম্পর্কে খণ্ডকে জানায়:

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

প্রকল্পটি এখন গিটহাবে পাওয়া যাচ্ছে:

https://github.com/AndroidDeveloperLB/ThreePhasesBottomSheet

আমি আশা করি এটিতে কোনও বাগ নেই।


দুঃখের সাথে সমাধানটির বাগ রয়েছে, তাই আমি এই উত্তরটিকে সঠিক হিসাবে চিহ্নিত করব না:

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

যদি কেউ এটির সাথে সহায়তা করতে পারেন তবে দয়া করে করুন।


# 1 ইস্যুটির জন্য, যখন নীচের শীটটি এখনও উঁকি দেওয়া হয়নি তখন আমি অদৃশ্যতার সাথে দৃশ্যমানতা সেট করে একটি সংশোধন করার চেষ্টা করেছি, তবে এটি সর্বদা কার্যকর হয় না, বিশেষত যদি কোনও কীবোর্ড প্রদর্শিত হয়।


# 1 ইস্যুটির জন্য, আমি কীভাবে কেবল এটি "ঠিক করতে" ফ্রেমেগমেন্ট_মি.এক্সএমএল "মুদ্রণ করে কর্ডিনেটর লেআউটটি ব্যবহার করতে চাই তার যে কোনও দৃষ্টিভঙ্গি দিয়ে (আমি ফ্রেমলাইআউট ব্যবহার করেছি), এবং একটি পূর্ণ আকারের ভিউও এতে রেখেছি এটি (আমি কেবল "দেখুন" রেখেছি), যেমন:

<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 
    ...

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


সাম্প্রতিক মাসগুলিতে, গুগল তার নিজস্ব ডাউনশীট ক্লাস প্রকাশ করেছে, তবে আমি এটি পেয়েছি যে এটির অনেকগুলি সমস্যা রয়েছে, তাই আমি এটি চেষ্টা করে দেখতেও পারি না।


তবে এই চিত্রটির কী হবে? ক্লাউড.githubusercontent.com/assets/5357526/11641271/… আমি এই ধরণের চিত্র স্লাইডটি বটমশিটের সাথে বাস্তবায়িত করতে চাই
হার্ডি

@ এইচবিড্রয়েড আমি মনে করি এটি সম্ভব। হতে পারে "অনঅফসেটচ্যাঞ্জড" ফাংশনটির জন্য, এমবটমশীটব্যাকগ্রাউন্ডআইমেজভিউয়ের অনুবাদও পরিবর্তন করবেন? আমার ক্ষেত্রে প্রয়োজনীয়তাটি ছিল প্রথমে 3 টি चरण পরিচালনা করা handle কী রূপান্তর করা যায় এবং কীভাবে করা যায় এবং এখন এটি খুব কাস্টমাইজড এবং আপনার প্রয়োজনের উপর নির্ভর করে depends এটির জন্য প্রচুর বিরক্তিকর গণিতও প্রয়োজন। এটি চেষ্টা করার জন্য তাত্ক্ষণিকভাবে চালিত বৈশিষ্ট্যটি ব্যবহার করার পরামর্শ দিচ্ছি।
অ্যান্ড্রয়েড বিকাশকারী

আমি সমাধানটি সন্ধান করতে পারছি না দয়া করে আমাকে সহায়তা করুন
হার্ডি

@ এইচবিড্রয়েড দুঃখিত, আমি জানি না। সম্ভবত এই অ্যাপ্লিকেশনটি সরানোর চেষ্টা করুন: বিন্যাস_ক্ল্যাপসমোড = "প্যারাল্যাক্স"। ট্রান্সফর্মভিউতে অনুবাদ করার চেষ্টা করুন।
অ্যান্ড্রয়েড বিকাশকারী

2
@ হার্দি আপনি যে সমাধানটি চান তা তৈরি করে শেষ করেছেন? যদি হ্যাঁ এটি ওপেন সোর্স এবং এটি ভাগ করা যায়?
এন জে

15

বড় আপডেট

কারণ একই বিষয় সম্পর্কে 4 বা 5 টির মতো প্রশ্ন ছিল, তবে বিবিধ প্রয়োজনীয়তাগুলি নিয়ে আমি তাদের সকলের উত্তর দেওয়ার চেষ্টা করেছি, কিন্তু একজন বিনীত-প্রশাসক এগুলি মুছে / বন্ধ করে দিয়েছেন, যার ফলে প্রতিটিটির জন্য টিকিট তৈরি করা যায় এবং সেগুলিতে পরিবর্তন করা যায় "অনুলিপি পেস্ট" এড়ান আমি আপনাকে পুরো উত্তরের একটি লিঙ্ক দিতে দেব যেখানে আপনি গুগল ম্যাপের মতো সম্পূর্ণ আচরণ কীভাবে পাবেন সে সম্পর্কে সমস্ত ব্যাখ্যা পেতে পারেন।


আপনার প্রশ্নের উত্তর

গুগল ম্যাপের নীচের শিটের 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.com/AndroidDeveloperLB/ThreePhasesBottomSet ) চিত্রটি ম্লান হয়ে যায় এবং ছোট চিত্রটি এর আকার পরিবর্তন করে এক স্থান থেকে অন্য জায়গায় চলে যায়। আমি তাদের পরিচালনা যেখানে যুক্ত করতে জানতে চাই।
অ্যান্ড্রয়েড বিকাশকারী

হাই, এখানে আমার প্যারালাক্স ইমেজ সহ একটি স্থানীয় সংস্করণ রয়েছে তবে এটি এখনও ভালভাবে কাজ করছে না (আপনি যদি এটি দেখতে চান তবে আমি এটি চাপতে পারি)। আপনি ভিতরে কোন দৃশ্য যোগ করতে পারেন CoordinatorLayoutমধ্যে activity_main.xml। আমি অনুমান করি যে সমন্বয়কারী বিন্যাসের সাথে আপনার ভাল অভিজ্ঞতা আছে, অন্যথায় আমি খুঁজে পাওয়া
MiguelHincapieC

আপনি কীভাবে সরঞ্জামদণ্ডের আচরণ পেয়েছিলেন এবং এটি আমার উপর ব্যবহার করবেন তা দেখতে যাচ্ছি: ডি। উপায় দ্বারা একটি সামান্য আচরণ রয়েছে যা আমি কেবল অনুকরণ করতে পারি যদি আমি সমর্থন লাইব্রেরি ২৩.২ ব্যবহার করি: গুগল মানচিত্রে আপনি যদি চিত্রটি টানেন যে সরঞ্জামদণ্ডের নীচে এটি বোতলোশিটটি সরিয়ে ফেলবে, তবে আপনি যদি ২৩.৪ বা মিনিএসডিকি ভার্সন ১৪++ এ আপগ্রেড করবেন তবে এই আচরণটি হারান o_O '
মিগুয়েলহিনাপিসি

@ অ্যান্ড্রয়েড ডেভেলপার আমি পেয়েছি! এখন এটি চিত্র প্যারাল্যাক্স এফেক্ট এবং টুলবার অ্যানিমেশন সহ কাজ করছে ... আপনি যখন স্লাইডিং করতে
থাকবেন

@ মিগুয়েলহিনাপিসি হাই, আমি কেবলমাত্র প্রধান সরঞ্জামদণ্ডটি প্রদর্শন করতে চাই এবং আমি একীভূত অ্যাপবার লেআউটটি সরিয়ে ফেললাম তবে নীচের শীটে প্রসারিত সময় স্থিতি দণ্ডটি প্রসারিত করতে হবে না এবং স্ট্যাটাস বারের অবস্থানের সাথে প্যারাল্লেক্স চিত্রটি প্রসারিত করতে চাই এবং আমি মূল টুলবারের নীচে স্থির চিত্রটি প্যারাল্লেক্স করতে চাই। আমি কীভাবে এটি করতে পারি তা আপনি ব্যাখ্যা করতে পারেন
বিজয় রাজপুত

0

আপনি কি এই চেষ্টা করেছেন? http://android-developers.blogspot.in/2016/02/android-support-library-232.html?m=1 এখানে এটি বলেছে যে আমরা কেবল নীচের শীটের বিন্যাসের আচরণটি নির্দিষ্ট করতে পারি।

হালনাগাদ:

মূলত লিঙ্কটি জানিয়েছে-

একটি বাচ্চাদের সাথে একটি বটমশিট বিভাটিয়ার সংযুক্ত করে একটি সমন্বয়কারী লেআউটের ভিউ (যেমন, অ্যাপ্লিকেশন: লেআউট_বেহেভিয়ার = "android.support.design.widget.BottomSheetBehavior") সংযুক্ত করে, আপনি স্বয়ংক্রিয়ভাবে পাঁচটি অবস্থার মধ্যে উত্তরণের জন্য উপযুক্ত স্পর্শ সনাক্তকরণ পাবেন:

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  
   }  
 });  

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


গুগল তাদের সমর্থন লাইব্রেরি ক্লাস দেখানোর আগে এই প্রশ্ন করা হয়েছিল। যদি এটির ব্যবহার করে যদি আপনার কোনও কাজের সমাধান হয় তবে দয়া করে এটি এখানে দেখান।
অ্যান্ড্রয়েড বিকাশকারী

@ অ্যান্ড্রয়েড ডেভেলপার আমি প্রশ্নের তারিখটি পড়িনি এবং তাই আমি এই উত্তরটির পরামর্শ দিয়েছি। তবে আপনি যদি এই লাইব্রেরিটি ব্যবহার করতে চান তবে আপনি এটি ব্যবহার করতে পারেন। এই কোডটির কার্যকর সমাধান হিসাবে আমার কাছে এটি নেই। দুঃখিত।
বৈভব শর্মা

0

গুগল ম্যাপে কীভাবে কোনও ফলাফলের ফলাফলের জন্য নীচে-শিট দেখায় তার অনুরূপ একটি দৃশ্য আমাকে বাস্তবায়ন করতে হয়েছিল।

আমার কেমন দেখাচ্ছে তা এখানে:

পিক ভিউ

শীর্ষে স্ক্রোল করা ভিউ প্রসারিত করুন

নীচে স্ক্রোল করা ভিউ প্রসারিত করুন

প্রথমে, আমি শিরোনাম এবং স্ক্রোলযোগ্য সামগ্রী সহ একটি নীচের শীটটি সংজ্ঞায়িত করেছি তবে বিন্যাস_ উচ্চতায় নির্দিষ্টভাবে সুনির্দিষ্ট করেও শিরোনাম বা স্ক্রোলযোগ্য সামগ্রীটি মোড়ানো হবে বলে মনে হচ্ছে না 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"
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.