3

我有一个最初为 Android 2.3 设计的应用程序。现在我正在添加一个带有 ActionBarSherlock 的 ActionBar,一切都很好,除了我的 Nexus 7 运行 4.2,它现在使用 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 主题并使用常规主题,但它不起作用。

如何让 Android 4.0+ 设备在使用 ABS 时使用原始主题而不是 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;
    }
}

活动主.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>

样式.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>

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

4

2 回答 2

2

这不会是由 ActionBarSherlock 引起的EditTextButton主题是由您正在运行的平台定义的,在本例中为 4.2。 EditTexts并且Buttons还可能根据 UI 皮肤(TouchWiz、Sense、MotoBlur 等)看起来不同。

我建议将 Holo 主题保留在支持它的设备上,因为用户会熟悉它,并且在 3.x+ 上使用 2.x 主题会显得格格不入。

此外,需要其中一个Sherlock主题才能ActionBarSherlock 根据文档使用:

为了使自定义操作栏实现正常运行,您的应用程序必须使用 Theme.Sherlock、Theme.Sherlock.Light 或 Theme.Sherlock.Light.DarkActionBar,或者您的自定义主题必须使用上述其中之一作为其父级。

如果您真的想要 2.x 寻找Buttons和其他Widgets我相信您需要从 2.x 复制所有样式/可绘制对象,然后在 Sherlock 派生主题之一中覆盖它们。你可以看看 Chris Versieux 对 HoloEverywhere 所做的事情,然后尝试做相反的事情,让一切看起来像 2.x,不过我强烈建议不要这样做。

于 2012-11-27T00:03:42.007 回答
0

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

于 2012-12-08T01:43:00.477 回答