অ্যান্ড্রয়েড সমর্থন ডিজাইন ট্যাবলআউট: মাধ্যাকর্ষণ কেন্দ্র এবং মোড স্ক্রোলযোগ্য


101

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

আমি গ্র্যাভিটি এবং মোডের সাথে আমার ট্যাবলাইটটি সেট করে এইভাবে কাজ করছি:

    tabLayout.setTabGravity(TabLayout.GRAVITY_CENTER);
    tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);

সুতরাং আমি প্রত্যাশা করি যে যদি কোনও ঘর না থাকে তবে ট্যাবলআউটটি স্ক্রোলযোগ্য, তবে যদি ঘর থাকে তবে এটি কেন্দ্রিক।

গাইড থেকে:

পাবলিক স্ট্যাটিক ফাইনাল ইন গ্রাভিটি_সেন্টার গ্র্যাভিটি ট্যাবলআউটটির কেন্দ্রে ট্যাবগুলি রাখত।

সর্বজনীন স্ট্যাটিক ফাইনাল ইন গ্রাভিটি_এফআইএল গ্রেভিটি যতটা সম্ভব ট্যাবলআউট পূরণ করতে ব্যবহৃত হত। এই বিকল্পটি কেবল তখনই কার্যকর হয় যখন MODE_FIXED ব্যবহার করা হয়।

সর্বজনীন স্থিতিশীল চূড়ান্ত INMODE_FIXED ফিক্সড ট্যাবগুলি একই সাথে সমস্ত ট্যাব প্রদর্শন করে এবং ট্যাবগুলির মধ্যে দ্রুত পাইভটগুলি থেকে উপকারী এমন সামগ্রী সহ সর্বাধিক ব্যবহৃত হয়। ট্যাবের সর্বাধিক সংখ্যা দেখার প্রস্থের দ্বারা সীমাবদ্ধ। প্রশস্ত ট্যাব লেবেলের উপর ভিত্তি করে স্থির ট্যাবগুলির সমান প্রস্থ রয়েছে।

সর্বজনীন স্ট্যাটিক ফাইনাল ইন MODE_SCROLLABLE স্ক্রোলযোগ্য ট্যাবগুলি যে কোনও মুহুর্তে ট্যাবগুলির একটি উপসেট প্রদর্শন করে এবং এতে দীর্ঘতর ট্যাব লেবেল এবং বৃহত সংখ্যক ট্যাব থাকতে পারে। যখন ব্যবহারকারীদের সরাসরি ট্যাব লেবেলগুলির তুলনা করার প্রয়োজন হয় না তখন এগুলি স্পর্শ ইন্টারফেসে প্রসঙ্গ ব্রাউজ করার জন্য সর্বোত্তমভাবে ব্যবহৃত হয়।

সুতরাং GRAVITY_FILL কেবলমাত্র MODE_FIXED এর সাথে সামঞ্জস্যপূর্ণ তবে গ্রাভিটি_সেন্টারটির জন্য কোনও কিছুই নির্দিষ্ট করে না, আমি এটি MODE_SCROLLABLE এর সাথে সামঞ্জস্যপূর্ণ হওয়ার প্রত্যাশা করি, তবে আমি গ্রাভিটি_সেন্টার এবং MODE_SCROLLABLE ব্যবহার করে যা করছি

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

সুতরাং এটি উভয় অভিযোজনে এসসিআরএলএলবিএল ব্যবহার করছে তবে এটি গ্রাভিটি_সেন্টার ব্যবহার করছে না।

আমি আড়াআড়ি জন্য এটি আশা করব; তবে এটির জন্য আমার MODE_FIXED সেট করা দরকার, তাই আমি প্রতিকৃতিতে যা পাই তা হ'ল:

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

ট্যাবলআউটটি স্ক্রিনটি ফিট করে তবে কেন গ্রাভিটি_সেন্টার এসআরসিএলএলবিএল এর জন্য কাজ করছে না? গৌণত্ব এবং মোডকে গতিশীলভাবে সেট করার কোনও উপায় আছে (এবং আমি কী প্রত্যাশা করছি তা দেখার জন্য)?

আপনাকে অনেক ধন্যবাদ!

সম্পাদিত: এটি আমার ট্যাবলআউটটির বিন্যাস:

<android.support.design.widget.TabLayout
    android:id="@+id/sliding_tabs"
    android:layout_width="match_parent"
    android:background="@color/orange_pager"
    android:layout_height="wrap_content" />

@ ফাইটার 42 আপনি কি এর কোনও সমাধান খুঁজে পেয়েছেন? আমি একই সমস্যা সম্মুখীন হচ্ছি।
স্পিনিট

আমি যেভাবে খুঁজে পেয়েছি তা হ'ল আপনার ট্যাবগুলির আকার (ম্যানুয়ালি) এবং তারপরে এটি মানানসই কিনা তা নির্ভর করে বিন্যাসের পরামিতিগুলি ডায়নামিকভাবে কনফিগার করুন।
জাভিয়ের দেলগাদো

@ ফাইটার 42, আপনি যে সমাধানটি ব্যবহার করছেন তার জন্য কিছু নমুনা কোড পোস্ট করতে পারেন?
স্যাম্মিস

4
আমি জানি যে আমার উত্তরটি যৌক্তিকর পক্ষে ভাল নয় তবে এটি আমাকে সহায়তা করে। পাঠ্যের আগে এবং পরে কিছু স্পেস রাখুন। তারপরে এটি স্ক্রোলযোগ্য হবে। উভয় মোডে।
এএমওয়াই

উত্তর:


131

ট্যাব মাধ্যাকর্ষণ প্রভাব শুধুমাত্র MODE_FIXED

একটি সম্ভাব্য সমাধান আপনার সেট করা হয় layout_widthথেকে wrap_contentএবং layout_gravityথেকে center_horizontal:

<android.support.design.widget.TabLayout
    android:id="@+id/sliding_tabs"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    app:tabMode="scrollable" />

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


4
আমি আমার অ্যাপ্লিকেশনের জন্য মেটেরিয়াল ডিজাইন ব্যবহার করছি। আমি androidhive.info/2015/09/… থেকে নমুনা অনুসরণ করেছি / ট্যাব স্ক্রোললে কিটকাট এবং জেলি শিম ডিভাইসে কাজ করছে না। ললিপপগুলিতে আমি ট্যাব স্ক্রোল করতে সক্ষম হয়েছি কিন্তু ললিপপ ডিভাইস ছাড়াও ট্যাব স্ক্রোললেবল কাজ করছে না তবে সোয়াইপ ঠিকঠাক কাজ করছে। আমি কি সমস্যা হতে পারে জানতে পারি।
user2681579

এটি আমার পক্ষে API 15 / সমর্থন.design:25:25.1.0 এ কাজ করে না। উইন্ডো প্রস্থের চেয়ে সংকীর্ণ হলে ট্যাবগুলি ন্যায্য ছিল। সেট app:tabMaxWidth="0dp"এবং android:layout_centerHorizontal="true"কেন্দ্র ট্যাবে কাজ করেন।
বেকার

4
এটা আমার জন্য কাজ করেছে। ট্যাবগুলি সর্বদাই কেন্দ্রিক, তবে যখন তারা আসলে স্ক্রোলযোগ্য নয়, তখন তারা সমস্ত প্রস্থ পূরণ করে না।
জোসে অগাস্টিনহো

15

এইভাবে আমি এটি করেছি

TabLayout.xML

<android.support.design.widget.TabLayout
            android:id="@+id/tab_layout"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:background="@android:color/transparent"
            app:tabGravity="fill"
            app:tabMode="scrollable"
            app:tabTextAppearance="@style/TextAppearance.Design.Tab"
            app:tabSelectedTextColor="@color/myPrimaryColor"
            app:tabIndicatorColor="@color/myPrimaryColor"
            android:overScrollMode="never"
            />

অনক্রিয়েট

@Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mToolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);
        mTabLayout = (TabLayout)findViewById(R.id.tab_layout);
        mTabLayout.setOnTabSelectedListener(this);
        setSupportActionBar(mToolbar);

        mTabLayout.addTab(mTabLayout.newTab().setText("Dashboard"));
        mTabLayout.addTab(mTabLayout.newTab().setText("Signature"));
        mTabLayout.addTab(mTabLayout.newTab().setText("Booking/Sampling"));
        mTabLayout.addTab(mTabLayout.newTab().setText("Calendar"));
        mTabLayout.addTab(mTabLayout.newTab().setText("Customer Detail"));

        mTabLayout.post(mTabLayout_config);
    }

    Runnable mTabLayout_config = new Runnable()
    {
        @Override
        public void run()
        {

           if(mTabLayout.getWidth() < MainActivity.this.getResources().getDisplayMetrics().widthPixels)
            {
                mTabLayout.setTabMode(TabLayout.MODE_FIXED);
                ViewGroup.LayoutParams mParams = mTabLayout.getLayoutParams();
                mParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
                mTabLayout.setLayoutParams(mParams);

            }
            else
            {
                mTabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
            }
        }
    };

আমি চলমান অংশে @ মারিও ভেলাস্কোর সমাধানের ছোট পরিবর্তন করেছি


এই সমাধানটিতে একই সমস্যা রয়েছে যা আমি টিয়াগো সমাধানে উল্লেখ করেছি।
সট্টি

এই সমাধানটি আইকন ছাড়াই ট্যাবে কাজ করে, আমি যদি পাঠ্য সহ আইকন রাখি ?? : /
এমেরে টেকিন

@ এমরেটেকিন হ্যাঁ এটি একটি আইকন নিয়ে কাজ করে, আমার ট্যাবগুলিতে পাঠ্য সহ আইকন ছিল
ফ্লাক্স

tabLayout.getWidth()আমার জন্য সর্বদা শূন্য ফিরিয়ে দেয়
ishandutt2007

8

আমি যেমনটি খুঁজে পাইনি কেন এই আচরণটি ঘটে তা আমি নিম্নলিখিত কোডটি ব্যবহার করেছি:

float myTabLayoutSize = 360;
if (DeviceInfo.getWidthDP(this) >= myTabLayoutSize ){
    tabLayout.setTabMode(TabLayout.MODE_FIXED);
} else {
    tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
}

মূলত, আমাকে আমার ট্যাবলআউটটির প্রস্থটি ম্যানুয়ালি গণনা করতে হবে এবং তারপরে ট্যাবলআউটটি ডিভাইসে ফিট করে কি না তার উপর নির্ভর করে আমি ট্যাব মোডটি সেট করি।

আমি ম্যানুয়ালি লেআউটটির আকার পাওয়ার কারণ হ'ল সমস্ত ট্যাব স্ক্রোলযোগ্য মোডে একই প্রস্থের নয় এবং এটি উত্সাহিত করতে পারে যে উদাহরণে আমার কাছে যেমন কিছু ঘটেছিল তেমন কিছু নাম 2 টি লাইন ব্যবহার করে।


এই সমাধানের সাহায্যে পাঠ্যটি সংকুচিতভাবে সংকুচিত করা যেতে পারে এবং পাশাপাশি 2 টি লাইনও ব্যবহার করা যেতে পারে। এটি সম্পর্কে এই থ্রেডে অন্যান্য উত্তর এবং সমাধান দেখুন। আপনি এটি প্রদর্শিত হওয়ার ঝুঁকি হ্রাস করছেন তবে যখন ট্যাবলআউটটি স্ক্রিনউইথের থেকে কিছুটা ছোট হয় তবে প্রায়শই দেখা যাবে।
সোট্টি

8

জিনিসগুলিকে সরল রাখে কেবল অ্যাপ্লিকেশন: ট্যাবমোড = "স্ক্রোলযোগ্য" এবং অ্যান্ড্রয়েড: বিন্যাস_ গ্রেভিটি = "নীচে"

ঠিক এই রকম

<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:layout_gravity="bottom"
app:tabMode="scrollable"
app:tabIndicatorColor="@color/colorAccent" />

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


7
এটি স্রষ্টা যা চাইছেন তা নয়। এই পদ্ধতির সমস্যাটি হ'ল পাঠ্য ছোট যেখানে ফোনগুলিতে আপনার কাছে দুটি ট্যাব বা তিনটি তিনটি ট্যাব রয়েছে সেই পরিস্থিতিতে, আপনার ট্যাবগুলি বাম দিকে রয়েছে যেখানে গুগল প্লে স্টোরের মতো লেআউট থাকবে। স্রষ্টা চান যখন এটি সম্ভব হয় তখন ট্যাবগুলি প্রান্ত থেকে প্রান্তে পৌঁছান এবং অন্যথায় স্ক্রোল করুন।
সোতি 13

একই সমস্যা. আপনি এটি ঠিক করতে পারেন?
হোয়াং ডুক তুয়ান

7

অ্যান্ড্রয়েড-tablayouthelper

ট্যাবলয়আউটটি স্বয়ংক্রিয়ভাবে স্যুইচ করুন M MODE_FIXED এবং ট্যাবলয়আউট M MODE_SCROLLABLE মোট ট্যাব প্রস্থের উপর নির্ভর করে।


তবে যখন ট্যাব শিরোনামগুলি গতিশীল হয়। পাঠ্যটি পরের লাইনে যায়। এবং যদি ট্যাবের জন্য কাস্টম লেআউট ব্যবহার করেন। পাঠ্য
উপবৃত্তাকার আকারের

4

এই সমাধানটি আমি SCROLLABLEএবং FIXED+ এর মধ্যে স্বয়ংক্রিয়ভাবে পরিবর্তনের জন্য ব্যবহার করি FILL। এটি @ ফাইটার 42 সমাধানের সম্পূর্ণ কোড:

(নীচের কোডটি দেখায় যে আপনি যদি গুগলের ট্যাবড ক্রিয়াকলাপ টেম্পলেট ব্যবহার করেন তবে পরিবর্তনটি কোথায় রাখবেন)

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    // Create the adapter that will return a fragment for each of the three
    // primary sections of the activity.
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.container);
    mViewPager.setAdapter(mSectionsPagerAdapter);

    // Set up the tabs
    final TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(mViewPager);

    // Mario Velasco's code
    tabLayout.post(new Runnable()
    {
        @Override
        public void run()
        {
            int tabLayoutWidth = tabLayout.getWidth();

            DisplayMetrics metrics = new DisplayMetrics();
            ActivityMain.this.getWindowManager().getDefaultDisplay().getMetrics(metrics);
            int deviceWidth = metrics.widthPixels;

            if (tabLayoutWidth < deviceWidth)
            {
                tabLayout.setTabMode(TabLayout.MODE_FIXED);
                tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
            } else
            {
                tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
            }
        }
    });
}

বিন্যাস:

    <android.support.design.widget.TabLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal" />

আপনার যদি প্রস্থ পূরণের প্রয়োজন না হয় তবে @ কারাওক्यो সমাধান ব্যবহার করা ভাল better


এটি ভাল কাজ করে; ল্যান্ডস্কেপ এবং প্রতিকৃতির মধ্যে স্যুইচিং আপনি যা আশা করতে পারেন ঠিক তেমন করে। গুগলের ট্যাবড ক্রিয়াকলাপের জন্য এটি ডিফল্ট টেম্পলেটটিতে প্রয়োগ করা উচিত।
কেউ

এই উত্তরটির একই সমস্যা রয়েছে যা আমি টিয়াগো সমাধানে উল্লেখ করেছি।
সোট্টি

4

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

মন্তব্য:

  • ফোন / ট্যাবলেট লেআউটগুলি পরিচালনা করে।
  • এমন জায়গাগুলি পরিচালনা করে যেখানে পর্যাপ্ত জায়গা নেই MODE_SCROLLABLEতবে পর্যাপ্ত জায়গা নেই MODE_FIXED। আপনি যদি এই কেসটি হ্যান্ডেল না করেন তবে এটি কিছু ডিভাইসে ঘটতে চলেছে আপনি বিভিন্ন টেক্সটের মাপ দেখতে পাবেন বা কিছু ট্যাবগুলিতে দুটি লাইনের পাঠ্য ওভেন পাবেন যা দেখতে খারাপ।
  • এটি বাস্তব ব্যবস্থা পায় এবং কোনও অনুমান করে না (যেমন স্ক্রিনটি 360 ডিপি প্রশস্ত বা যাই হোক না কেন ...)। এটি বাস্তব পর্দার আকার এবং বাস্তব ট্যাব আকারের সাথে কাজ করে। এর অর্থ অনুবাদগুলির সাথে ভাল কাজ করে কারণ কোনও ট্যাব আকার ধরে না, ট্যাবগুলি পরিমাপ হয়।
  • অতিরিক্ত কাজ এড়ানোর জন্য অন-লেআউট পর্বে বিভিন্ন পাসের সাথে ডিল করুন।
  • লেআউট প্রস্থটি wrap_contentএক্সএমএলে থাকা দরকার। এক্সএমএলে কোনও মোড বা মাধ্যাকর্ষণ সেট করবেন না।

অ্যাডাপটিভ ট্যাবলয়আউট.জভা

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.TabLayout;
import android.util.AttributeSet;
import android.widget.LinearLayout;

public class AdaptiveTabLayout extends TabLayout
{
    private boolean mGravityAndModeSeUpNeeded = true;

    public AdaptiveTabLayout(@NonNull final Context context)
    {
        this(context, null);
    }

    public AdaptiveTabLayout(@NonNull final Context context, @Nullable final AttributeSet attrs)
    {
        this(context, attrs, 0);
    }

    public AdaptiveTabLayout
    (
            @NonNull final Context context,
            @Nullable final AttributeSet attrs,
            final int defStyleAttr
    )
    {
        super(context, attrs, defStyleAttr);
        setTabMode(MODE_SCROLLABLE);
    }

    @Override
    protected void onLayout(final boolean changed, final int l, final int t, final int r, final int b)
    {
        super.onLayout(changed, l, t, r, b);

        if (mGravityAndModeSeUpNeeded)
        {
            setModeAndGravity();
        }
    }

    private void setModeAndGravity()
    {
        final int tabCount = getTabCount();
        final int screenWidth = UtilsDevice.getScreenWidth();
        final int minWidthNeedForMixedMode = getMinSpaceNeededForFixedMode(tabCount);

        if (minWidthNeedForMixedMode == 0)
        {
            return;
        }
        else if (minWidthNeedForMixedMode < screenWidth)
        {
            setTabMode(MODE_FIXED);
            setTabGravity(UtilsDevice.isBigTablet() ? GRAVITY_CENTER : GRAVITY_FILL) ;
        }
        else
        {
            setTabMode(TabLayout.MODE_SCROLLABLE);
        }

        setLayoutParams(new LinearLayout.LayoutParams
                (LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));

        mGravityAndModeSeUpNeeded = false;
    }

    private int getMinSpaceNeededForFixedMode(final int tabCount)
    {
        final LinearLayout linearLayout = (LinearLayout) getChildAt(0);
        int widestTab = 0;
        int currentWidth;

        for (int i = 0; i < tabCount; i++)
        {
            currentWidth = linearLayout.getChildAt(i).getWidth();

            if (currentWidth == 0) return 0;

            if (currentWidth > widestTab)
            {
                widestTab = currentWidth;
            }
        }

        return widestTab * tabCount;
    }

}

এবং এটি ডিভাইসইটিস ক্লাস:

import android.content.res.Resources;

public class UtilsDevice extends Utils
{
    private static final int sWIDTH_FOR_BIG_TABLET_IN_DP = 720;

    private UtilsDevice() {}

    public static int pixelToDp(final int pixels)
    {
        return (int) (pixels / Resources.getSystem().getDisplayMetrics().density);
    }

    public static int getScreenWidth()
    {
        return Resources
                .getSystem()
                .getDisplayMetrics()
                .widthPixels;
    }

    public static boolean isBigTablet()
    {
        return pixelToDp(getScreenWidth()) >= sWIDTH_FOR_BIG_TABLET_IN_DP;
    }

}

উদাহরণ ব্যবহার করুন:

<?xml version="1.0" encoding="utf-8"?>

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

    <com.com.stackoverflow.example.AdaptiveTabLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="?colorPrimary"
        app:tabIndicatorColor="@color/white"
        app:tabSelectedTextColor="@color/text_white_primary"
        app:tabTextColor="@color/text_white_secondary"
        tools:layout_width="match_parent"/>

</FrameLayout>

গিস্ট

সমস্যা / সাহায্যের জন্য জিজ্ঞাসা করুন:

  • আপনি এটি দেখতে পাবেন:

লগক্যাট:

W/View: requestLayout() improperly called by android.support.design.widget.TabLayout$SlidingTabStrip{3e1ebcd6 V.ED.... ......ID 0,0-466,96} during layout: running second layout pass
W/View: requestLayout() improperly called by android.support.design.widget.TabLayout$TabView{3423cb57 VFE...C. ..S...ID 0,0-144,96} during layout: running second layout pass
W/View: requestLayout() improperly called by android.support.design.widget.TabLayout$TabView{377c4644 VFE...C. ......ID 144,0-322,96} during layout: running second layout pass
W/View: requestLayout() improperly called by android.support.design.widget.TabLayout$TabView{19ead32d VFE...C. ......ID 322,0-466,96} during layout: running second layout pass

আমি কীভাবে এটি সমাধান করব তা নিশ্চিত নই। কোনও পরামর্শ?

  • ট্যাবলআউট শিশু ব্যবস্থা গ্রহণের জন্য, আমি কিছু castালাই এবং অনুমান করছি (শিশুটির মতো অন্যান্য মতামত সম্বলিত লিনিয়ারলআউট ....) এটি পরবর্তী ডিজাইন সহায়তা লাইব্রেরি আপডেটগুলিতে সমস্যা সৃষ্টি করতে পারে। একটি ভাল পদ্ধতির / পরামর্শ?


2

খুব সাধারণ উদাহরণ এবং এটি সর্বদা কার্যকর হয়।

/**
 * Setup stretch and scrollable TabLayout.
 * The TabLayout initial parameters in layout must be:
 * android:layout_width="wrap_content"
 * app:tabMaxWidth="0dp"
 * app:tabGravity="fill"
 * app:tabMode="fixed"
 *
 * @param context   your Context
 * @param tabLayout your TabLayout
 */
public static void setupStretchTabLayout(Context context, TabLayout tabLayout) {
    tabLayout.post(() -> {

        ViewGroup.LayoutParams params = tabLayout.getLayoutParams();
        if (params.width == ViewGroup.LayoutParams.MATCH_PARENT) { // is already set up for stretch
            return;
        }

        int deviceWidth = context.getResources()
                                 .getDisplayMetrics().widthPixels;

        if (tabLayout.getWidth() < deviceWidth) {
            tabLayout.setTabMode(TabLayout.MODE_FIXED);
            params.width = ViewGroup.LayoutParams.MATCH_PARENT;
        } else {
            tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
            params.width = ViewGroup.LayoutParams.WRAP_CONTENT;
        }
        tabLayout.setLayoutParams(params);

    });

}

ধারণার জন্য ধন্যবাদ। আমার ক্ষেত্রে সামান্য কিছুটা পরিবর্তন নিয়ে,
মোহন এর

1

এটি আমার পক্ষে কাজ করা একমাত্র কোড:

public static void adjustTabLayoutBounds(final TabLayout tabLayout,
                                         final DisplayMetrics displayMetrics){

    final ViewTreeObserver vto = tabLayout.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

        @Override
        public void onGlobalLayout() {

            tabLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);

            int totalTabPaddingPlusWidth = 0;
            for(int i=0; i < tabLayout.getTabCount(); i++){

                final LinearLayout tabView = ((LinearLayout)((LinearLayout) tabLayout.getChildAt(0)).getChildAt(i));
                totalTabPaddingPlusWidth += (tabView.getMeasuredWidth() + tabView.getPaddingLeft() + tabView.getPaddingRight());
            }

            if (totalTabPaddingPlusWidth <= displayMetrics.widthPixels){

                tabLayout.setTabMode(TabLayout.MODE_FIXED);
                tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

            }else{
                tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
            }

            tabLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
        }
    });
}

এটি ব্যবহার করে ডিসপ্লেমেট্রিকগুলি পুনরুদ্ধার করা যেতে পারে:

public DisplayMetrics getDisplayMetrics() {

    final WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
    final Display display = wm.getDefaultDisplay();
    final DisplayMetrics displayMetrics = new DisplayMetrics();

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
        display.getMetrics(displayMetrics);

    }else{
        display.getRealMetrics(displayMetrics);
    }

    return displayMetrics;
}

এবং আপনার ট্যাবলআউট এক্সএমএলটি দেখতে দেখতে (ট্যাবম্যাক্সউইথথেকে 0 তে সেট করতে ভুলবেন না):

<android.support.design.widget.TabLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/tab_layout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:tabMaxWidth="0dp"/>

4
এটি প্রায় সেখানে কিন্তু কিছু সমস্যা আছে। সর্বাধিক সুস্পষ্ট সমস্যাটি হ'ল কিছু ডিভাইসে (এবং বেশিরভাগ ধীর গতির) আপনি কীভাবে বিন্যাসটি সংশোধন ও পরিবর্তন করা হয় তা দেখতে পাবেন।
সোট্টি

4
আরেকটি সমস্যা আছে, এই পদ্ধতির স্ক্রোলযোগ্য হবে কি না তা স্থির করার জন্য ট্যাবলআউটের মোট প্রশস্ততা পরিমাপ করে। এটি খুব সঠিক নয়। এমন পরিস্থিতি রয়েছে যেখানে স্ক্রোলযোগ্য মোড চলাকালীন ট্যাবলআউট উভয় প্রান্তে পৌঁছায় না, তবে ট্যাবটিতে রেখার সংখ্যার (সাধারণত 2) অপব্যবহারের পাঠ্য সঙ্কুচিত না করে নির্দিষ্ট মোডের জন্য পর্যাপ্ত জায়গা নেই। স্থির মোডে ট্যাবগুলির এটির প্রত্যক্ষ পরিণতি একটি স্থির প্রস্থ (স্ক্রিনউইথ / নম্বরঅফট্যাবস) থাকে যখন স্ক্রোলযোগ্য মোডে তারা পাঠ্য + প্যাডিংস মোড়ছে।
সোটি 13

1

আপনার যা দরকার তা হ'ল আপনার ট্যাবলআউটটিতে নিম্নলিখিতগুলি যুক্ত করা

custom:tabGravity="fill"

তাহলে আপনার কাছে তা হবে:

xmlns:custom="http://schemas.android.com/apk/res-auto"
<android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        custom:tabGravity="fill"
        />

এটি স্রষ্টা যা চাইছেন তা নয়। এখানে সমস্যাগুলি হ'ল ট্যাবগুলি কখনই স্ক্রোলযোগ্য হবে না এবং আপনি পর্দার স্থান থেকে মুক্তি পাবেন। ট্যাবগুলি এটি পাঠ্য সঙ্কুচিত করা শুরু করবে এবং শেষ পর্যন্ত তারা দুটি রেখাযুক্ত হবে।
সোট্টি

1

আমি নিম্নলিখিত ব্যবহার করে এটি সমাধান

if(tabLayout_chemistCategory.getTabCount()<4)
    {
        tabLayout_chemistCategory.setTabGravity(TabLayout.GRAVITY_FILL);
    }else
    {
        tabLayout_chemistCategory.setTabMode(TabLayout.MODE_SCROLLABLE);

    }

1

আমার চূড়ান্ত সমাধান

class DynamicModeTabLayout : TabLayout {

    constructor(context: Context?) : super(context)
    constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

    override fun setupWithViewPager(viewPager: ViewPager?) {
        super.setupWithViewPager(viewPager)

        val view = getChildAt(0) ?: return
        view.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED)
        val size = view.measuredWidth

        if (size > measuredWidth) {
            tabMode = MODE_SCROLLABLE
            tabGravity = GRAVITY_CENTER
        } else {
            tabMode = MODE_FIXED
            tabGravity = GRAVITY_FILL
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.