এটি অর্জনের জন্য আমি একটি অ্যাডাপটিভ ট্যাবলআউট ক্লাস তৈরি করেছি। সমস্যাটি সমাধান করার, প্রশ্নের উত্তর দেওয়ার এবং এড়াতে / কার্যক্ষম সমস্যাগুলি এড়াতে কেবল এই একমাত্র উপায় ছিল যা অন্য উত্তরগুলি এখানে দেয় না।
মন্তব্য:
- ফোন / ট্যাবলেট লেআউটগুলি পরিচালনা করে।
- এমন জায়গাগুলি পরিচালনা করে যেখানে পর্যাপ্ত জায়গা নেই
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ালাই এবং অনুমান করছি (শিশুটির মতো অন্যান্য মতামত সম্বলিত লিনিয়ারলআউট ....) এটি পরবর্তী ডিজাইন সহায়তা লাইব্রেরি আপডেটগুলিতে সমস্যা সৃষ্টি করতে পারে। একটি ভাল পদ্ধতির / পরামর্শ?