मैंने इसे प्राप्त करने के लिए एक AdaptiveTabLayout वर्ग बनाया। यह एकमात्र तरीका था जो मुझे वास्तव में समस्या को हल करने, सवाल का जवाब देने और अन्य समस्याओं से बचने के लिए मिला था।
टिप्पणियाँ:
- फोन / टैबलेट लेआउट संभालती है।
- उन मामलों को संभालता है, जहां के लिए पर्याप्त जगह
MODE_SCROLLABLE
नहीं है , लेकिन इसके लिए पर्याप्त जगह नहीं है MODE_FIXED
। यदि आप इस मामले को नहीं संभालते हैं, तो यह कुछ उपकरणों पर होने वाला है, आपको कुछ टैब में विभिन्न पाठ आकार या पाठ की दो पंक्तियाँ दिखाई देंगी, जो खराब दिखती हैं।
- यह वास्तविक उपाय प्राप्त करता है और कोई भी धारणा नहीं बनाता है (जैसे स्क्रीन 360dp चौड़ी या जो भी हो ...)। यह वास्तविक स्क्रीन आकार और वास्तविक टैब आकार के साथ काम करता है। इसका अर्थ है अनुवाद के साथ अच्छी तरह से काम करता है क्योंकि किसी भी टैब का आकार ग्रहण नहीं करता है, टैब को माप मिलता है।
- अतिरिक्त काम से बचने के लिए ऑन-लाईट चरण में अलग-अलग पास के साथ सौदा।
- लेआउट की चौड़ाई
wrap_content
xml पर होनी चाहिए । Xml पर कोई भी मोड या गुरुत्वाकर्षण सेट न करें।
AdaptiveTabLayout.java
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;
}
}
और यह DeviceUtils वर्ग है:
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>
सार
समस्याएँ / मदद के लिए पूछें:
logcat:
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
मुझे यकीन नहीं है कि इसे कैसे हल किया जाए। कोई सुझाव?
- TabLayout बच्चे के उपाय करने के लिए, मैं कुछ कास्टिंग और धारणाएं बना रहा हूं (जैसे बच्चा एक LinearLayout है जिसमें अन्य दृश्य हैं ....) इससे डिज़ाइन समर्थन लाइब्रेरी अद्यतनों में और समस्याएँ हो सकती हैं। एक बेहतर दृष्टिकोण / सुझाव?