নেস্টডস্ক্রোলভিউতে ভিউপেজার


111

আমাকে গুগল নিউজস্ট্যান্ডের মতো একটি ইন্টারফেস তৈরি করতে হবে যা একটি সঙ্কুচিত শিরোলেখ (উল্লম্ব স্ক্রোল) এর উপর এক ধরণের ভিউপ্যাজার (অনুভূমিক স্ক্রোল)। আমার প্রয়োজনীয়তা এক নতুন নকশা সাপোর্ট লাইব্রেরী গুগল আই 2015. (উপস্থাপিত ব্যবহার করা http://android-developers.blogspot.ca/2015/05/android-design-support-library.html )

ক্রিস বানেস ( https://github.com/chrisbanes/cheesesquare দ্বারা নির্মিত নমুনার ভিত্তিতে) ) আমি এই পর্যায়ে পৌঁছে গিয়েছি যে আমি ভেঙে পড়া আচরণ করতে সক্ষম হয়েছি তবে একটি মৌলিক লিনিয়ারলআউট (অনুভূমিক স্ক্রোল ছাড়াই)।

আমি ভিউপ্যাজার দ্বারা লিনিয়ারলআউটটি প্রতিস্থাপন করার চেষ্টা করেছি এবং আমি একটি ফাঁকা স্ক্রিন পেয়েছি। আমি এটি দিয়ে খেললাম: প্রস্থ, ওজন এবং সব ধরণের ভিউ গ্রুপ কিন্তু .... এখনও একটি ফাঁকা স্ক্রিন। দেখে মনে হচ্ছে ভিউপ্যাজার এবং নেস্টেডস্ক্রোলভিউ একে অপরকে পছন্দ করে না।

আমি একটি হরাইজেন্টালস্ক্রোলভিউ ব্যবহার করে একটি কাজ করার চেষ্টা করেছি: এটি কাজ করে তবে আমি পেজরাইটেলস্ট্রিপ বৈশিষ্ট্যটি এবং একটি একক প্যানেলে ফোকাসটি (আমি 2 প্যানেলের মধ্যে অনুভূমিকভাবে থামিয়ে দিতে পারি) loose

এখন আমার আর কোনও ধারণা নেই, যদি কেউ আমাকে কোনও সমাধানে নিয়ে যেতে পারে ...

ধন্যবাদ

আমার সর্বশেষ লেআউট ফাইলটি এখানে:

<?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="@dimen/header_height"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.design.widget.CollapsingToolbarLayout
            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">

            <include
                layout="@layout/part_header"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_collapseMode="parallax"/>

            <android.support.v7.widget.Toolbar
                android:id="@+id/activity_main_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:id="@+id/activity_main_nestedscrollview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <android.support.v4.view.ViewPager
            android:id="@+id/activity_main_viewpager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#FFA0"/>


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

আপনি কি নিজের ViewPagerঅভ্যন্তরে জড়ানোর চেষ্টা করেছেন LinearLayout? এটি যদি ViewPagerসঠিকভাবে রেন্ডার হয় তবে কেবল কৌতূহল ।
জাজারম্যাট

হ্যাঁ আমি চেষ্টা করেছি কিন্তু এখনও একই ফলাফল। আমি অনেকগুলি উপাদান দিয়ে অনেক পরীক্ষা করেছিলাম তবে ভিউপাগার কখনও কখনও নেস্টার্ডস্ক্রোলভিউতে রেন্ডার হয় না শ্রেণিবদ্ধতা
কিসো 84

আমি কেবলমাত্র একটি লেআউট হিসাবে একটি ViewPagerঅভ্যন্তর দিয়ে একটি পরীক্ষা অ্যাপ্লিকেশন তৈরি করেছি NestedScrollView- দেখে মনে হচ্ছে ঠিক আছে। আমি একটি DrawerLayoutসফলভাবে ড্রপ করতে সক্ষম হয়েছি । সম্ভবত আপনার কোডটির অন্য কোনও দিক রয়েছে যা আপনি চান কার্যকারিতা রোধ করে। আপনার উত্স আরও ভাগ যত্ন?
জজারম্যাট

বাহ, আপনি বাম / ডান এবং উপরে / নিচে সোয়াইপ করতে সক্ষম? আমি আমার পেজারে টুকরোগুলি প্রদর্শন করতে কেবল একটি ফ্র্যাগমেন্টপেজার অ্যাডাপ্টার ব্যবহার করি। আপনি কি পরিবর্তে আপনার নমুনা কোড ভাগ করতে পারেন?
কিসো 84

আমি এখানে একটি সাধারণ উদাহরণ লেআউটটি আটকালাম : পেস্টবিন.com / jXPw6mtf সম্পাদনা করুন: আপনি যে খণ্ডটি চান তাতে লোড করতে পারেন ViewPager। আমি উপরে এবং নীচে ভিউগুলি স্ক্রোল করতে সক্ষম, পাশাপাশি ViewPagerবাম / ডানদিকেও স্ক্রোল করব ।
জারম্যাট

উত্তর:


128

আমি এই সমস্যাটি পূরণ করি, আমি এটি দ্বারা সমাধান করি setFillViewport (true)

<android.support.v4.widget.NestedScrollView
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:id="@+id/nest_scrollview"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="mio.kon.yyb.nestedscrollviewbug.ScrollingActivity"
tools:showIn="@layout/activity_scrolling">


    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

ক্রিয়াকলাপে

  NestedScrollView scrollView = (NestedScrollView) findViewById (R.id.nest_scrollview);
    scrollView.setFillViewport (true);

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


31
নোট যে এই XML- এর পাশাপাশি নির্ধারণ করা যাবে, শুধু যোগ android:fillViewport="true"করতে NestedScrollViewবস্তু। ডকুমেন্টেশন হিসাবে এই বৈশিষ্ট্য বর্ণনা করে Defines whether the scrollview should stretch its content to fill the viewport.
Krøllebølle

7
এটি স্থানধারক টুকরাগুলিতে স্ক্রোলিং সমস্যার সমাধান করে না
আতিহ

3
ধন্যবাদ! আমি বসে আছে android:fillViewport="true"উপর NestedScrollViewভিতরে fragmentআমি একটি listViewযেখানে আমি বসে android:nestedScrollingEnabled="true".. স্ক্রলিং সমস্যা সমাধান করা হয়েছে
radubogdan

@ Krøllebølle নেস্টেডস্ক্রোলভিউয়ের এই বৈশিষ্ট্যটি নেই, আপনাকে প্রোগ্রামিয়ালি সেট করতে হবে।

হ্যাঁ এটি আমার পক্ষে কাজ করে। নেস্টডস্ক্রোলভিউয়ের মধ্যে ভিউপিজারের উচ্চতা মেলে_পিতাটিকে সেট করার সময় আমার একটি সমস্যা হয়েছে যা দর্শনগুলি দেখায় না।
ওয়াহিদ নাজির

71

ঠিক আছে, আমি ViewPagerএবং এর সাথে একটি ছোট ডেমো তৈরি করেছি NestedScrollView। আমি যে সমস্যার মুখোমুখি হয়েছিলাম তা ছিল উচ্চতা ViewPagerএবং এর সাথে ListView। সুতরাং আমি উচ্চতা ListViewএবং ViewPager'sপরিমাপের জন্য কিছুটা পরিবর্তন করেছি ।

যদি কেউ কোডটি সন্ধান করতে চান তবে এখানে লিঙ্কটি দেওয়া হয়েছে: https://github.com/TheLittleNaruto/SupportDesignExample/

আউটপুট:

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


কাজ করছে না, যদি টুকরোটির তালিকা তালিকা না থাকে, এমনকি আইটেমের সংখ্যার সংখ্যা সমস্ত খণ্ডের জন্য একই হয় তবে এটির কাজটিও ফোরলিস্টভিউ করে।
পঙ্কজ অরোরা

3
আমি পার্টিতে কিছুটা দেরি করতে পারি তবে, আমি আজ এটি নিয়ে কাজ করছিলাম, এবং আমি এটি (বেশিরভাগই) অ্যাপ্লিকেশন যুক্ত করে কাজ করেছি: লেআউট_বেহেভিয়ার = "@ স্ট্রিং / অ্যাপবার_স্ক্রোলিং_ভিউ_বিহেভিয়ার" উভয় ভিউপেজারে এবং এর মূল অভিমত প্রতিটি খণ্ড।
গ্রীম

1
সন্দেহ নেই যে এটি কাজ করে, তবে এটি কি এই সমস্যাটিকে জটিল করে তোলে না? আমি এর থেকে মুক্তি পেয়ে এর পরিবর্তে এর NestedScrollViewব্যবহার করে সমাধান করেছি LinearLayout। পুরো উদ্দেশ্যটি ভিউপ্যাজারের মধ্যে থাকা বিষয়বস্তুগুলিকে স্ক্রোল করা হলে NestedScrollViewওভার করার সুবিধা কী হবে LinearLayout? আমি ভুল হলে আমাকে সংশোধন করুন। : এক্স ধন্যবাদ
ক্র্যাম্পস

1
তোমাকে অনেক ধন্যবাদ! আমি আমার চুলগুলি টেনে আনার পর্যায়ে ছিলাম এবং আপনার র‌্যাপকন্টেন্টহাইটভিউপেজার একটি কবজির মতো কাজ করে। আমি তোমার এক ণী!
মাভামার্টেন

1
নিখুঁত সমাধান. ধন্যবাদ। এটি আমার জন্য কাজ করেছে .. :)
মৃণাল

42

android:fillViewport="true"আপনার যোগ করুন NestedScrollView। সময়কাল।


2
এটি সমস্যার সমাধান করে তবে ভিউপ্যাজারের উচ্চতা ম্যাচ প্যারেন্ট হবে (এটি পুরো পৃষ্ঠের উচ্চতা নেয়)।
মানুকুমার

27

নেস্টেডস্ক্রোলভিউয়ের মধ্যে ভিউপেজার স্থাপনের পরিবর্তে এটি অন্যভাবে করুন।

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

উদাহরণ লেআউট

ক্রিয়াকলাপের লেআউট:

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/app_bar"
        android:layout_width="match_parent"
        android:layout_height="@dimen/app_bar_height"
        android:fitsSystemWindows="true"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/toolbar_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed|snap">

            <ImageView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:minHeight="@dimen/app_bar_height"
                android:scaleType="centerCrop"
                android:src="@drawable/my_bg"
                app:layout_collapseMode="parallax"
                app:layout_collapseParallaxMultiplier="0.8"
                app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed" />

            <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/AppTheme.PopupOverlay" />

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

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <android.support.design.widget.TabLayout
            android:id="@+id/content_tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <android.support.v4.view.ViewPager
            android:id="@+id/viewPager"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />
    </LinearLayout>

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

যদি আপনার ট্যাবলআউটটির প্রয়োজন না হয় তবে আপনি লিনিয়ারলআউটটি খাঁজতে এবং ভিউপিজারকে একক করতে পারেন। তবে অবশ্যই ব্যবহার করবেনapp:layout_behavior="@string/appbar_scrolling_view_behavior" ভিউপেজার বৈশিষ্ট্যগুলিতে না।

সাধারণ খণ্ডের বিন্যাস:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

কমপ্লেক্স খণ্ডের বিন্যাস:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillViewport="true"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Hello World"/>
    </RelativeLayout>
</android.support.v4.widget.NestedScrollView>

উদাহরণ অ্যাপ্লিকেশন: কলসিংটুলবারপোক

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


এটি আমার জন্য এটি করেছে। ধন্যবাদ!
rjr-apps 20

আরে ইনো, এটি কাজ করছে বলে মনে হচ্ছে তবে আমি যখন ট্যাবলআউটটির উপরে আরও একটি ভিউ যুক্ত করব তখন এটি ভঙ্গ হবে। আপনি কিছু সহায়তা দিতে পারেন?
fasc_voice

আপনি আমার দিন বাঁচিয়েছেন। :)
অ্যান্ড্রয়েডএক্সপি

20

একই সমস্যা ছিল।

নেস্টেডস্ক্রোলভিউটি ভিউপ্যাজারের চারপাশে রাখার সময় এটি কার্যকর হবে না।

ডিআইডিএসক্রোলভিউটি ভিউপাগারের অভ্যন্তরে আমি যে অংশটি লোড করছি তার লেআউটটির ভিতরে যা কাজ করছে তা এখন ।

<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@id/fragment_detail"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="fill_vertical"
            android:orientation="vertical">
    ...Content...
    </LinearLayout>
</android.support.v4.widget.NestedScrollView>


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

আমার জন্য এই কাজ। আমি ভিউপ্যাজারের পরিবর্তে আমার ভিউপ্যাজারের প্রতিটি আইটেমে নেস্টডস্ক্রোলভিউ যুক্ত করি। ধন্যবাদ।
jerogaren

আমার টুকরোটিতে সোয়াইপফ্রেশলেআউট আছে, আপনার সমাধান অনুসারে, আমি নেস্টেডস্ক্রোলভিউ টুকরোটিতে সোয়াইপ রিফ্রেশলয়আউটের উপরে রেখেছি .. তখন ডেটা লোড হচ্ছে না। এটা কাজ করে না।
পলক দারজি

16

আপনি এটির মতো চেষ্টা করতে পারেন, ভিউপ্যাজারটি ঠিকঠাক কাজ করে তবে ভিউপ্যাজারের উচ্চতা স্থির।

আমি এখনও আরও ভাল সমাধানটি সন্ধান করছি ..., সুতরাং দয়া করে আমাকে জানান যে কোনও বিষয় এটি আরও ভালভাবে করতে পারে, ধন্যবাদ

<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="wrap_content"
        android:minHeight="800dp"
        android:orientation="vertical">

        <android.support.v4.view.ViewPager
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"/>
    </LinearLayout>
</android.support.v4.widget.NestedScrollView>

আপনি কি এটিকে "android.support.design.widget.CoordinatorLayout" এবং একটি সঙ্কুচিত সরঞ্জামদণ্ডে encapsulate করার চেষ্টা করেছিলেন?
কিসো 84

আপনার সমাধানগুলি সমস্যার উচ্চতায় রয়েছে তা প্রমাণ করে। @ পল এখনও কি কোন উন্নতি পেয়েছেন?
jasxir

3
এইটি আমার পক্ষে কাজ করেছিল, তবে নেস্টেড ভিউতে আমাকে সেটফিলভিউপোর্ট (সত্য) কল করতে হয়েছিল।
ল্যারিটেক

12

আমার একই সমস্যা ছিল, এবং কিছু পরিবর্তন সহ এটি ঠিক করেছি। ViewPagerমধ্যে কাজ করে না NestedScrollView। আপনার নিজের ViewPagerসরাসরি সন্তানের মতো করে রাখুন CoordinatorLayout। তারপরে প্রতিটি ভিউপিজারের খণ্ডের জন্য সামগ্রীটি আবদ্ধ থাকা উচিত NestedScrollViewএটাই.


এমনকি যদি লিখিত সামগ্রীটি অন্য নেস্টডস্ক্রোলভিউয়ের সাথে সমন্বয়কারী বিন্যাস হত?
আতিহ

1
টুকরো টুকরো টুকরো তালিকার উপাত্ত এভাবে লোড হচ্ছে না!
পলক দারজি

5

প্যারাল্যাক্স প্রভাব পেতে আপনার নেস্টেডস্ক্রোলভিউ ব্যবহার করতে হবে না। এরকম কিছু চেষ্টা করুন:

<android.support.design.widget.CoordinatorLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:animateLayoutChanges="true">

        <android.support.v7.widget.Toolbar
            android:id="@+id/my_toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_scrollFlags="scroll|enterAlways"/>

        <android.support.design.widget.TabLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/my_tab_layout"
            android:fillViewport="false"
            app:tabMode="fixed"/>
     </android.support.design.widget.AppBarLayout>

            <android.support.v4.view.ViewPager
                android:id="@+id/my_view_pager"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

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

3
এটি কার্যকর হবে, যতক্ষণ না আপনার সমস্ত ViewPagerটুকরো ইথার RecyclerViewবা হয় NestedScrollView। যদি সেগুলি (উদাঃ ListView) না হয়, তবে ললিপপ এবং তারপরে একটি কাজের জন্য কল করতে হবেlistView.setNestedScrollingEnabled(true)
অ্যান্ডি ডেভেলপার

শেষ পর্যন্ত এমন কিছু যা অতিরিক্ত স্ক্রোলিং ধারক যুক্ত না করে কাজ করে! বিটিডব্লিউ আপনি xML- এও এই সেট নেস্টডস্ক্রোলিংএনেবলড (সত্য) সেট করতে পারেন: অ্যান্ড্রয়েড: নেস্টডস্ক্রোলিংএনেবলড = "সত্য"
এনালাইজার

1
যদি আমি আমার অ্যাপটি চালনা করি, তবে একটি ট্যাবে থাকা অবস্থায় টুলবারটি ধসে পড়ুন, ট্যাব স্যুইচ করুন, তারপরে টুলবারটি আবার নীচে টানুন, এটি খালি। এটি আবার ফিরিয়ে আনার জন্য ট্যাবগুলিকে সরিয়ে ফেলতে হবে যেখানে এটি ধসে পড়েছে non এত কাছে, এখনও পর্যন্ত :(
-

4

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

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

আমি বর্তমান নির্বাচিত আইটেমের উপর নির্ভর করে উচ্চতা পরিবর্তন করার জন্য ভিউপ্যাজারকে সাবক্লাস করে এটিকে সাজিয়েছি, সাজানোর জন্য এটি বিন্যাস_ উচ্চতা = "র‌্যাপ_কন্টেন্ট" এর মতো আচরণ করতে বাধ্য করা:

public class ContentWrappingViewPager extends ViewPager {

    public ContentWrappingViewPager(Context context) {
        super(context);
    }

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

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        int height = 0;
        if (getChildCount() > getCurrentItem()) {
            View child = getChildAt(getCurrentItem());
            child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            int h = child.getMeasuredHeight();
            if(h > height) height = h;
        }

        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

সমাধান এই উত্তর দ্বারা অনুপ্রাণিত হয়েছিল । আমার জন্য কাজ!


কিন্তু স্ক্রোল ভিউ স্বয়ংক্রিয়ভাবে শীর্ষে স্ক্রোল করে? কিভাবে এটি ঠিক করবেন?
বিবেক কুমার

4

কেবল নেস্টডস্ক্রোলভিউতে এই লাইনটি রাখুন

android:fillViewport="true"

অনেক ধন্যবাদ। আমি কলাপসিংটুলবারআলআউট সরাসরি স্পর্শ করে স্ক্রোল করতে চাইলে কী করব?
প্রতীক সালুজা

3

আমি মুছে NestedScrollView মূল লেআউট থেকে হিসেবে সন্নিবেশিত মূল আমার সব অসম্পূর্ণ অংশ লেআউটগুলিতে লোড হওয়ার কথা ছিল ViewPager আমার জন্য এই সমস্যা সমাধান করা হয়েছে।


3

আপনার সমস্যা সমাধানের জন্য স্বনির্ধারিত শ্রেণীর নীচে ব্যবহার করুন। পেজচেঞ্জিস্ট্যানারে অন রেফ্রেশ () পদ্ধতিটি কল করতে ভুলবেন না।

public class ContentWrappingViewPager extends ViewPager
{
    private int width = 0;
    public ContentWrappingViewPager(Context context) {
        super(context);
    }

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

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
        int height = 0;
        width = widthMeasureSpec;
        if (getChildCount() > getCurrentItem()) {
            View child = getChildAt(getCurrentItem());
            child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            int h = child.getMeasuredHeight();
            if(h > height) height = h;
        }

        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    public void onRefresh()
    {
        try {
            int height = 0;
            if (getChildCount() > getCurrentItem()) {
                View child = getChildAt(getCurrentItem());
                child.measure(width, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
                int h = child.getMeasuredHeight();
                if(h > height) height = h;
            }

            int heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
            ViewGroup.LayoutParams layoutParams = this.getLayoutParams();
            layoutParams.height = heightMeasureSpec;
            this.setLayoutParams(layoutParams);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2

আমার একইরকম সমস্যা হচ্ছে (তবে ছাড়া CollapsingToolbarLayout, কেবলমাত্র একটি সাধারণ Toolbar+ এর TabLayoutমধ্যে AppBarLayout)। আমি চাইতাম যে সরঞ্জামদণ্ডের ভিতরে থাকা সামগ্রীর লিখিত সামগ্রীগুলি যখন স্ক্রোল করে তখন দৃষ্টির বাইরে গিয়ে স্ক্রোল ViewPagerকরা যায় NestedScrollView

আমার লেআউটটি এরকম কিছু হয়েছিল:

<android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:animateLayoutChanges="true">

            <android.support.v7.widget.Toolbar
                android:id="@+id/my_toolbar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_scrollFlags="scroll|enterAlways"/>

            <android.support.design.widget.TabLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/my_tab_layout"
                android:fillViewport="false"
                app:tabMode="fixed"/>
         </android.support.design.widget.AppBarLayout>

         <android.support.v4.widget.NestedScrollView
                android:id="@+id/container"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fillViewport="true"
                android:layout_gravity="fill_vertical"
                app:layout_behavior="@string/appbar_scrolling_view_behavior">

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

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

এই লেআউটটি হিসাবে উদ্দীষ্ট কাজ করছে না হয়, কিন্তু আমি কেবল পরিত্রাণ দ্বারা এটি মীমাংসিত NestedScrollViewএবং ব্যবহার করে একটি LinearLayoutপরিবর্তে। এটি সরাসরি আমার জন্য Android সমর্থন লাইব্রেরি v23.1.0 এ কাজ করেছে। এখানে কীভাবে লেআউটটি শেষ হয়েছিল:

<android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:animateLayoutChanges="true">

            <android.support.v7.widget.Toolbar
                android:id="@+id/my_toolbar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_scrollFlags="scroll|enterAlways"/>

            <android.support.design.widget.TabLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/my_tab_layout"
                android:fillViewport="false"
                app:tabMode="fixed"/>
         </android.support.design.widget.AppBarLayout>

         <LinearLayout
            android:orientation="vertical"
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginBottom="4dp"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">

                <android.support.v4.view.ViewPager
                    android:id="@+id/my_view_pager"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                     app:layout_behavior="@string/appbar_scrolling_view_behavior">
                </android.support.v4.view.ViewPager>
         </LinearLayout>

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

PS: এগুলি আসলে আমার প্রকল্পের দুটি লেআউট ফাইল ছিল। আমি তাদের এখানে অনুলিপি করে আটকালাম এবং এগুলিকে একক ফাইলে দেখতে দেখতে যেমন গঠন করার চেষ্টা করেছি। আমি কপি-পেস্ট করার সময় যদি ভুল করে ফেলেছি তবে আমি দুঃখিত, তবে দয়া করে আমাকে জানান তবে সেটাই যদি আমি ঠিক করতে পারি।


1

নীচে ভিউ পেজারের সঠিক উচ্চতা নিশ্চিত করা উচিত। খণ্ডটি ভিউ পেজারের সরবরাহিত প্রথম খণ্ড।

<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="horizontal">

        <android.support.v4.view.ViewPager
            android:id="@+id/viewPager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

        <fragment
            class="com.mydomain.MyViewPagerFragment"
            android:id="@+id/myFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="gone"/>

    </LinearLayout>

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

1

আমারও একই ইচ্ছা আছে, এটার নীড়ের ViewPagerএকটি NestedScrollView। তবে এটি আমার পক্ষেও কার্যকর নয়। আমার ক্ষেত্রে, এটি ViewPagerক এর অভ্যন্তরেFragment তাই আমি ড্রয়ারের সাথে ইন্টারঅ্যাক্টের উপর নির্ভর করে সামগ্রী স্যুইচ করতে পারি। অবশ্যই, অ্যাপবার, ধস ইত্যাদি, এবং সমর্থন লাইব্রেরির সমস্ত নতুন বৈশিষ্ট্য অবশ্যই কাজ করবে।

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

আমি কি করেনি, যা কাজ করে, যে আমি আর এম্বেড হয় ViewPagerএকটি ভিতরে NestedScrollViewপরিবর্তে, আমি একটি ভিতরে অন্তর্ভুক্ত টুকরা সামগ্রী এম্বেড NestedScrollView

তারপরে, কোনও খণ্ডে কোনও স্ক্রোলের ক্ষেত্রে, আমি নতুন স্ক্রোলিং অবস্থানের ধারককে জানিয়েছি, এটি এটি সঞ্চয় করে।

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


সুতরাং মূলত আপনি নিজের ভিউপেজার প্রয়োগটি লিখেছেন? আপনি কি এই বিষয়ে কোড ভাগ করতে সক্ষম হবেন?
জোসেফ

আমি এর অনুরূপ কিছু করেছি (যদি আমি এটি সঠিকভাবে বুঝতে পারি), যা আপনার সমন্বয়কারী বিন্যাসে একটি রৈখিক বিন্যাস করতে হয়, যাতে নেস্টেড স্ক্রোলভিউয়ের পরিবর্তে ট্যাবলেট (যদি প্রয়োজন হয়) এবং ভিউজার থাকে ager তারপরে এই খণ্ডগুলি তাদের নীচের উপাদান হিসাবে নেস্টেড স্ক্রোলভিউ করে। এটি আমার পক্ষে কাজ করে তবে আমি প্রতিটি খণ্ডে পুনরাবৃত্তি না করে কেবল একটি নেস্টস্ক্রোলভিউ করা পছন্দ করি।
ক্রিস

0

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

<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:orientation="vertical">

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:elevation="0dp">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        app:layout_scrollFlags="scroll|enterAlways"
        android:layout_height="@dimen/toolbar_height"
        android:background="?attr/colorPrimary"
        android:gravity="center">

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


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

<FrameLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

</FrameLayout>

এবং খণ্ড:

<LinearLayout 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"
android:orientation="vertical"
tools:context="com.improvemdia.inmyroom.MainFragment">

<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

তারপরে ফ্রেগমেন্টম্যানেজার ব্যবহার করুন

getSupportFragmentManager().beginTransaction()
            .replace(R.id.container, new MainFragment())
            .commit();

আমি মনে করি LinearLayoutফ্রেগমেন্টের বিন্যাসের মধ্যে এখানে অপ্রয়োজনীয়। আমার উত্তরটি দেখুন, আমি আমার ক্রিয়াকলাপের বিন্যাসে LinearLayoutপরিবর্তে একটি ব্যবহার FrameLayoutকরেছি এবং আমার খণ্ডটির মূলটি ভিউপাগার (মোড়ানোর কোনও বিন্যাস নেই)।
ক্র্যাম্পস

0

ঘন্টা ব্যয় করার পরে উপরের সমস্ত পরামর্শের চেষ্টা করে, অবশেষে আমি এটি কার্যকর করেছি। কী নির্বাপণ করা হয় NestedScrollViewভিতরে PageViewer, এবং সেট layout_behaviorকরার '@string/appbar_scrolling_view_behavior'জন্য উভয় মতামত। চূড়ান্ত বিন্যাস মত

<CoordinatorLayout>
    <ViewPager app:layout_behavior="@string/appbar_scrolling_view_behavior">
        <NestedScrollView fillViewport="true" app:layout_behavior="@string/appbar_scrolling_view_behavior">
            <Content>...</Content>
        </NestedScrollView>
    </ViewPager>
    <AppBarLayout>...</AppBarLayout>
</CoordinatorLayout>


0

আসলে নেস্টেডস্ক্রোলভিউয়ের সমন্বয়কারী লেআউটে কলাপসিংটুলবারলাআউটকে সরাসরি ভাইবোন হওয়ার দরকার নেই। আমি রিয়েলি বিজারে কিছু অর্জন করেছি। অ্যাপবার_স্ক্রোলিং_ভিউ_বিহেভিয়ার 2 টি নেস্টেড টুকরাগুলিতে কাজ করে।

আমার ক্রিয়াকলাপ বিন্যাস:

<android.support.design.widget.CoordinatorLayout>

    <android.support.design.widget.AppBarLayout>

            <android.support.design.widget.CollapsingToolbarLayout>

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

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

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

    <FrameLayout
        android:id="@+id/container"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

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

"ধারক" ফ্রেমে আমি এই টুকরোটি ফুলে উঠলাম:

<android.support.constraint.ConstraintLayout>

    ... some content ...

    <android.support.v4.view.ViewPager/>

    ...

</android.support.constraint.ConstraintLayout>

এবং ভিউপ্যাজারের ভিতরে থাকা টুকরোগুলি দেখতে এইরকম দেখাচ্ছে:

<RelativeLayout>

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

    ....

</RelativeLayout>

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

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