使用ActionBarSherlock强制app使用Theme而不是Theme.Holo

时间:2012-11-26 21:29:48

标签: android actionbarsherlock android-4.0-ice-cream-sandwich android-theme

我有一款最初针对Android 2.3设计的应用。现在我正在添加一个带ActionBarSherlock的ActionBar,一切都很好,除了我运行4.2的Nexus 7,它现在​​使用Holo主题按钮和EditTexts。在我的主题继承自Theme.Light之前,现在它继承自Theme.Sherlock。我希望它甚至在较新的设备上使用旧主题。我怀疑这是由values-v14文件夹中的以下行引起的:

<style name="Sherlock.__Theme" parent="android:Theme.Holo">

所以我尝试删除该文件夹和v11文件夹只是为了查看它是否能解决问题,但ActionBar完全消失了。

然后我尝试覆盖EditText的样式,如下所示:

<style name="AppTheme" parent="Theme.Sherlock">
    <item name="@android:attr/editTextStyle">@android:style/Widget.EditText</item>
</style>

这应该让小部件不使用Widget.Holo主题并使用常规主题,但它不起作用。

在使用ABS时,如何让Android 4.0+设备使用原始主题而不是Holo主题?

下面我发布了一些使用ABS的示例应用程序的代码,目前正在显示一个Holo主题的EditText,但应该显示一个常规的EditText:

MainActivity.java:

import android.os.Bundle;

import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.view.Menu;

public class MainActivity extends SherlockActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getSupportMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

activity_main.xml中:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="@string/hello_world"
        tools:context=".MainActivity" />
    <EditText 
        android:layout_height="match_parent"
        android:layout_width="match_parent"/>

</RelativeLayout>

styles.xml:

<resources xmlns:android="http://schemas.android.com/apk/res/android">

    <style name="AppTheme" parent="Theme.Sherlock">
        <item name="@android:attr/editTextStyle">@android:style/Widget.EditText</item>
    </style>

</resources>

此外,清单中的主题是AppTheme,ABS被添加为库项目。

2 个答案:

答案 0 :(得分:2)

这不是由ActionBarSherlock引起的,EditTextButton主题是由您运行的平台定义的,在本例中为4.2。基于UI皮肤(TouchWiz,Sense,MotoBlur等),EditTextsButtons也可能看起来不同。

我建议将Holo主题保留在支持它的设备上,因为用户会熟悉它并且3.x +上的2.x主题看起来不合适。

此外,为了使用Sherlock according to the docs,还需要其中一个ActionBarSherlock主题:

  

为了使自定义操作栏实现功能,您的应用程序必须使用Theme.Sherlock,Theme.Sherlock.Light或Theme.Sherlock.Light.DarkActionBar,否则您的自定义主题必须使用前面提到的其中一个作为其父级。

如果你真的希望2.x寻找Buttons和其他Widgets,我相信你需要复制2.x中的所有样式/ drawable,然后在其中一个中覆盖它们Sherlock派生出主题。你可以看看Chris Versieux用HoloEverywhere做了什么,并尝试反过来使一切看起来像2.x,我强烈建议不要这样做。

答案 1 :(得分:0)

我的修复无效的原因是因为Widget.EditText的background属性使用了?attr语法,这意味着它使用了当前主题的背景,即Holo。所以我基本上查看了Android源代码,并将使用此语法的两个属性更改为我认为应该是前Holo主题样式(即将背景设置为白色)。