编辑:从 AppCompat 22.1 开始,任何活动都可以使用AppCompatDelegate进行主题化。着色视图类的名称也从 更改v7.internal.widget.TintXYZ
为v7.widget.AppCompatXYZ
。以下答案适用于 AppCompat 22.0 及更早版本。
我也遇到过这个问题,并通过简单地从 ActionBarActivity 复制与小部件着色相关的代码来解决它。此解决方案的一个缺点是它依赖于将来可能会更改或变得不可用的内部类。
import android.support.v7.internal.widget.TintCheckBox;
import android.support.v7.internal.widget.TintCheckedTextView;
import android.support.v7.internal.widget.TintEditText;
import android.support.v7.internal.widget.TintRadioButton;
import android.support.v7.internal.widget.TintSpinner;
public class MyActivity extends PreferenceActivity {
@Override
public View onCreateView(String name, Context context, AttributeSet attrs) {
// Allow super to try and create a view first
final View result = super.onCreateView(name, context, attrs);
if (result != null) {
return result;
}
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
// If we're running pre-L, we need to 'inject' our tint aware Views in place of the
// standard framework versions
switch (name) {
case "EditText":
return new TintEditText(this, attrs);
case "Spinner":
return new TintSpinner(this, attrs);
case "CheckBox":
return new TintCheckBox(this, attrs);
case "RadioButton":
return new TintRadioButton(this, attrs);
case "CheckedTextView":
return new TintCheckedTextView(this, attrs);
}
}
return null;
}
}
这是因为LayoutInflater 服务会为从布局资源中膨胀的每个视图调用 onCreateView,这允许 Activity 覆盖哪些类被实例化。确保活动主题设置为 Theme.AppCompat。(或后代)在清单中。
原始代码参见ActionBarActivity.java和ActionBarActivityDelegateBase.java。