编辑:下面提供的答案是将android:theme的用法转换为简单的样式,所以android:theme =" @ style / foo"会变成style =" @ style / foo"
原帖:
我正在尝试清理我们的布局文件,因此我会考虑一些可以考虑的事情" style"元素和创建适当的块然后在布局中,各个组件使用android:theme来引用新的样式。一个例子是: 之前:
<TextView
android:id="@+id/my_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:textStyle="bold"
android:onClick="onMyTextClick"
/>
后:
<TextView
android:id="@+id/my_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onMyTextClick"
android:theme="@style/text_style"
/>
以及styles.xml文件
<style name="text_style">
<item name="android:textSize">@dimen/font_small</item>
<item name="android:textStyle">bold</item>
<item name="android:textColor">@color/text_content_light</item>
<item name="android:textAllCaps">true</item>
<item name="android:padding">@dimen/padding_light</item>
</style>
运行它然后单击新的TextView将生成NoSuchMethodException,下面是一个示例堆栈跟踪。如果我删除android:主题行,它的工作正常....
06-17 17:12:44.306 E/AndroidRuntime( 3057): java.lang.IllegalStateException: Could not find a method onMyTextClick(View) in the activity class android.view.ContextThemeWrapper for onClick handler on view class TextView with id 'my_text_view'
06-17 17:12:44.306 E/AndroidRuntime( 3057): at android.view.View$1.onClick(View.java:4215)
06-17 17:12:44.306 E/AndroidRuntime( 3057): at android.view.View.performClick(View.java:5162)
06-17 17:12:44.306 E/AndroidRuntime( 3057): at android.view.View$PerformClick.run(View.java:20873)
06-17 17:12:44.306 E/AndroidRuntime( 3057): at android.os.Handler.handleCallback(Handler.java:739)
06-17 17:12:44.306 E/AndroidRuntime( 3057): at android.os.Handler.dispatchMessage(Handler.java:95)
06-17 17:12:44.306 E/AndroidRuntime( 3057): at android.os.Looper.loop(Looper.java:145)
06-17 17:12:44.306 E/AndroidRuntime( 3057): at android.app.ActivityThread.main(ActivityThread.java:5837)
06-17 17:12:44.306 E/AndroidRuntime( 3057): at java.lang.reflect.Method.invoke(Native Method)
06-17 17:12:44.306 E/AndroidRuntime( 3057): at java.lang.reflect.Method.invoke(Method.java:372)
06-17 17:12:44.306 E/AndroidRuntime( 3057): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388)
06-17 17:12:44.306 E/AndroidRuntime( 3057): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)
06-17 17:12:44.306 E/AndroidRuntime( 3057): Caused by: java.lang.NoSuchMethodException: onMyTextClick [class android.view.View]
06-17 17:12:44.306 E/AndroidRuntime( 3057): at java.lang.Class.getMethod(Class.java:665)
06-17 17:12:44.306 E/AndroidRuntime( 3057): at android.view.View$1.onClick(View.java:4208)
06-17 17:12:44.306 E/AndroidRuntime( 3057): ... 10 more