android NestedScrollView और CollapsingToolbarLayout की स्क्रॉलिंग को अक्षम कैसे करें, उदाहरण के लिए जब नीचे कोई और सामग्री नहीं है?




material-design android-design-library (2)

स्क्रॉलिंग को अक्षम करने के लिए, बस NestedScrollView और इसकी लाइनरलाइट बाल ऊंचाई को 'wrap_content' पर सेट करें।

यह आपकी इच्छा के अनुसार पूरी तरह से काम नहीं करेगा, लेकिन कम से कम यह स्क्रॉल करने योग्य नहीं होगा, अगर सामग्री पूरी तरह से स्क्रीन पर फिट बैठती है।


अपने संपर्क ऐप उदाहरण के बारे में बात करते हुए, ऐसा लगता है कि यह CoordinatorLayout और इसके साथ आने वाली अन्य चीजों का उपयोग नहीं कर रहा है।

इस व्यवहार को इस तरह से किया जा सकता है:

<ScrollView
    android:id="@+id/scroll_adinfo"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <ImageView
            android:id="@+id/image"
            android:layout_width="match_parent"
            android:layout_height="@dimen/image_height"
            android:src="@mipmap/ic_launcher"/>

        <LinearLayout
            android:id="@+id/layout_content"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingTop="@dimen/image_height">

            <!-- YOUR CONTENT HERE -->
        </LinearLayout>
    </FrameLayout>
</ScrollView>

और आपके कोड में आप स्क्रॉल पर छवि को स्थानांतरित करेंगे:

final ImageView image = (ImageView) findViewById(R.id.image);

((ScrollView) rootView.findViewById(R.id.scroll_adinfo)).getViewTreeObserver().addOnScrollChangedListener(
            new ViewTreeObserver.OnScrollChangedListener() {

                @Override
                public void onScrollChanged() {
                    int scrollY = ((ScrollView) rootView.findViewById(R.id.scroll_adinfo)).getScrollY();

                    image.setY(scrollY / 2);
                }
            });

मैंने अपनी परियोजनाओं में से एक से निकाला है और इसे संपादित किया है ताकि मैं कुछ याद कर सकूं।

पृष्ठभूमि

मैं कई ऐप्स पर दिखाए गए समान कार्यक्षमता को जोड़ने का प्रयास करता हूं, जहां स्क्रॉल की गई सामग्री के अनुसार स्क्रीन का ऊपरी क्षेत्र छोटा हो जाता है और विस्तार करता है।

इसके लिए, मैं Google की डिज़ाइन लाइब्रेरी का उपयोग करता हूं, जैसा कि चीज़स्क्वेयर नमूना पर दिखाया गया है

समस्या

बात यह है कि, NestedScrollView में कितनी सामग्री है, इससे मुझे सामग्री के अंतिम दृश्य से नीचे स्क्रॉल करने की सुविधा मिलती है, बस मुझे एक्शनबार की अंतिम स्थिति देखने के लिए, जिसमें न्यूनतम आकार होता है।

संक्षेप में, नीचे जो स्क्रॉल करते समय मैं देखता हूं (चीज़स्क्वेयर नमूना की संशोधित सामग्री):

जबकि यह वही है जो मैं नीचे स्क्रॉल करते समय करना चाहता हूं (संपर्क ऐप से लिया गया):

मैं ThreePhasesBottomSheet नमूना पर एक बग को ठीक करने की भी कोशिश कर रहा हूं कि नीचे की शीट सामग्री में स्क्रॉल करना संभव है जब यह ThreePhasesBottomSheet -स्थिति में हो। पुन: पेश करने के लिए, क्षैतिज स्क्रॉल करना प्रारंभ करें (जो कुछ भी नहीं करता है, क्योंकि इस तरह से स्क्रॉल करने के लिए कुछ भी नहीं है) और फिर लंबवत, जो किसी भी तरह नीचे-शीट की सामग्री को स्क्रॉल करना ट्रिगर करेगा।

इसलिए, मुझे "transformView ()" विधि में स्क्रॉलिंग को अक्षम करने की आवश्यकता है, "अनुवाद

इस प्रकार यह सामान्य उपयोग का उपयोग कर काम करता है:

और यह स्क्रॉलिंग को अवरुद्ध न करने की बग के साथ व्यवहार करता है:

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

मैंने " layout_scrollFlags " झंडे के साथ खेलने की कोशिश की है, ऊंचाई को wrap_content में बदलने के लिए, और क्लिप को हटाने के लिए और सिस्टम सिस्टम विन्डोज़ विशेषताएँ फिट करने के लिए।

यहां नमूना एक्सएमएल फ़ाइल है, जिसे मैंने कई लोगों के बजाय केवल एक ही कार्ड व्यू शामिल करने के लिए संशोधित किया है:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/main_content"
    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="@dimen/detail_backdrop_height"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        android:fitsSystemWindows="true">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsing_toolbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_scrollFlags="scroll|exitUntilCollapsed"
            android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"
            app:expandedTitleMarginStart="48dp"
            app:expandedTitleMarginEnd="64dp">

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

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

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

        </LinearLayout>

    </android.support.v4.widget.NestedScrollView>

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

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

मैंने अगले कोड को भी आजमाया है:

((AppBarLayout.LayoutParams) collapsingToolbar.getLayoutParams()).setScrollFlags(0);

लेकिन यह अभी भी नेस्टेडस्क्रॉल व्यू की स्क्रॉलिंग को पनीरस्क्वेयर उदाहरण में स्क्रॉल करने की अनुमति देता है, और ThreePhasesBottomSheet नमूने में ThreePhasesBottomSheet करने की ThreePhasesBottomSheet है।

प्रश्न

  1. जब स्क्रॉलिंग स्टॉप को नीचे दिखाने के लिए कोई और सामग्री नहीं है तो मैं क्या कर सकता हूं?

  2. इसके अलावा, जब भी मैं चाहूं NestedScrollView की स्क्रॉलिंग को अक्षम करने के लिए क्या किया जा सकता है ( ThreePhasesBottomSheet नमूना के लिए)? कुछ "setEnableScrolling (...)" की तरह कुछ?

    मैंने NestedScrollView को विस्तारित करने का प्रयास किया है और स्क्रॉलिंग व्यूबैवियर से भी विस्तार किया है, लेकिन स्क्रॉलिंग को अक्षम करने के लिए क्या किया जा सकता है यह जानने में विफल रहा।

यह शायद बदलने के लिए एक बहुत ही साधारण बात है, लेकिन मुझे पता नहीं चल सकता कि क्या ...

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

compile 'com.android.support:appcompat-v7:23.1.0'
compile 'com.android.support:design:23.1.0'

संपादित करें: # 2 के लिए, मुझे BottomSheetLayout.java फ़ाइल के भीतर से एक वर्कअराउंड मिला है, जो वैरिएबल "शीटव्यूऑन टच" से संबंधित सभी को अक्षम करने के लिए है, जैसे कि यह हमेशा "गलत" पर सेट होता है। यह नीचे की चादर पर स्पर्श स्पर्श घटनाओं की अनुमति देगा। हालांकि, यह सिर्फ एक कामकाज है, और केवल इस मामले के लिए। यह कुछ स्पर्श घटनाओं का भी कारण बनता है जिन्हें अन्य विचारों से संभाला जाना चाहिए था। मैं अभी भी जानना चाहता हूं कि स्क्रॉलिंग को प्रोग्रामेटिक रूप से कैसे अवरुद्ध करना है, और पर्याप्त-स्थान-टू-शो-सामग्री के अन्य मामले में भी।


जब स्क्रॉलिंग स्टॉप को नीचे दिखाने के लिए कोई और सामग्री नहीं है तो मैं क्या कर सकता हूं ?

सबसे पहले, जैसा कि मैंने नीचे टिप्पणी की है, आपके प्रश्न में जो स्क्रॉलिंग आपने कहा है वह NestedScrollView का नहीं है। यह CollapsingToolbarLayoutNestedScrollView की स्क्रॉल इवेंट केवल तब होती है जब CollapsingToolbarLayout पूरी तरह से ध्वस्त हो जाता है, और निश्चित रूप से यह तब स्क्रॉल करना बंद कर देगा जब उसके अंदर कोई और सामग्री नहीं है (नीचे पहुंच गया)। CollapsingToolbarLayout , यह अपने टूलबार के लेआउट_हेइट (जैसे एक्सएमएल फ़ाइल में) के रूप में गिर जाएगा, आपको "?attr/actionBarSize" )। निम्नलिखित छवि यह दर्शाएगी कि, लाल आयताकार पर ध्यान दें जो टूलबार है (मैंने इसकी पृष्ठभूमि सेट की है)

तो अपने # 1 के लिए समाधान प्राप्त करने के लिए, आपको NestedScrollView की ऊंचाई की गणना करने की आवश्यकता है, फिर यदि यह स्क्रीन ऊंचाई से छोटा है, तो हम टूलबार की ऊंचाई को ठीक करते हैं।

संक्षेप में, आप गतिविधि_ activity_detail.xml को निम्न के रूप में अपडेट कर सकते हैं:

<?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:id="@+id/main_content"
    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="@dimen/detail_backdrop_height"
        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:layout_scrollFlags="scroll|exitUntilCollapsed">

            <ImageView
                android:id="@+id/backdrop"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fitsSystemWindows="false"
                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="wrap_content"            
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

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

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

        </LinearLayout>

    </android.support.v4.widget.NestedScrollView>

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

और CheeseDetailActivity.java:

public class CheeseDetailActivity extends AppCompatActivity {

    public static final String EXTRA_NAME = "cheese_name";
    private final Context mContext = this;
    private int screenHeight;
    private int linearLayoutHeight;
    private int toolbarHeight_org;
    private int toolbarHeight;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail);

        Intent intent = getIntent();
        final String cheeseName = intent.getStringExtra(EXTRA_NAME);

        screenHeight = getScreenHeight(this);

        TypedValue typedValue = new TypedValue();
        getTheme().resolveAttribute(R.attr.colorPrimary, typedValue, true);
        final int colorPrimary = typedValue.data;

        final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        AppBarLayout appbar = (AppBarLayout) findViewById(R.id.appbar);
        final CoordinatorLayout.LayoutParams appbarLayoutParams = (CoordinatorLayout.LayoutParams)appbar.getLayoutParams();

        final ViewGroup.LayoutParams toolbarLayoutParams = toolbar.getLayoutParams();
        if (toolbarLayoutParams != null) {
            toolbarHeight_org = toolbarLayoutParams.height;
            toolbarHeight = toolbarLayoutParams.height;
        }

        final CollapsingToolbarLayout collapsingToolbar =
                (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar);
        collapsingToolbar.setTitle(cheeseName);

        collapsingToolbar.setContentScrimColor(colorPrimary);
        collapsingToolbar.setExpandedTitleTextAppearance(R.style.ExpandedTitleTextAppearance);
        //collapsingToolbar.setCollapsedTitleTextAppearance(R.style.CollapsedTitleTextAppearance);

        final LinearLayout linearLayout = (LinearLayout) findViewById(R.id.linearLayout1);
        ViewTreeObserver observer = linearLayout.getViewTreeObserver();
        observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                linearLayoutHeight = linearLayout.getHeight();
                if (linearLayoutHeight + toolbarHeight < screenHeight) {
                    if (toolbarLayoutParams != null) {
                        toolbarLayoutParams.height = screenHeight - linearLayoutHeight - 20;
                        if (toolbarLayoutParams.height < toolbarHeight_org) {
                            toolbarLayoutParams.height = toolbarHeight_org;
                        }

                        int extended_text_size = (int) getResources().getDimension(R.dimen.expanded_text_size);

                        if (appbarLayoutParams.height - toolbarLayoutParams.height <= extended_text_size) {
                            int value = appbarLayoutParams.height - toolbarLayoutParams.height;
                            if (value < 0) {
                                appbarLayoutParams.height = toolbarLayoutParams.height - value + extended_text_size * 3;
                            } else {
                                appbarLayoutParams.height = toolbarLayoutParams.height + extended_text_size * 3;
                            }
                            if (appbarLayoutParams.height >= screenHeight) {
                                appbarLayoutParams.height = screenHeight;
                            }
                        }

                        // collapsingToolbar.setContentScrimColor(getResources().getColor(android.R.color.transparent));
                        if (toolbarLayoutParams.height > toolbarHeight_org) {
                            collapsingToolbar.setContentScrimColor(ContextCompat.getColor(mContext, android.R.color.transparent));
                        }
                    }
                }
                // Removes the listener if possible
                ViewTreeObserver viewTreeObserver = linearLayout.getViewTreeObserver();
                if (viewTreeObserver.isAlive()) {
                    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                        linearLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                    } else {
                        linearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                    }
                }
            }
        });

        loadBackdrop();
        appbar.setExpanded(true);
    }

    private int getScreenHeight(Context context) {
        int measuredHeight;
        Point size = new Point();
        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
            wm.getDefaultDisplay().getSize(size);
            measuredHeight = size.y;
        } else {
            Display d = wm.getDefaultDisplay();
            measuredHeight = d.getHeight();
        }

        return measuredHeight;
    }

    private void loadBackdrop() {
        final ImageView imageView = (ImageView) findViewById(R.id.backdrop);
        Glide.with(this).load(Cheeses.getRandomCheeseDrawable()).centerCrop().into(imageView);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.sample_actions, menu);
        return true;
    }
}

परिणाम यहां दिया गया है:

Cheesesquare नमूना के साथ, मैंने इस परियोजना को अनुकूलित किया है और My GitHub पर अपलोड किया है । मैं मानता हूं कि इसमें अभी भी कुछ समस्याएं हैं, हालांकि, कम से कम यह आपके पहले अंक का समाधान हो सकता है।

कृपया देख लीजिये। आशा करता हूँ की ये काम करेगा!





nestedscrollview