প্রোগ্রামিয়ালি ভেঙে পড়ুন বা কলসিংটুলবারলাআউট প্রসারিত করুন


158

সাধারণ প্রশ্ন, তবে আমি উত্তর খুঁজে পাচ্ছি না। আমি CollapsingToolbarLayoutপ্রোগ্রামেমেটিকভাবে ভেঙে বা প্রসারিত করতে পারি ?

ধসে যাওয়া সরঞ্জামদণ্ড

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

প্রসারিত সরঞ্জামদণ্ড


1
আমিও একই জিনিস ভাবছিলাম। এম্বেড থাকা বিন্যাসে (উদাহরণস্বরূপ চিত্র) একবার ক্লিক করে কোনও সরঞ্জাম টুলবারটিকে পূর্ণস্ক্রিনে প্রসারিত করা আকর্ষণীয়ও হতে পারে।
মরিটজ

উত্তর:


321

সমর্থন লাইব্রেরি v23 ব্যবহার করে, আপনি কল করতে পারেন appBarLayout.setExpanded(true/false)

আরও পড়ুন: AppBarLayout.setE Expanded (বুলিয়ান)


2
ঠিক আছে, টিপটির জন্য আপনাকে ধন্যবাদ, তবে লাইবগুলি সমর্থন করুন v23 খুব বগি, তাই এখনই এটি পরীক্ষা করতে পারছি না, কারণ আমার 22.2.1 এ থাকা দরকার ....
টমাস

এখন আপনার কাছে কিছু সংশোধন সহ 23.0.1 আছে
মারিও ভেলাস্কো

6
সমর্থন ল্যাব 23.1.1 এর সাথে কাস্টম অ্যানিমেশনটি সংজ্ঞা দেওয়া সম্ভব? সেট এক্সপেন্ডেড (বুলিয়ান, ট্রু) সত্যিই ধীর অ্যানিমেশন রয়েছে ...
নিফেল

আমার একটি সমস্যা ছিল যেখানে আমার একটি কলাপসিবল সরঞ্জামদণ্ড এবং এর অধীনে একটি পুনর্ব্যবহারযোগ্য ভিউ রয়েছে layout পুনর্ব্যবহারযোগ্য আইটেমগুলি মুছে ফেলার সময় টুলবারটি যথাযথ আচরণ করে না, তাই আমি অ্যাপ বারের বিন্যাসটি প্রসারিত করব এবং এটি সঠিকভাবে কাজ করবে worked আমি অ্যানিমেশনটির জন্য অ্যাপবারেলআউট.সেটএক্সপ্যান্ডেড (সত্য, সত্য) ব্যবহার করে শেষ করেছি।
রে হান্টার

49

আমি এই কোডটি সরঞ্জামদণ্ডকে সঙ্কুচিত করার জন্য ব্যবহার করি। এখনও এটি প্রসারিত করার কোনও উপায় খুঁজে পাচ্ছে না।

public void collapseToolbar(){
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbarLayout.getLayoutParams();
    behavior = (AppBarLayout.Behavior) params.getBehavior();
    if(behavior!=null) {
        behavior.onNestedFling(rootLayout, appbarLayout, null, 0, 10000, true);
    }
}

সম্পাদনা 1: নেতিবাচক বেগের সাথে একই ফাংশনটি কিন্তু সরঞ্জামদণ্ডটি 100% প্রসারিত নয় এবং শেষ প্যারামের জন্য মিথ্যা কাজ করা উচিত

public void expandToolbar(){
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbarLayout.getLayoutParams();
    behavior = (AppBarLayout.Behavior) params.getBehavior();
    if(behavior!=null) {
        behavior.onNestedFling(rootLayout, appbarLayout, null, 0, -10000, false);
    }
}

সম্পাদনা 2: এই কোডটি আমার জন্য কৌশলটি করে

public void expandToolbar(){
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbarLayout.getLayoutParams();
    behavior = (AppBarLayout.Behavior) params.getBehavior();
    if(behavior!=null) {
        behavior.setTopAndBottomOffset(0);
        behavior.onNestedPreScroll(rootLayout, appbarLayout, null, 0, 1, new int[2]);
    }
}
  • সেটটপঅ্যান্ডবটম অফসেটটি টুলবারটি প্রসারিত করে
  • onNestedPreScrol প্রসারিত সরঞ্জামদণ্ডের ভিতরে থাকা সামগ্রীটি দেখায় না

নিজের দ্বারা আচরণ বাস্তবায়নের চেষ্টা করব Will


2
যদি আপনি শেষ প্যারামিটার সেট সম্পাদনা 1 এছাড়াও কাজ করবে onNestedFlingকরার false
রিকি লি

2
params.getBehavior () নালায় ফিরছে। এক্সএমএল-তে লেআউট_বিহাইওর ট্যাগটি অ্যাপবারলয়েআউট নয়, নেস্টেডস্ক্রোলভিউয়ের উপর ভিত্তি করে সেট করা আছে। আপনি কি আমাকে সাহায্য করতে পারেন?
ব্যবহারকারী 31689

ধন্যবাদ. 1 টি সঠিকভাবে সম্পাদনা করুন, যদি শেষ পরমটি ভুল হয়। :)
সাইরেলন

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

@ স্পষ্টতই, আমার সমস্যাটি সম্পূর্ণ আলাদা ছিল (কিছুটা কদর্য ভুল)। : এই দেখুন stackoverflow.com/questions/31067082/...
User31689

27

আপনার কাস্টম অ্যানিমেটরের সাথে এটি কতটা প্রসারিত বা পতিত হবে তা আপনি নির্ধারণ করতে পারেন। শুধু ব্যবহার করুন 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();
}

2
এটি কেবলমাত্র একমাত্র উত্তর যা আপনাকে একটি কাস্টম অফসেটে অ্যানিমেট করতে দেয়। অনেক ধন্যবাদ!
গিলহর্মে টরেস কাস্ত্রো

2
appBar.setE Expanded (মিথ্যা, সত্য); (ওপেন / ক্লোজ, অ্যানিমেট) আপনাকে এই সমস্ত লাইন লেখার দরকার নেই
পুনি

2
@ পুণীতে, আপনি যদি কোনও "কাস্টম" অফসেটে প্রসারিত / পতন করতে চান (যেমন একাধিক পর্যায় ভেঙে পড়ার মতো), আপনার এটির প্রয়োজন হবে।
其 威

আপনি কাস্টম আচরণ লিখতে না চান এমন ক্ষেত্রে অ্যাপবার অফসেট অ্যানিমেট করার সেরা সমাধান এটি। কোড স্নিপেটের একটি আপডেট হ'ল বর্তমান অ্যাপবার অফসেট থেকে অ্যানিমেট শুরু করতে 0 এর পরিবর্তে আচরণের জন্য.টোনএন্ডবটমঅফসেট শুরুর মানের সাথে মান অ্যানিমেটার.সেট আইন্টভ্যালু () কল করা হয়।
রিয়েল 13

কাস্টম ভেরিয়েবলটি ( -900 )সেট valueAnimator.setIntValuesকরতে - ( appBar.getTotalScrollRange() )
বিটার সলিউশনটি

12

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

এটি চেষ্টা করে নির্দ্বিধায়।

কেবল এটির পরিবর্তে এটি ব্যবহার করুন AppBarLayoutএবং আপনি এর প্রসারিত বা সংকোচনের জন্য দায়ী পদ্ধতিগুলি কল করতে পারেন CollapsingToolbarLayout

এটি আমার প্রকল্পে প্রত্যাশার মতো ঠিক কাজ করছে, তবে আপনার নিজের সাথে পুরোপুরি ফিট করার জন্য আপনাকে perform...পদ্ধতিগুলি (বিশেষত performExpandingWithAnimation()) গুলিতে ফ্লিং / স্ক্রোল মানগুলি টুইঙ্ক করতে হবে CollapsibleToolbarLayout


@ এসডেনো দয়া করে গিথুব গিস্টের Readme.md পড়ুন। সমর্থন লাইব্রেরির v23 সাল থেকে এটি অবহেলা করা হয়েছে। সাপোর্টের ভি 23 (অ্যান্ড্রয়েডএক্সে অগ্রসর হওয়া), এর মধ্যে setExpandedপদ্ধতি রয়েছে AppBarLayout
বারটেক লিপিনস্কি

6

ব্যবহার করুন mAppBarLayout.setExpanded(true)টুলবার এবং ব্যবহার প্রসারিত করতে mAppBarLayout.setExpanded(false)টুলবার পতন।

আপনি যদি কল্যাপসিংটুলআরআউট উচ্চতাটিকে প্রোগ্রামক্রমে পরিবর্তন করতে চান তবে কেবল ব্যবহার করুন mAppBarLayout.setLayoutParams(params);

বিস্তৃত করা:

CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
params.height = 3*200; // HEIGHT

mAppBarLayout.setLayoutParams(params);
mAppBarLayout.setExpanded(true);

সঙ্কুচিত করুন:

CoordinatorLayout.LayoutParams params =(CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
params.height = 3*80; // HEIGHT

mAppBarLayout.setLayoutParams(params);
mAppBarLayout.setExpanded(false);

1
এটি আমাকে অনেক সাহায্য করেছিল।
NoName

1
এটি এত সহায়ক। ধন্যবাদ!
সূর্যমুখর 3

5

যারা নেস্টপ্রেসক্রোল নিয়ে কাজ করতে চান এবং আমার মতো ত্রুটি পেতে চান তাদের জন্য। আমি এই রেখার সাথে অনক্রিটে নালপয়েন্টারএক্সসেপশন পেয়েছি

    CoordinatorLayout coordinator =(CoordinatorLayout)findViewById(R.id.tab_maincontent);
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
    //below line
    params.setBehavior(new AppBarLayout.Behavior() {});

এবং এটি দিয়ে সঠিকভাবে কাজ করে না। তবে আমি এই সমস্যাটি নিয়ে কাজ করি

অনক্রিটেতে:

        scrollToolbarOnDelay();

এবং...

    public void scrollToolbarOnDelay() {
            final Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.tab_appbar);
                    CoordinatorLayout coordinator = (CoordinatorLayout) findViewById(R.id.tab_maincontent);
                    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
                    AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
         if(behavior!=null)
                    behavior.onNestedPreScroll(coordinator, appBarLayout, null, 0, 100, new int[]{0, 0});
         else
            scrollToolbarOnDelay()
                }
            }, 100);


        }



0

আমি এটি ব্যবহার করে

 private fun collapseAppbar() {
        scrollView.postDelayed(Runnable {
            scrollView?.smoothScrollTo(50, 50)
        }, 400)
    }

0

AppBarLayout প্রোগ্রামগতভাবে প্রসারিত / সঙ্কুচিত করতে:

fun expandAppBarLayout(expand: Boolean, isAnimationEnabled: Boolean){
    appBarLayout.setExpanded(expand, isAnimationEnabled);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.