android - সমন্বয়কারী লেআউটে ব্যবহৃত হলে অ্যান্ড্রয়েড-পাদলেখের স্ক্রোলগুলি স্ক্রিন থেকে যায়




android-5.0-lollipop android-design-library (6)

অ্যান্ড্রয়েড সমন্বয়কারী লেআউট নীচে লেআউট আচরণের উদাহরণ

activity_bottom.xml

<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:id="@+id/app_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimaryDark"
            app:layout_scrollFlags="scroll|enterAlways"
            app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
    </android.support.design.widget.AppBarLayout>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#C0C0C0"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

    <com.example.android.coordinatedeffort.widget.FooterBarLayout
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:layout_gravity="bottom">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="#007432"
            android:gravity="center"
            android:text="Footer View"
            android:textColor="@android:color/white"
            android:textSize="25sp" />
    </com.example.android.coordinatedeffort.widget.FooterBarLayout>

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

FooterBarLayout.java

FooterBarBehavior.java

আমার কাছে একটি AppBarLayout যা একটি RecyclerView স্ক্রোল করার সময় স্ক্রীন থেকে স্ক্রোল করে। RecyclerView নীচে একটি RecyclerView রয়েছে যা একটি পাদচরণ।

পাদচরণ কেবল স্ক্রোলিংয়ের পরে দেখানো হয়েছে - এটি এর মতো আচরণ করে

layout_scrollFlags="scroll|enterAlways"

তবে এতে কোনও স্ক্রোলের পতাকা নেই - এটি কোনও বাগ বা আমি কিছু ভুল করছি? আমি চাই এটি সর্বদা দৃশ্যমান হোক

স্ক্রোল আগে

স্ক্রোল পরে

হালনাগাদ

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

আপডেট 2

আপনি এখানে ক্রিয়াকলাপ এবং খণ্ড xmls পেতে পারেন -

নোট করুন যে 34-রেখাটি app:layout_behavior="@string/appbar_scrolling_view_behavior" - লাইনটিতে app:layout_behavior="@string/appbar_scrolling_view_behavior" মন্তব্য করা থাকলে পাঠ্য app:layout_behavior="@string/appbar_scrolling_view_behavior" শুরু থেকে দৃশ্যমান হয় - অন্যথায়, এটি কেবল স্ক্রোল করার পরেই দৃশ্যমান


আপনার উপাদানগুলিকে একটি লিনিয়ারলেআউট দিয়ে ঘিরে দিন, এর মতো:

<android.support.design.widget.CoordinatorLayout >

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

    <android.support.design.widget.AppBarLayout>
      <android.support.v7.widget.Toolbar />
    </android.support.design.widget.AppBarLayout>
    <include layout="@layout/content_main" />

    </LinearLayout>

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

আমি android:layout_gravity="end|bottom" যুক্ত করার বিষয়টি নিশ্চিত করার android:layout_gravity="end|bottom" কিছু করেছি android:layout_gravity="end|bottom" এক্সএমএল এর লেআউটে যা আমি CoordinatorLayout লেআউটের নীচে চেয়েছিলাম

এবং তারপরে কোড সেট করুন:

 mRecyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @SuppressLint("NewApi")
        @SuppressWarnings("deprecation")
        @Override
        public void onGlobalLayout() {
            if (mFooterView != null) {
                final int height = mFooterView.getHeight();
                mRecyclerView.setPadding(0, 0, 0, height);
                mRecyclerView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            }
        }
    });

দ্রষ্টব্য: সঠিকভাবে কাজ করতে ফুটার ভিউ / ভিউগ্রুপের জেড-অক্ষের (এক্সএমএলে রিসাইক্লার ভিউয়ের নীচে তালিকাভুক্ত) আরও বেশি হওয়া দরকার


আমি ওপেনজিএল ইএস এর সমাধান ( https://.com/a/33396965/778951 ) এর সরলিকৃত সংস্করণ ব্যবহার করি - যা নোয়ার সমাধানের ( https://.com/a/31140112/1317564 ) উন্নতি করে। এটি প্রতিটি ট্যাবের ভিউপেজার সামগ্রীতে ফুটার বোতামগুলির সাথে একটি ট্যাবললআউটের উপরে আমার সাধারণ দ্রুত-ফেরত সরঞ্জামদণ্ডের জন্য দুর্দান্ত কাজ করে।

আপনি পর্দার নীচে প্রান্তিকিত রাখতে চান এমন ভিউ / ভিউগ্রুপের লেআউট_চরিত্র হিসাবে ঠিক ফিক্সস্রোলিংফুটারবিভাটি সেট করুন।

লেআউট:

<?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:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?android:attr/actionBarSize"
                android:minHeight="?android:attr/actionBarSize"
                app:title="Foo"
                app:layout_scrollFlags="scroll|enterAlways|snap"
                />

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

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

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="com.spreeza.shop.ui.widgets.FixScrollingFooterBehavior"
        />

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

আচরণ:

public class FixScrollingFooterBehavior extends AppBarLayout.ScrollingViewBehavior {

    private AppBarLayout appBarLayout;

    public FixScrollingFooterBehavior() {
        super();
    }

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

    @Override
    public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {

        if (appBarLayout == null) {
            appBarLayout = (AppBarLayout) dependency;
        }

        final boolean result = super.onDependentViewChanged(parent, child, dependency);
        final int bottomPadding = calculateBottomPadding(appBarLayout);
        final boolean paddingChanged = bottomPadding != child.getPaddingBottom();
        if (paddingChanged) {
            child.setPadding(
                child.getPaddingLeft(),
                child.getPaddingTop(),
                child.getPaddingRight(),
                bottomPadding);
            child.requestLayout();
        }
        return paddingChanged || result;
    }


    // Calculate the padding needed to keep the bottom of the view pager's content at the same location on the screen.
    private int calculateBottomPadding(AppBarLayout dependency) {
        final int totalScrollRange = dependency.getTotalScrollRange();
        return totalScrollRange + dependency.getTop();
    }
}

আমি মনে করি একটি স্থির শিরোনাম এবং পাদচরণ তৈরি করা আপনার সমস্যার সমাধান করতে পারে। আমি মন্তব্যগুলিতে এটি লিখতাম তবে আমার কাছে 50 জন প্রতিনিধি নেই। here এটি কীভাবে করবেন তা আপনি বুঝতে পারেন


হালনাগাদ

নীচের সমাধানটি 5.1 এর মতো কাজ করে না কারণ এটি 5-এ কাজ করে - getTop এর পরিবর্তে getTranslationY ব্যবহার করুন আপনার যে কোনও গণনায়।

layout.getTop()-->(int)layout.getTranslationY()
appbar.getTop()+toolbar.getHeight()-->(int)(appbar.getTranslationY()+toolbar.getHeight())

নতুন সমর্থন লাইব্রেরি সহ ২ টি আপডেট করুন - ২২.২.১ - ৫.১ এবং পূর্ববর্তী সংস্করণগুলির মধ্যে কোনও পার্থক্য নেই, আপনার কেবলমাত্র getTop ব্যবহার করা উচিত এবং এই উত্তরটিতে পূর্ববর্তী আপডেটটিকে উপেক্ষা করা উচিত

আসল সমাধান অনেক দিক অনুসন্ধান করার পরে সমাধানটি আসলে খুব সহজ - খণ্ডে প্যাডিংবটম যুক্ত করুন এবং পৃষ্ঠা স্ক্রোল হিসাবে এটি সামঞ্জস্য করুন।

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

এটি AppBarLayout.ScrollingViewBehavior প্রসারিত এবং ক্রিয়াকলাপ খণ্ড উপাদান হিসাবে আচরণ হিসাবে সেট করে অর্জন করা যেতে পারে।

কোডের মূল appbar.getTop() + toolbar.getHeight() এখানে রয়েছে - এটি কেবলমাত্র একটি সরঞ্জামদণ্ড দিয়ে একটি ক্রিয়াকলাপের জন্য কাজ করে - আপনি এটিকে appbar.getTop() + toolbar.getHeight() দিয়ে প্রতিস্থাপন করতে পারেন এবং আপনার অ্যাপবারে ট্যাবগুলি অন্তর্ভুক্ত করা থাকলে এটি আরও ভাল কাজ করবে।

activity.xml

<android.support.design.widget.CoordinatorLayout
android:id="@+id/main"
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.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:elevation="3dp"
    app:elevation="3dp">
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        app:layout_scrollFlags="scroll|enterAlways"
        />
</android.support.design.widget.AppBarLayout>
<fragment
    android:id="@+id/fragment"
    android:name="com.example.noa.footer2.MainActivityFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="com.example.noa.footer2.MyBehavior"
    tools:layout="@layout/fragment"/>
</android.support.design.widget.CoordinatorLayout>

fragment.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:paddingBottom="48dp"
            android:background="@android:color/holo_green_dark"
            tools:context=".MainActivityFragment">
<android.support.v7.widget.RecyclerView
    android:id="@+id/list"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@null"/>
<View
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:layout_alignParentBottom="true"
    android:background="@android:color/holo_red_light"/>
</RelativeLayout>

MainActivityFragment # onActivityCreated

    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        CoordinatorLayout.LayoutParams lp = (LayoutParams) getView().getLayoutParams();
        MyBehavior behavior = (MyBehavior) lp.getBehavior();
        behavior.setLayout(getView());
    }

আমার আচরণ

public class MyBehavior extends AppBarLayout.ScrollingViewBehavior {

    private View layout;

    public MyBehavior() {
    }

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

    @Override
    public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
        boolean result = super.onDependentViewChanged(parent, child, dependency);
        if (layout != null) {
            layout.setPadding(layout.getPaddingLeft(), layout.getPaddingTop(), layout
                .getPaddingRight(), layout.getTop());
        }
        return result;
    }

    public void setLayout(View layout) {
        this.layout = layout;
    }
}




android-coordinatorlayout