简短问题: 是否可以为个别视图创建主题并设置特定样式?
假设我希望TextView的文本颜色为红色,而EditText的文本颜色为绿色。
像那样痴迷(但这不起作用):
<style name="MyAppTheme" parent="android:Theme.Light">
<item name="android:windowNoTitle">true</item>
<item name="android:textColor">#0000ff</item>
<style parent="@android:style/Widget.EditText">
<item name="android:textColor">#ff0000</item>
</style>
</style>
更新:
我的应用程序的核心元素是我自己绘制的视图。为了支持主题,我有一个抽象的“主题”基类,它有方法提供我需要的所有颜色和绘图。从这门课程中我得到了几个类,如“BlackTheme”,“WhiteTheme”...... 用户可以在“设置”中设置正确的主题。对于我需要的每个附加信息,我使用带有默认android小部件的DialogFragment。在DialogFragments中,我在onCreateView中应用对话框样式。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ReleaseNotesPopup viewLayout = new ReleaseNotesPopup(getActivity(), _callback, this);
getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
getDialog().getWindow().setSoftInputMode(STYLE_NO_INPUT);
viewLayout.setBackgroundDrawable(this.getResources().getDrawable(_Theme.popupBackground()));
return viewLayout;
}
我遇到的核心问题是,当我有黑色背景时,一些小部件变得不可见。因此,我需要自定义选择器。但遗憾的是,您无法以编程方式应用窗口小部件样式。这就是为什么我像约瑟夫在他的回答中描述的那样这样做: attrs.xml
<resources>
<attr name="myEditTextStyle" format="reference" />
<attr name="myCheckBoxStyle" format="reference" />
styles.xml
<style name="WhiteTheme" parent="AppBaseTheme">
<item name="android:windowNoTitle">true</item>
</style>
<style name="AppThemeBlack" parent="AppBaseTheme">
<item name="android:windowNoTitle">true</item>
<item name="android:textColor">#b1b1b1</item>
<item name="myEditTextStyle">@style/EditTextmyTime</item>
<item name="myCheckBoxStyle">@style/CheckBoxmyTime</item>
</style>
我添加了:style =&#34;?attr / myCheckBoxStyle&#34;我所有的复选框。 如果BlackTheme活跃,我会设置主题(R.style.BlackTheme);在我的Activity.onCreate()
中对于BlackTheme,我需要特殊选择器,因为当背景为黑色时,默认的选中/取消选中图标是不可见的。
对于具有更高对比度的主题,请说WhiteTheme,我没有设置项目&#34; myCheckBoxStyle&#34;。
这个实现有效,但我想这不是最佳的......
UPDATE2:
这是我的复选框样式。下载地址:http://android-holo-colors.com/
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="EditTextmyTime" parent="android:Widget.EditText">
<item name="android:background">@drawable/mytime_edit_text_holo_dark</item>
<item name="android:textColor">#ffffff</item>
</style>
<style name="CheckBoxmyTime" parent="android:Widget.CompoundButton.CheckBox">
<item name="android:button">@drawable/mytime_btn_check_holo_dark</item>
</style>
</resources>
和
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Enabled states -->
<item android:drawable="@drawable/mytime_btn_check_on_holo_dark" android:state_checked="true" android:state_enabled="true" android:state_window_focused="false"/>
<item android:drawable="@drawable/mytime_btn_check_off_holo_dark" android:state_checked="false" android:state_enabled="true" android:state_window_focused="false"/>
<item android:drawable="@drawable/mytime_btn_check_on_pressed_holo_dark" android:state_checked="true" android:state_enabled="true" android:state_pressed="true"/>
<item android:drawable="@drawable/mytime_btn_check_off_pressed_holo_dark" android:state_checked="false" android:state_enabled="true" android:state_pressed="true"/>
<item android:drawable="@drawable/mytime_btn_check_on_focused_holo_dark" android:state_checked="true" android:state_enabled="true" android:state_focused="true"/>
<item android:drawable="@drawable/mytime_btn_check_off_focused_holo_dark" android:state_checked="false" android:state_enabled="true" android:state_focused="true"/>
<item android:drawable="@drawable/mytime_btn_check_off_holo_dark" android:state_checked="false" android:state_enabled="true"/>
<item android:drawable="@drawable/mytime_btn_check_on_holo_dark" android:state_checked="true" android:state_enabled="true"/>
<!-- Disabled states -->
<item android:drawable="@drawable/mytime_btn_check_on_disabled_holo_dark" android:state_checked="true" android:state_window_focused="false"/>
<item android:drawable="@drawable/mytime_btn_check_off_disabled_holo_dark" android:state_checked="false" android:state_window_focused="false"/>
<item android:drawable="@drawable/mytime_btn_check_on_disabled_focused_holo_dark" android:state_checked="true" android:state_focused="true"/>
<item android:drawable="@drawable/mytime_btn_check_off_disabled_focused_holo_dark" android:state_checked="false" android:state_focused="true"/>
<item android:drawable="@drawable/mytime_btn_check_off_disabled_holo_dark" android:state_checked="false"/>
<item android:drawable="@drawable/mytime_btn_check_on_disabled_holo_dark" android:state_checked="true"/>
</selector>
干杯, 斯蒂芬
答案 0 :(得分:0)
如果您想要完全控制单个元素(即页面上的2个文本视图可能不同,或者不同页面上的文本视图可能不同),但希望它可由主题控制:
<强> RES /值/ styles.xml 强>
<resources>
<style name="MyAppTheme" parent="android:Theme.Light">
<item name="android:windowNoTitle">true</item>
<item name="myTextAppearance">@style/MyTextAppearance</item>
<item name="myEditTextStyle">@style/MyEditTextStyle</item>
</style>
<style name="MyTextAppearance" parent="android:TextAppearance">
<item name="android:textColor">#0000ff</item>
</style>
<style name="MyEditTextStyle" parent="android:Widget.EditText">
<item name="android:textColor">#ff0000</item>
</style>
</resources>
<强> RES /值/ attrs.xml 强>
<resources>
<attr name="myTextAppearance" format="reference" />
<attr name="myEditTextStyle" format="reference" />
</resources>
<强> RES /布局/ layout.xml 强>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hello World"
android:textAppearance="?attr/myTextAppearance"
/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Message Here"
style="?attr/myEditTextStyle"
/>
</LinearLayout>
如果您不想控制单个视图,则可以覆盖默认值:
<强> RES /值/ styles.xml 强>
<resources>
<style name="MyAppTheme" parent="android:Theme.Light">
<item name="android:windowNoTitle">true</item>
<item name="android:textColorPrimary">#0000ff</item>
<item name="android:editTextStyle">@style/MyEditTextStyle</item>
</style>
<style name="MyEditTextStyle" parent="android:Widget.EditText">
<item name="android:textColor">#ff0000</item>
</style>
</resources>
<强> RES /布局/ layout.xml 强>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hello World"
/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Message Here"
/>
</LinearLayout>