我有一个典型的场景 - 主(ListFragment)活动,它会触发项目点击的详细活动。一切正常。
现在我想根据程序化条件在详细视图(红色/绿色)中制作所有文本。我知道这样做的方法是主题
所以在values-v14(我的三星Note 1设备正在运行android 4.1), styles.xml
<style name="ExpensesStyle" parent="@android:style/TextAppearance.Medium">
<item name="android:textColor">@color/expense_background</item>
</style>
colors.xml
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<color name="credit_background">#6DA000</color>
<color name="expense_background">#D30A0A</color>
</resources>
的AndroidManifest.xml
<activity
android:name="com.app.transactions.TransactionActivity"
android:label="@string/app_name"
android:theme="@style/ExpensesStyle">
</activity>
android:theme属性导致以下崩溃。将样式应用于单个视图(EditText)可以正常工作。
W/ResourceType(30089): Too many attribute references, stopped at: 0x01010099
W/ResourceType(30089): Too many attribute references, stopped at: 0x0101009a
W/ResourceType(30089): Too many attribute references, stopped at: 0x0101009b
E/com.app.TranAct(30089): Error in creation Tran Detail Activity
E/com.app.TranAct(30089): android.view.InflateException: Binary XML file line #30: Error inflating class <unknown>
E/com.app.TranAct(30089): at android.view.LayoutInflater.createView(LayoutInflater.java:619)
E/com.app.TranAct(30089): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:693)
E/com.app.TranAct(30089): at android.view.LayoutInflater.rInflate(LayoutInflater.java:752)
E/com.app.TranAct(30089): at android.view.LayoutInflater.rInflate(LayoutInflater.java:760)
E/com.app.TranAct(30089): at android.view.LayoutInflater.inflate(LayoutInflater.java:495)
E/com.app.TranAct(30089): at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
E/com.app.TranAct(30089): at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
E/com.app.TranAct(30089): at com.android.internal.policy.impl.PhoneWindow.generateLayout(PhoneWindow.java:3163)
E/com.app.TranAct(30089): at com.android.internal.policy.impl.PhoneWindow.installDecor(PhoneWindow.java:3223)
E/com.app.TranAct(30089): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:312)
E/com.app.TranAct(30089): at android.app.Activity.setContentView(Activity.java:1924)
E/com.app.TranAct(30089): at com.app.transactions.TransactionActivity.onCreate(TransactionActivity.java:30)
Activity.onCreate
@Override
protected void onCreate(Bundle instanceState) {
try {
super.onCreate(instanceState);
setContentView(R.layout.activity_simple);
Intent intent = getIntent();
long transId = intent.getLongExtra(EXTRA_TRAN_ID, 0);
boolean isExpense = intent.getBooleanExtra(EXTRA_TRAN_IS_EXPENSE, true);
if(instanceState != null)
return;
Fragment frag = TransactionDetailFragment.newInstance(isExpense ? new ExpenseFragment(): new CreditFragment(),
transId, this);
getSupportFragmentManager().beginTransaction()
.add(R.id.simple_fragment_container, frag)
.commit();
} catch (Exception e) {
Log.e(TAG, "Error in creation Tran Detail Activity", e);
}
}
layout.activity_simple是一个简单的framelayout,带有一个片段占位符。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/simple_fragment_container" />
片段布局的第30行包含
<TextView
style="?android:listSeparatorTextViewStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/label_category" />
答案 0 :(得分:3)
style="?android:listSeparatorTextViewStyle"
未在parent="@android:style/TextAppearance.Medium"
视图使用的所有参数必须在您的样式或父样式中定义。
修改强>
回答你真正的问题(如何让这些风格发挥作用),这里有一些方向:
创建您的编辑文字样式:
<style name="MyApp_EditText_style" parent="android:Widget.EditText">
// those below are all the items you CAN change,
// but you should only change those that you really need.
<item name="android:focusable">___value___</item>
<item name="android:focusableInTouchMode">___value___</item>
<item name="android:clickable">___value___</item>
<item name="android:background">___value___</item>
<item name="android:textAppearance">___value___</item>
<item name="android:textColor">___value___</item>
<item name="android:gravity">___value___</item>
</style>
然后根据您的动作性或应用程序样式添加编辑文本
<style name="MyApp.Theme" parent="@android:style/Theme.Holo">
<item name="android:editTextStyle">@style/MyApp_EditText_style</item>
</style>
请注意,活动或应用程序样式parent
必须是主要的Android theme
之一,例如HOLO,HOLO.LIGHT,Theme.Light或其中之一的后代。
答案 1 :(得分:0)
一旦Budius破案,这就是我如何实现我的目标。
SeeAlso
<强>步骤1:强>
值\ styles.xml 已经定义了一个名为AppBaseTheme的样式,另一个派生自AppBase的样式。我发现AppBaseTheme派生自不同的android主题(检查值-v11或values-v14下的类似文件)。 由于我没有特定的版本 - 我创建了几个从AppBase派生的样式。
<style name="ExpensesStyle" parent="AppTheme">
<item name="android:textColorSecondary">@color/expense_caption_color</item>
</style>
我在通过平台themes.xml +试验后进行了一些扫描后发现: textColorPrimary =&gt;适用于编辑控件。 textColorSecondary =&gt;适用于标签。 因此覆盖现有主题中定义的项目。我决定让字幕/标签在这里改变颜色 - 看起来更好。
<强>步骤2:强>
在activity :: onCreate中,在setTheme(R.style.ExpensesStyle)
setContentView()
如果您不想进行编程控制,可以在AndroidManifest.xml中声明,如问题所示。