Android में Custom Collapsable Toolbar को कैसे लागू करें?


80

इस ट्यूटोरियल का उपयोग करके एक लचीली स्पेस पैटर्न को लागू करना (एक टूलबार के ढहने के साथ)।

मैं लॉलीपॉप संपर्क गतिविधि में एक समान प्रभाव प्राप्त करने की कोशिश कर रहा हूं , जो गतिविधि में प्रवेश करते समय शुरुआत में, दृश्य केवल छवि हेडर का हिस्सा होता है:

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

तब, उपयोगकर्ता इसे और अधिक प्रकट करने के लिए छवि के नीचे लेआउट को स्क्रॉल कर सकता है, जब तक कि यह अधिकतम तक नहीं पहुंचता:

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

मेरे ऐप में, मैं इसे काम करने के लिए प्रबंधित नहीं कर सकता।

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

यह वह कोड है जो AppBarLayout की ऊंचाई निर्धारित करता है (मैं चाहता हूं कि स्क्रीन की चौड़ाई अधिकतम ऊंचाई हो):

int widthPx = getResources().getDisplayMetrics().widthPixels;
AppBarLayout appbar = (AppBarLayout)findViewById(R.id.appbar);
appbar.setLayoutParams(new CoordinatorLayout.LayoutParams(CoordinatorLayout.LayoutParams.MATCH_PARENT, widthPx));

और यह वह कोड है जो RecyclerView सेट करता है। स्क्रॉलटूपन का उपयोग करने की कोशिश की, सोचा कि यह RecyclerView का दृश्य ऊपर उठाएगा, लेकिन इसका कोई प्रभाव नहीं है:

mRecyclerView = (RecyclerView) findViewById(R.id.activity_profile_bottom_recyclerview);

    mRecyclerView.setHasFixedSize(true);

    // use a linear layout manager
    mLayoutManager = new LinearLayoutManager(this);

    mRecyclerView.setLayoutManager(mLayoutManager);

    // specify an adapter (see also next example)
    if(mAdapter == null){
        mAdapter = new ProfileAdapter(this, user, inEditMode);
        mRecyclerView.setAdapter(mAdapter);
    }

    mRecyclerView.scrollToPosition(mAdapter.getItemCount() - 1); // itemCount is 4

यह लेआउट xml है:

<android.support.v4.widget.DrawerLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_profile"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">

<android.support.design.widget.CoordinatorLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">
    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="0dp" // set programatically
        android:fitsSystemWindows="true"
        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"
            android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"
            app:expandedTitleMarginBottom="32dp"
            app:expandedTitleMarginEnd="64dp"
            app:expandedTitleMarginStart="48dp"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">
            <ImageView
                android:id="@+id/header"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@drawable/header"
                android:fitsSystemWindows="true"
                android:scaleType="centerCrop"
                app:layout_collapseMode="parallax" />
            <android.support.v7.widget.Toolbar
                android:id="@+id/anim_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.v7.widget.RecyclerView
        android:id="@+id/activity_profile_bottom_recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

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

    <include layout="@layout/navigation_view"/>
</android.support.v4.widget.DrawerLayout>

नोट: यदि मैं मैन्युअल रूप से स्क्रॉल करता हूं, तो RecyclerView नीचे जाता है और छवि का अधिक खुलासा करता है, यह कोड के माध्यम से काम नहीं करेगा।

मुझे लगता है कि scrollToPosition कोई समाधान नहीं है, क्या किसी के पास कोई विचार है?

EnterAlwaysCollapsed फ्लैग का उपयोग करने के बारे में सोचा, जैसा कि यहां उल्लेख किया गया है कि समन्वयक लयआउट और मिनहाइट के साथ Appbar अनुभाग में हैं:

enterAlwaysCollapsed: जब आपके दृश्य ने एक मिनीहाइट घोषित किया है और आप इस ध्वज का उपयोग करते हैं, तो आपका दृश्य केवल अपनी न्यूनतम ऊंचाई (यानी, 'ढह गया') में प्रवेश करेगा, केवल स्क्रॉल-पूर्ण दृश्य के अपने शीर्ष पर पहुंचने पर इसकी पूरी ऊंचाई तक पुन: विस्तारित हो जाएगा।

तो, मैं स्क्रॉल सेट करता हूं। मेरे RecyclerView में मेरे टूलबार और मिनीहाइट में enterAlwaysCollapsed झंडा, जो काम नहीं करता था। तब मैंने AppHarLayout जैसे अन्य लेआउट के लिए मिनीहाइट को स्थानांतरित करने की कोशिश की, कुछ भी काम नहीं किया। यह सिर्फ पूरे दृश्य के बिना कभी-कभी छवि को सिकोड़ देता है।



2
धन्यवाद @karaokyo, यह वास्तव में काम किया। फिर भी यह पता लगाने की कोशिश की जा रही है कि क्या अन्य समाधान भी हैं।
23

@karaokyo आप कृपया इसे देख सकते हैं? stackoverflow.com/questions/33069081/…
Jjang


मैं इस सामान को करने के लिए MotionLayout का उपयोग करूंगा। उदाहरण देखें https://github.com/android/views-widgets-samples/tree/master/ConstraintLayoutExamples
Lin Lin

जवाबों:


1

AppBarComponentएक विधि कहा जाता है प्रदान करता है .setExpanded(boolean expanded), जो आप अपने विस्तार करने के लिए अनुमति देता है AppBarComponent

लेकिन ध्यान रखें, यह तरीका इस लेआउट पर निर्भर करता है कि यह एक सीधा बच्चा है CoordinatorLayout

आप पढ़ सकते हैं इस बारे में अधिक जानकारी के लिए।

यदि आप एक कस्टम ऑफ़सेट को चेतन करना चाहते हैं, तो setTopAndBottomOffset(int)विधि का उपयोग करके देखें ।

CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBar.getLayoutParams();
final AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
if (behavior != null) {
    ValueAnimator valueAnimator = ValueAnimator.ofInt();
    valueAnimator.setInterpolator(new DecelerateInterpolator());
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            behavior.setTopAndBottomOffset((Integer) animation.getAnimatedValue());
            appBar.requestLayout();
        }
    });
    valueAnimator.setIntValues(0, -900);
    valueAnimator.setDuration(400);
    valueAnimator.start();
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.