আমার এই পোস্টটি 29/05/2015 আপডেটের হিসাবে সেটআপ ট্যাব রয়েছে । ট্যাবগুলি আমার নেক্সাস 4 মোবাইলে সম্পূর্ণ প্রস্থ নেয় তবে নেক্সাস 7 ট্যাবলেটে এটি কেন্দ্রে থাকে এবং পূর্ণ স্ক্রিনের প্রস্থকে কভার করে না।
নেক্সাস 7 স্ক্রিনশট নেক্সাস 4 স্ক্রিনশট
আমার এই পোস্টটি 29/05/2015 আপডেটের হিসাবে সেটআপ ট্যাব রয়েছে । ট্যাবগুলি আমার নেক্সাস 4 মোবাইলে সম্পূর্ণ প্রস্থ নেয় তবে নেক্সাস 7 ট্যাবলেটে এটি কেন্দ্রে থাকে এবং পূর্ণ স্ক্রিনের প্রস্থকে কভার করে না।
নেক্সাস 7 স্ক্রিনশট নেক্সাস 4 স্ক্রিনশট
উত্তর:
কাইজি থেকে নেওয়া একটি "সরল" উত্তর কেবল 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" />
আমারও একই সমস্যা ছিল এবং আমি ট্যাবলআউট স্টাইলটি পরীক্ষা করে দেখেছি এবং এটি দেখতে পেয়েছি যে এর ডিফল্ট স্টাইলটি 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: শৈলী.এক্সএমএল
<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);
}
}
addTab
প্রতিটি ট্যাব যুক্ত হওয়ার সাথে সাথে ওভাররড করে ওজন সেট করে রেখেছি । override fun addTab(tab: Tab, position: Int, setSelected: Boolean) { super.addTab(tab, position, setSelected) allotEachTabWithEqualWidth() }
ট্যাবগুলিকে পূর্ণ প্রস্থ (সমান আকারে বিভক্ত) নিতে বাধ্য করতে, নীচের TabLayout
দৃশ্যে প্রয়োগ করুন :
TabLayout tabLayout = (TabLayout) findViewById(R.id.your_tab_layout);
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
tabLayout.setTabMode(TabLayout.MODE_FIXED);
TabLayout
জানাতে app:tabMode=“scrollable”
, এটি আপনার সাথে সেট করা থাকলে এটি কাজ করে না , এর ফলে ট্যাবগুলি স্থির দৈর্ঘ্যে পরিণত হবে (দীর্ঘ শব্দগুলি মোড়ানো হবে) এবং ট্যাবগুলি আর স্লাইড হবে না, মূলত ট্যাবগুলিকে আবার "স্থির" করে তোলে।
এটি আপনাকে অবশ্যই চেষ্টা করতে হবে সহায়ক
<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" />
<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"
আমার জন্য নিম্নলিখিত কোডটি কাজ করেছিল এবং যথেষ্ট ছিল।
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabGravity="fill"/>
সমাধানের জন্য কোড নীচে চেক করুন।
নীচে লেআউট কোডটি রয়েছে:
<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 থেকে রেফারেন্স নেওয়া হয়েছে
স্ক্রোলযোগ্য (কোটলিন) এর সমাধান
এক্সএমএলে:
<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
}
}
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
এটিও সেট করতে পারেন এছাড়াও ট্যাবলেটের জন্য সেট করার জন্য এটি কেবলমাত্র একটি সম্পত্তি যা আপনি কতগুলি ট্যাব স্থিতিশীল বা গতিশীল যুক্ত করছেন তা বিবেচ্য নয়।
আমার এই সমস্যার পরিবর্তনে আমার কাছে মাঝারি আকারের 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"
পরিবর্তে।
দয়া করে মনে রাখবেন আপনারও সেট করা দরকার
app:tabPaddingStart="-1dp"
app:tabPaddingEnd="-1dp"
সমস্ত স্থান পূরণ করতে