android:textAllCaps="false" 不适用于 TabLayout 设计支持
Posted
技术标签:
【中文标题】android:textAllCaps="false" 不适用于 TabLayout 设计支持【英文标题】:android:textAllCaps="false" not working for TabLayout design Support 【发布时间】:2015-09-26 12:11:39 【问题描述】:我在android.support.design.widget.TabLayout
中设置了android:textAllCaps="false"
,认为它只显示全部大写的标签标题。
如何删除所有大写字母?
【问题讨论】:
我相信你必须在继承 TabLayout 基本样式的特定样式中定义它。 @Vannen 可以告诉我一些解决这个问题的代码吗? 请使用editText.setFilters(new InputFilter[]new InputFilter.AllCaps()); 【参考方案1】:设计库 23.2.0+ 更新
原始答案不适用于设计库 23.2.0 或更高版本。感谢@fahmad6 在评论中指出,如果有人错过了该评论,我会把它放在这里。您需要将textAllCaps
和android:textAllCaps
都设置为false
以禁用所有大写设置。
<style name="MyCustomTextAppearance" parent="TextAppearance.Design.Tab">
<item name="textAllCaps">false</item>
<item name="android:textAllCaps">false</item>
</style>
原始答案
默认情况下,选项卡由 TabLayout 创建,将 textAllCaps 属性设置为 true,您必须定义一个样式,使该标志为 false。
<style name="MyCustomTabLayout" parent="Widget.Design.TabLayout">
<item name="tabTextAppearance">@style/MyCustomTextAppearance</item>
</style>
<style name="MyCustomTextAppearance" parent="TextAppearance.Design.Tab">
<item name="textAllCaps">false</item>
</style>
【讨论】:
你的答案看起来正确,但我不知道为什么,它对我不起作用 @Moinkhan 它正在工作。使用这种方式 style="@style/MyCustomTabLayout" 这里的重要部分是答案使用textAllCaps
,而问题使用android:textAllCaps
。
有趣的是,由于我无法解释的原因,我必须明确添加 both android:textAllCaps
和 textAllCaps
并将它们设置为 false,以便我的文本根据需要显示(即“本地”而不是“本地”)。单独尝试任何一个都没有成功。
更新:它应该被用作app:tabTextAppearance="@style/MyCustomTextAppearance"
然后它会工作【参考方案2】:
@Paresh Mayani 的回答是正确的,但是您只能创建选项卡样式
<style name="MyCustomTextAppearance" parent="TextAppearance.Design.Tab">
<item name="textAllCaps">false</item>
</style>
并使用它
<android.support.design.widget.TabLayout
app:tabTextAppearance="@style/MyCustomTextAppearance"
.../>
【讨论】:
@Muhammad Umair Shafique 的解决方案正在发挥作用。我们必须使用 'app:tabTextAppearance' 属性而不是 'style' 属性。 这似乎比公认的答案更好,因为只创建了一种样式。【参考方案3】:使用这个属性app:tabTextAppearance="@android:style/TextAppearance.Widget.TabWidget"
它会起作用的。
<android.support.design.widget.TabLayout
android:id="@+id/tablayout"
android:layout_
android:layout_
android:layout_gravity="center"
app:tabGravity="fill"
app:tabTextAppearance="@android:style/TextAppearance.Widget.TabWidget"
app:tabIndicatorColor="@color/colorPrimary"
app:tabMode="fixed"
app:tabPaddingStart="0dp" />
【讨论】:
这里只回答视图元素内的纯xml - 无需为此添加外部样式或在Java中做任何事情。很好 - 谢谢 哦,真的,因为这家伙擅长复制&过去?!问题的回答与此线程中的上述一个答案相同,并且该答案归功于所有者,而此人则冒充所有者。这是***.com/a/36191045/5636313上方的答案@ 我看不到这个答案@Farid【参考方案4】:https://***.com/a/34678235/1025379
<android.support.design.widget.TabLayout
app:tabTextAppearance="@android:style/TextAppearance.Widget.TabWidget"
/>
【讨论】:
确认,在这个页面上没有其他答案对我有用,但是这个。我的项目有 minSdkVersion=16、targetSdkVersion=26、设计库版本 26.0.0-alpha1,我使用的是android.support.design.widget.TabLayout
。
不适用于com.google.android.material.tabs.TabLayout
【参考方案5】:
在我的例子中,有两个变体起作用:
1) 博格丹 (susemi99):
<android.support.design.widget.TabLayout
app:tabTextAppearance="@android:style/TextAppearance.Widget.TabWidget"
/>
2) 帕雷什·玛雅尼 (Paresh Mayani)。我想同时拥有android:textAllCaps="false"
和android:textSize="15sp"
,所以他的旧方法有效。
在styles.xml
中写入(父级可能会有所不同,例如,“@android:style/TextAppearance.Widget.TabWidget”、“TextAppearance.Design.Tab”):
<style name="TabLayout" parent="Widget.Design.TabLayout">
<item name="tabIndicatorColor">@color/color_blue</item>
<item name="tabSelectedTextColor">@color/color_blue</item>
<item name="tabTextColor">@color/black</item>
<item name="tabTextAppearance">@style/TabLayoutTextAppearance</item>
</style>
<style name="TabLayoutTextAppearance" parent="TextAppearance.Design.Tab">
<item name="android:textSize">15sp</item>
<item name="textAllCaps">false</item>
<item name="android:textAllCaps">false</item>
</style>
在布局中应用这种样式:
<android.support.design.widget.TabLayout
android:id="@+id/tab_layout"
android:layout_
android:layout_
style="@style/TabLayout"
/>
【讨论】:
【参考方案6】:对于那些无法得到其他答案的人。
当您有单行制表符文本时,定义样式可以正常工作。 如果您仔细查看TablayAut,您会发现它正在使用字段 design_tab_text_size_2line 当标签有多行时。
我能找到影响此字段的唯一方法是在您的 dimen 文件中覆盖它。
所以把它放在你的 values/dimens.xml 中
<dimen name="design_tab_text_size_2line" tools:override="true">10sp</dimen>
希望对你有帮助。
【讨论】:
谢谢你这工作!只是我注意到的一件小事-当您将值作为@dimen/10sp 传递时,会显示编译错误。您应该只传递您需要的 sp,而不使用“@dimen/”前缀(例如 10sp)。 谢谢小费 :) 很好找到@EvrenOzturk。为你竖起大拇指。 很棒的发现!!!!!【参考方案7】:这对我来说只需要一行
<android.support.design.widget.TabLayout
app:tabTextAppearance="@android:style/TextAppearance.Widget.TabWidget"/>
【讨论】:
【参考方案8】:这是一个简单的解决方案....享受
for (int tabIndex = 0; tabIndex <tabLayout.getTabCount() ; tabIndex++)
TextView tabTextView = (TextView)(((LinearLayout)((LinearLayout)tabLayout.getChildAt(0)).getChildAt(tabIndex)).getChildAt(1));
tabTextView.setAllCaps(false);
【讨论】:
【参考方案9】:更改: <item name="android:textAllCaps">false</item>
与: <item name="textAllCaps">false</item>
【讨论】:
【参考方案10】:这对我有用...
<style name="TabLayoutStyle" parent="Widget.Design.TabLayout">
<item name="tabTextAppearance">@style/TabTextAppearance</item>
</style>
<style name="TabTextAppearance" parent="TextAppearance.Design.Tab">
<item name="textAllCaps">false</item>
</style>
【讨论】:
【参考方案11】:在 14 之前的版本中,您需要设置(由 Paresh Mayani 评论):
<style name="MyCustomTabLayout" parent="Widget.Design.TabLayout">
<item name="tabTextAppearance">@style/MyCustomTextAppearance</item>
</style>
<style name="MyCustomTextAppearance" parent="TextAppearance.Design.Tab">
<item name="textAllCaps">false</item>
</style>
但是,如果android版本等于或大于14,则需要设置:
<item name="android:textAllCaps">false</item>
所以,如果你需要兼容 14 之前和之后的版本,你还需要创建一个文件夹 values-v14,并在该文件夹中创建一个文件 styles.xml,内容为:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">
<style name="MyCustomTextAppearance" parent="TextAppearance.Design.Tab">
<item name="android:textAllCaps">false</item>
</style>
</resources>
【讨论】:
【参考方案12】:试试下面的方法,你可以在TabLayout
中实现TextView
的所有方法
private void setCustomTab()
ViewGroup vg = (ViewGroup) mTabLayout.getChildAt(0);
int tabsCount = vg.getChildCount();
for (int j = 0; j < tabsCount; j++)
ViewGroup vgTab = (ViewGroup) vg.getChildAt(j);
int tabChildsCount = vgTab.getChildCount();
for (int i = 0; i < tabChildsCount; i++)
View tabViewChild = vgTab.getChildAt(i);
if (tabViewChild instanceof TextView)
((TextView) tabViewChild).setTypeface(ResourcesCompat.getFont(this,R.font.montserrat_medium));
((TextView) tabViewChild).setAllCaps(false);
希望对你有帮助。
【讨论】:
【参考方案13】:您也可以在 Java 代码中执行此操作。如果您使用的是 SlidingTabLayout,请查看此示例:
protected TextView createDefaultTabView(Context context)
TextView textView = new TextView(context);
textView.setGravity(Gravity.CENTER);
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, TAB_VIEW_TEXT_SIZE_SP);//see line 38 above change the value their in TAB_VIEW_TEXT_SIZE_SP.
textView.setTypeface(Typeface.DEFAULT);//From DEFAULT_BOLD
textView.setTextColor(Color.parseColor("#536DFE"));//Text color of the words in the tabs. Indigo A200
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
// If we're running on Honeycomb or newer, then we can use the Theme's
// selectableItemBackground to ensure that the View has a pressed state
TypedValue outValue = new TypedValue();
getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true);
textView.setBackgroundResource(outValue.resourceId);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH)
// If we're running on ICS or newer, enable all-caps to match the Action Bar tab style
textView.setAllCaps(true);
int padding = (int)(TAB_VIEW_PADDING_DIPS * getResources().getDisplayMetrics().density);
textView.setPadding(padding, padding, padding, padding);
return textView;
注意 textView.setAllCaps() 有 true 作为周长:
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH)
// If we're running on ICS or newer, enable all-caps to match the Action Bar tab style
textView.setAllCaps(true);
当我将其更改为 (false) 时,它为我解决了问题:
textView.setAllCaps(false);
我用于选项卡的字符串资源文件看起来像这样:
<string name="tab_title">Title with capital and smaller case</string>
但是,如果它有像 >TITLE WITH ALL CAPS
我没有做其他更改。
值得注意的是,您也可以设置 textView.setAllCaps(false),但这对我的情况没有任何影响。我刚刚注释掉了 textView.setAllCaps(true)。
【讨论】:
【参考方案14】:只需将其添加到您的自定义样式文件中
<item name="android:textStyle">normal</item>
我阅读了上述所有解决方案,都导致了这一点。
【讨论】:
【参考方案15】:在 XML 文件中更改属性在 Android 11 (SDK 30) 中不起作用。这是我用来使用标签标签单独设置标签的代码。它比为选项卡中的所有文本字段设置新样式或依赖现有选项卡布局更安全,因为当前选项卡设计可以通过 Android 更改。此方法假定在调用以下函数之前已设置选项卡文本。调用中的第二个参数,txt是一个tab标签。
private fun setTabStyle(tabs: TabLayout, txt: String)
val av = ArrayList<View?>()
tabs.findViewsWithText(av, txt, View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION )
if (av.count() > 0)
val avt = ArrayList<View?>()
(av[0] as? ViewGroup)?.let
for ( i in 0 until it.childCount)
val tv = it.getChildAt(i) as? TextView
tv?.let t ->
if (tv.text == txt)
t.isAllCaps = false
t.setTextSize(TypedValue.COMPLEX_UNIT_SP, 11.toFloat())
【讨论】:
【参考方案16】:长话短说(以编程方式)...
/**
* @param view Target TabLayout view
* @param caps Present the text caps style
*/
public static void setAllCaps(View view, boolean caps)
if (view instanceof ViewGroup)
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++)
setAllCaps(((ViewGroup) view).getChildAt(i),caps);
else if (view instanceof TextView) ((TextView) view).setAllCaps(caps);
像这样拨打setAllCaps
:
tabLayout.addTab(tabLayout.newTab().setText("Recent"));
tabLayout.addTab(tabLayout.newTab().setText("New"));
setAllCaps(tabLayout,false);
【讨论】:
以上是关于android:textAllCaps="false" 不适用于 TabLayout 设计支持的主要内容,如果未能解决你的问题,请参考以下文章
第一行代码第二版(郭霖著)笔记之第三章(UI开发的点点滴滴)