Android 4.3中的自定义ActionBar文本外观

时间:2014-02-13 20:19:54

标签: android android-actionbar

我已使用以下代码

在操作栏上自定义了我的应用程序标题的外观
<style name="myTheme.ActionBar.Text" parent="@android:style/TextAppearance">
    <item name="android:textColor">#ff2d2d2d</item>
    <item name="android:textSize">26sp</item>
    <item name="android:fontFamily">sans-serif-condensed</item>
    <item name="android:textAllCaps">true</item>
    <item name="android:textStyle">bold</item>
</style>

无论如何,在我测试过的大多数设备中,一切都运行良好(3个要精确)但是1,运行Android 4.3(Sony Xperia Z)的设备没有应用样式。我后来在运行4.3的模拟器上测试了它并得到了相同的结果。

enter image description here

我有办法解决这个问题吗?

以下是该应用的完整样式

<?xml version="1.0" encoding="utf-8"?>

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="android:Theme.Holo.Light">

        <item name="android:actionBarStyle">@style/myTheme.ActionBar</item>
        <!-- Customize your theme here. -->
        <item name="android:textViewStyle">@style/RobotoTextViewStyle</item>
        <item name="android:buttonStyle">@style/RobotoButtonStyle</item>
        <item name="android:editTextBackground">@drawable/apptheme_edit_text_holo_dark</item>

        <item name="android:actionBarItemBackground">@drawable/nav_list_selector</item>

    </style>


    <style name="RobotoTextViewStyle" parent="android:Widget.TextView">
        <item name="android:fontFamily">sans-serif-light</item>
    </style>

    <style name="RobotoButtonStyle" parent="android:Widget.Holo.Button">
        <item name="android:fontFamily">sans-serif-light</item>
    </style>

    <style name="myTheme.ActionBar" parent="@android:style/Widget.Holo.Light.ActionBar">
        <item name="android:titleTextStyle">@style/myTheme.ActionBar.Text</item>
        <item name="android:background">@drawable/action_bar_bg</item>
        <item name="android:searchButtonText">SEARCH</item>
        <item name="android:editTextBackground">@drawable/apptheme_edit_text_holo_dark</item>

    </style>

    <style name="myTheme.ActionBar.Text" parent="@android:style/TextAppearance">
        <item name="android:textColor">#ff2d2d2d</item>
        <item name="android:textSize">26sp</item>
        <item name="android:fontFamily">sans-serif-condensed</item>
        <item name="android:textAllCaps">true</item>
        <item name="android:textStyle">bold</item>
    </style>

</resources>

2 个答案:

答案 0 :(得分:4)

对我而言,这就像一个魅力。 让我们为行动栏制作一个自定义视图

RES /布局/ action_title_view.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent" >

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginLeft="10dp"
        android:ellipsize="end"
        android:maxLines="1"
        android:text=""
        android:textAllCaps="true"
        android:textSize="16sp"
        android:textColor="@color/actionbar_text" />

</RelativeLayout>

在活动onCreate

中设置自定义操作栏
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // set action bar custom view
    getActionBar().setDisplayShowCustomEnabled(true);
    getActionBar().setDisplayShowTitleEnabled(false);

    LayoutInflater inflator = (LayoutInflater) this
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    mCustomActionView = inflator.inflate(R.layout.action_title_view, null);

    // assign the view to the actionbar
    getActionBar().setCustomView(mCustomActionView);

    ...
}

现在覆盖活动的setTitle方法

@Override
public void setTitle(CharSequence title) {
    mTitle = title;
    ((TextView) mCustomActionView.findViewById(R.id.title)).setText(mTitle);
    getActionBar().setTitle("");
}

使用setTitle方法设置自定义操作栏文本。希望这会有所帮助。

答案 1 :(得分:1)

我在阅读这篇文章时首先想到的是,您可能正在使用 values-v 文件夹为每个API版本使用不同的资源。

一个小例子: 在常规值文件夹中,我将文本颜色设置为蓝色:

<style name="TextMedium" parent="@android:style/TextAppearance.Medium">
<item name="android:textColor">@color/Blue</item>

在values-v11中,我有一个样式设置为白色文本颜色:

<style name="TextMedium" parent="@android:style/TextAppearance.Medium">
<item name="android:textColor">@color/White</item>

在values-v14中,我有一个样式用红色设置文本颜色:

<style name="TextMedium" parent="@android:style/TextAppearance.Medium">
<item name="android:textColor">@color/Red</item>

现在,(您可能已经猜到了),取决于您的设备的api级别,使用该样式。因此,如果您在API级别13上运行此代码,则文本颜色将为白色。对于低于11的每个api级别,使用蓝色。

现在还有另外一件事,如果您正在使用的SDK的values-v文件夹中没有样式/资源,则会提到第二个最佳替代方案(因此,如果values-v16没有引用文本颜色,将使用值-v14。

在你的情况下,应该有一个值-v17(Jelly Bean,up)包含你引用的样式,如果较低的api级别设备尝试访问该样式,它将不会出现在样式文件夹中,他们不会使用更高Api级别的资源。

我不是说这是你问题的原因,这只是猜测,因为你没有提供关于样式版本控制的信息。此外,由于Jelly Bean 4.3及以上版本可以正常工作,因此您可能会参考在Api等级17中添加的功能