ট্যাবলেট ট্যাবলেট ডিভাইসে সম্পূর্ণ প্রস্থ নিচ্ছে না [Android.support.design.widget.TabLayout ব্যবহার করে]


202

আমার এই পোস্টটি 29/05/2015 আপডেটের হিসাবে সেটআপ ট্যাব রয়েছে । ট্যাবগুলি আমার নেক্সাস 4 মোবাইলে সম্পূর্ণ প্রস্থ নেয় তবে নেক্সাস 7 ট্যাবলেটে এটি কেন্দ্রে থাকে এবং পূর্ণ স্ক্রিনের প্রস্থকে কভার করে না।

নেক্সাস 7 স্ক্রিনশট নেক্সাস 7 নেক্সাস 4 স্ক্রিনশট নেক্সাস 4


ঠিক একই সমস্যা নিয়ে 6 ঘন্টা লড়াই করে যাচ্ছিলাম, তবে আমি বুঝতে পারি নি যে এটি কেবল ট্যাবগুলির সাথেই সমস্যা হয়েছে ...
স্ট্যাকওভারফ্লোতে ভাবেন

দয়া করে প্রশ্নগুলিতে আরও ট্যাগ যুক্ত করার চেষ্টা করুন ... (সুতরাং আমার মতো লোকের পক্ষে আরও সহায়ক হবে), কারণ এই প্রশ্নটি আমার গুগল অনুসন্ধান তালিকার তৃতীয় পৃষ্ঠায় আমি পেয়েছি
শিরিশ হার্ভাডে

উত্তর:


594

কাইজি থেকে নেওয়া একটি "সরল" উত্তর কেবল app:tabMaxWidth="0dp"আপনার TabLayoutএক্সএমএল-এ যুক্ত করা হবে:

<android.support.design.widget.TabLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabMaxWidth="0dp"
            app:tabGravity="fill"
            app:tabMode="fixed" />

19
আমার যদি এটি স্ক্রোলযোগ্য হওয়ার দরকার হয় তবে কী হবে? স্ক্রোল সমর্থন করার জন্য ট্যাবমড পরিবর্তন করা এই সমাধানটিকে ভেঙে দেয়।
টিয়াগো

3
স্ক্রোলযোগ্য জন্য কোন সমাধান?
sunlover3

5
হাই .. আমি এটি যোগ করার চেষ্টা করেছি। তবে একক ট্যাব ট্যাব বিন্যাসের পুরো প্রস্থ গ্রহণ করছে না।
রাহুল

3
ট্যাবমড সেট না করা থাকলে এই সমাধানটিও কাজ করে। স্ক্রোলযোগ্য ট্যাপমডটি পূর্ণ মাধ্যাকর্ষণ এবং 0 ডিপি সর্বোচ্চ প্রস্থের বৈশিষ্ট্যগুলিকে সমর্থন করে বলে মনে হয় না।
জুলিও মেন্ডোজা 21

3
যদিও এটি কেন ঘটে? এটা কি ডিফল্ট আচরণ? বা কিছু আমি ভাল ব্যবহার করিনি? মাঝখানে ট্যাবগুলি সেট করার জন্য এটি গাইডলাইনের একটি অংশ? 3+ ট্যাব ব্যবহার করার সময় এটি আমার জন্য ঘটে না। শুধুমাত্র 2 টি ট্যাবের জন্য।
অ্যান্ড্রয়েড বিকাশকারী

91

আমারও একই সমস্যা ছিল এবং আমি ট্যাবলআউট স্টাইলটি পরীক্ষা করে দেখেছি এবং এটি দেখতে পেয়েছি যে এর ডিফল্ট স্টাইলটি Widget.Design.TabLayoutবিভিন্ন রূপায়ণ (সাধারণ, ল্যান্ডস্কেপ এবং sw600dp) রয়েছে।

আমাদের যা প্রয়োজন তা হ'ল ট্যাবলেটগুলির জন্য একটি (sw600dp) যার নিম্নলিখিত প্রয়োগ রয়েছে:

<style name="Widget.Design.TabLayout" parent="Base.Widget.Design.TabLayout">
        <item name="tabGravity">center</item>
        <item name="tabMode">fixed</item>
 </style>

এই স্টাইল থেকে আমরা " ট্যাবগ্রাভিটি " ব্যবহার করব (যা সম্ভাব্য মানগুলি "কেন্দ্র" বা "ভরাট") "ফিল" মানটি ব্যবহার করে করব।

তবে আমাদের আরও গভীরে যেতে হবে, এবং তারপরে আমরা দেখতে পাচ্ছি যে এটিটি প্রসারিত Base.Widget.Design.TabLayout, যার বাস্তবায়নটি:

<style name="Base.Widget.Design.TabLayout" parent="android:Widget">
    <item name="tabMaxWidth">@dimen/tab_max_width</item>
    <item name="tabIndicatorColor">?attr/colorAccent</item>
    <item name="tabIndicatorHeight">2dp</item>
    <item name="tabPaddingStart">12dp</item>
    <item name="tabPaddingEnd">12dp</item>
    <item name="tabBackground">?attr/selectableItemBackground</item>
    <item name="tabTextAppearance">@style/TextAppearance.Design.Tab</item>
    <item name="tabSelectedTextColor">?android:textColorPrimary</item>
</style>

সুতরাং, এই স্টাইল থেকে আমাদের " ট্যাবম্যাক্সউইথ " ওভাররাইড করতে হবে । আমার ক্ষেত্রে আমি এটি সেট করেছি 0dp, সুতরাং এর কোনও সীমা নেই।

এবং আমার স্টাইলটি দেখতে এমন দেখাচ্ছে:

<style name="MyTabLayout" parent="Widget.Design.TabLayout">
        <item name="tabGravity">fill</item>
        <item name="tabMaxWidth">0dp</item>
</style>

এবং তারপরে ট্যাব বারটি পুরো পর্দাটি পাশ থেকে এক পাশ দিয়ে পূর্ণ করবে।


1
দুর্দান্ত আবিষ্কার .. মূলে যাচ্ছি। তবে দয়া করে উপরে সঠিক উত্তরটি হাইলাইট করুন, যে সমস্ত উত্তর পড়তে চান না এমন কাউকে পাওয়া সহজ হবে
শিরিশ হার্ভাড

দুর্দান্ত সমাধান, এপিআইর মতো দেখতে কেমন লাগে আপনি অন্তর্নিহিত শৈলীটি পরিবর্তন না করেই এটি নিয়ন্ত্রণ করতে পারেন ird দেখে মনে হচ্ছে ট্যাবম্যাক্সউইথটি আসল অপরাধী
কানড্রয়েড

3
এটি শার্লকের একটি পর্বের মতো। ধন্যবাদ!!
লিসা ওয়ারে

29

স্ক্রোলযোগ্য সমাধান: (ট্যাবলআউট.মোড।

পদক্ষেপ 1: শৈলী.এক্সএমএল

<style name="tabCustomStyle" parent="Widget.Design.TabLayout">
            <item name="tabGravity">fill</item>
            <item name="tabMaxWidth">0dp</item>
            <item name="tabIndicatorColor">#FFFEEFC4</item>
            <item name="tabIndicatorHeight">2dp</item>
            <item name="tabTextAppearance">@style/MyCustomTabTextAppearance</item>
            <item name="tabSelectedTextColor">#FFFEEFC4</item>
        </style>

        <style name="MyCustomTabTextAppearance" parent="TextAppearance.Design.Tab">
            <item name="android:textSize">@dimen/tab_text_size</item>
            <item name="android:textAppearance">@style/TextAppearance.roboto_medium</item>
            <item name="textAllCaps">true</item>
        </style>
        <style name="TextAppearance.roboto_medium" parent="android:TextAppearance">
            <item name="android:fontFamily">sans-serif-medium</item>
        </style>

পদক্ষেপ 2: আপনার এক্সএমএল লেআউট

<android.support.design.widget.TabLayout
            android:id="@+id/sliding_tabs"
            style="@style/tabCustomStyle"
            android:layout_width="match_parent"
            android:layout_height="@dimen/tab_strip_height"
            android:background="@color/your_color"
            app:tabMode="scrollable"
            app:tabTextColor="@color/your_color" />

পদক্ষেপ 3: আপনার ক্রিয়াকলাপ / খণ্ডে যেখানে কখনও ট্যাব থাকে।

/**
     * To allow equal width for each tab, while (TabLayout.MODE_SCROLLABLE)
     */
    private void allotEachTabWithEqualWidth() {

        ViewGroup slidingTabStrip = (ViewGroup) mTabLayout.getChildAt(0);
        for (int i = 0; i < mTabLayout.getTabCount(); i++) {
            View tab = slidingTabStrip.getChildAt(i);
            LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) tab.getLayoutParams();
            layoutParams.weight = 1;
            tab.setLayoutParams(layoutParams);
        }

    }

এটি কেবলমাত্র 1 টিরও বেশি ট্যাব নিয়ে কাজ করেছে, যদি আমাদের কেবল একটি ট্যাব থাকে তবে ট্যাবটি ট্যাব-লেআউটটি পূরণ করে না। এই সমস্যাটি সমাধান করতে আমি অ্যাপ যুক্ত করেছি: ট্যাবম্যাক্সউইথ = "1000 ডিপি" এবং এটি কার্যকর হয়েছে।
jzeferino

এটি আমার পক্ষে সবচেয়ে ভাল কাজ করেছে। আমার কাস্টম ট্যাব বিন্যাস শ্রেণিতে আমি addTabপ্রতিটি ট্যাব যুক্ত হওয়ার সাথে সাথে ওভাররড করে ওজন সেট করে রেখেছি । override fun addTab(tab: Tab, position: Int, setSelected: Boolean) { super.addTab(tab, position, setSelected) allotEachTabWithEqualWidth() }
জাস্টিন লি

15

ট্যাবগুলিকে পূর্ণ প্রস্থ (সমান আকারে বিভক্ত) নিতে বাধ্য করতে, নীচের TabLayoutদৃশ্যে প্রয়োগ করুন :

TabLayout tabLayout = (TabLayout) findViewById(R.id.your_tab_layout);
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
tabLayout.setTabMode(TabLayout.MODE_FIXED);

2
কেবলমাত্র লোকেদের TabLayoutজানাতে app:tabMode=“scrollable”, এটি আপনার সাথে সেট করা থাকলে এটি কাজ করে না , এর ফলে ট্যাবগুলি স্থির দৈর্ঘ্যে পরিণত হবে (দীর্ঘ শব্দগুলি মোড়ানো হবে) এবং ট্যাবগুলি আর স্লাইড হবে না, মূলত ট্যাবগুলিকে আবার "স্থির" করে তোলে।
সাকিবয়

5

এটি আপনাকে অবশ্যই চেষ্টা করতে হবে সহায়ক

 <android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabMaxWidth="0dp"
        app:tabGravity="fill"
        app:tabMode="fixed"
        app:tabIndicatorColor="@color/white"
        app:tabSelectedTextColor="@color/white"
        app:tabTextColor="@color/orange" />

4
<android.support.design.widget.TabLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabMaxWidth="0dp"
            app:tabGravity="fill"
            app:tabMode="fixed" />

আমার জন্য কাজ। এটিও আছেxmlns:app="http://schemas.android.com/apk/res-auto"


3

আমার জন্য নিম্নলিখিত কোডটি কাজ করেছিল এবং যথেষ্ট ছিল।

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

2

সমাধানের জন্য কোড নীচে চেক করুন।

নীচে লেআউট কোডটি রয়েছে:

<com.yourpackage.CustomTabLayout
    android:id="@+id/tabs"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="@color/off_white"
    app:tabIndicatorColor="@color/primaryColor"
    app:tabIndicatorHeight="3dp"
    app:tabMode="scrollable"
    app:tabPaddingEnd="0dp"
    app:tabPaddingStart="0dp" />

দ্রষ্টব্য, গতিশীল ট্যাব গণনার জন্য, সেটট্যাব নাম্বারগুলিকে (ট্যাবকাউন্ট) কল করতে ভুলবেন না।

import android.content.Context;
import android.support.design.widget.TabLayout;
import android.util.AttributeSet;
import android.util.
import java.lang.reflect.Field;

public class CustomTabLayout extends TabLayout
{
    private static final int WIDTH_INDEX = 0;
    private int DIVIDER_FACTOR = 3;
    private static final String SCROLLABLE_TAB_MIN_WIDTH = "mScrollableTabMinWidth";

    public CustomTabLayout(Context context) {
        super(context);
        initTabMinWidth();
    }

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

    public CustomTabLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initTabMinWidth();
    }

    public void setTabNumbers(int num)
    {
        this.DIVIDER_FACTOR = num;
        initTabMinWidth();
    }

    private void initTabMinWidth()
    {
        int[] wh = getScreenSize(getContext());
        int tabMinWidth = wh[WIDTH_INDEX] / DIVIDER_FACTOR;

        Log.v("CUSTOM TAB LAYOUT", "SCREEN WIDTH = " + wh[WIDTH_INDEX] + " && tabTotalWidth = " + (tabMinWidth*DIVIDER_FACTOR) + " && TotalTabs = " + DIVIDER_FACTOR);

        Field field;
        try {
            field = TabLayout.class.getDeclaredField(SCROLLABLE_TAB_MIN_WIDTH);
            field.setAccessible(true);
            field.set(this, tabMinWidth);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static final int WIDTH_INDEX = 0;
    private static final int HEIGHT_INDEX = 1;

    public static int[] getScreenSize(Context context) {
        int[] widthHeight = new int[2];
        widthHeight[WIDTH_INDEX] = 0;
        widthHeight[HEIGHT_INDEX] = 0;

        try {
            WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
            Display display = windowManager.getDefaultDisplay();

            Point size = new Point();
            display.getSize(size);
            widthHeight[WIDTH_INDEX] = size.x;
            widthHeight[HEIGHT_INDEX] = size.y;

            if (!isScreenSizeRetrieved(widthHeight))
            {
                DisplayMetrics metrics = new DisplayMetrics();
                display.getMetrics(metrics);
                widthHeight[0] = metrics.widthPixels;
                widthHeight[1] = metrics.heightPixels;
            }

            // Last defense. Use deprecated API that was introduced in lower than API 13
            if (!isScreenSizeRetrieved(widthHeight)) {
                widthHeight[0] = display.getWidth(); // deprecated
                widthHeight[1] = display.getHeight(); // deprecated
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return widthHeight;
    }

    private static boolean isScreenSizeRetrieved(int[] widthHeight) {
        return widthHeight[WIDTH_INDEX] != 0 && widthHeight[HEIGHT_INDEX] != 0;
    }
}

Https://medium.com/@elsenovraditya/set-tab-minimum-width-of-scrollable-tablayout-programmatically-8146d6101efe থেকে রেফারেন্স নেওয়া হয়েছে


2

স্ক্রোলযোগ্য (কোটলিন) এর সমাধান

এক্সএমএলে:

     <com.google.android.material.tabs.TabLayout
            android:id="@+id/home_tab_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabMaxWidth="0dp"
            app:tabMode="scrollable"
            android:fillViewport="true"
            app:tabGravity="fill" />

কোটলিনে:

আমার ক্ষেত্রে যদি 3 টিরও কম ট্যাব থাকে তবে আমি সমান স্থান বরাদ্দ করি।

দ্রষ্টব্য: শর্ত যদি আপনার প্রয়োজন অনুসারে হয়

        if(list.size <= 3){
          allotEachTabWithEqualWidth(your_tab_layout)
        }

     fun allotEachTabWithEqualWidth(tabLayout: TabLayout) {
        mTabLayout.tabMode=  TabLayout.MODE_FIXED
        val slidingTabStrip = tabLayout.getChildAt(0) as ViewGroup
        for (i in 0 until tabLayout.getTabCount()) {
            val tab = slidingTabStrip.getChildAt(i)
            val layoutParams = tab.layoutParams as LinearLayout.LayoutParams
            layoutParams.weight = 1f
            tab.layoutParams = layoutParams
        }

    }

1

কেন সব ব্যস্ত কাজ? শুধু করা app:tabMode="scrollable"এক্সএমএল আপনার TabLayout হবে। এটাই.

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


1
3 টি ট্যাব থাকলে কী হবে? যা স্ক্রিনে ফিট হবে না (ট্যাবগুলি গতিশীল যা সার্ভার এপিআই থেকে আগত) ট্যাবগুলি গণনার সময় জানা যায় ..
রাম প্রকাশ ভাট

তারপরে আপনি এমনকি প্রোগ্রামের মতো tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);এটিও সেট করতে পারেন এছাড়াও ট্যাবলেটের জন্য সেট করার জন্য এটি কেবলমাত্র একটি সম্পত্তি যা আপনি কতগুলি ট্যাব স্থিতিশীল বা গতিশীল যুক্ত করছেন তা বিবেচ্য নয়।
আলী আকরাম

এটি পাঠ্যের আকার অনুসারে ট্যাব প্রস্থ তৈরি করবে my চিত্র সহ আমার সম্পাদিত উত্তরটি দেখুন।
আলী আকরাম

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

1

আমার এই সমস্যার পরিবর্তনে আমার কাছে মাঝারি আকারের 3 টি ট্যাব রয়েছে যা ট্যাবলেটগুলিতে সম্পূর্ণ প্রস্থ গ্রহণ করে নি। ট্যাবলেটগুলিতে স্ক্রোলযোগ্য হওয়ার জন্য আমার ট্যাবগুলির প্রয়োজন হয়নি, যেহেতু ট্যাবলেটগুলি কোনও স্ক্রলিং ছাড়াই সমস্ত একসাথে প্রদর্শন করার জন্য ট্যাবলেটগুলি যথেষ্ট বড়। তবে ট্যাবগুলিকে ফোনে স্ক্রোলযোগ্য করার দরকার ছিল কারণ ফোনগুলি সমস্ত ট্যাব একসাথে প্রদর্শন করার জন্য খুব ছোট।

আমার ক্ষেত্রে সর্বোত্তম সমাধানটি ছিল একটি res/layout-sw600dp/main_activity.xmlফাইল যুক্ত করা, যেখানে প্রাসঙ্গিক ট্যাবললআউট থাকতে পারে app:tabGravity="fill"এবং app:tabMode="fixed"। কিন্তু আমার নিয়মিত মধ্যে res/layout/main_activity.xml, আমি বাদ app:tabGravity="fill"এবং app:tabMode="fixed", এবং ছিল app:tabMode="scrollable"পরিবর্তে।


0

দয়া করে মনে রাখবেন আপনারও সেট করা দরকার

  app:tabPaddingStart="-1dp"
  app:tabPaddingEnd="-1dp"

সমস্ত স্থান পূরণ করতে


স্ট্যাক ওভারফ্লোতে আপনাকে স্বাগতম। ট্যুর নিন দয়া করে । এটি একটি প্রশ্নোত্তর সাইট, কোনও আলোচনার ফোরাম নয়। এই বিভাগটি শুধুমাত্র সম্পূর্ণ উত্তরের জন্য। একবার জিজ্ঞাসা করে এবং উত্তর দিয়ে আপনি 50 টি খ্যাতি পয়েন্ট অর্জন করলে আপনি অন্যান্য ব্যবহারকারীর প্রশ্ন ও উত্তর সম্পর্কে মন্তব্য করতে সক্ষম হবেন ।
ক্রিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.