在Android的错误充气类按钮 [英] Error inflating class Button in Android

查看:419
本文介绍了在Android的错误充气类按钮的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有分钟SDK 16到23我想用材料的设计,尽可能的应用程序。它也必须是全屏应用程序。应用程序兼容性支持库也包括在内。现在我已经登录活动有一些按钮:

 <按钮
    机器人:ID =@ + ID / act_logon_btn_logon
    风格=@风格/ ButtonDefault
    机器人:layout_width =match_parent
    机器人:layout_height =WRAP_CONTENT
    机器人:文字=@字符串/ act_logon_logon/>

样式如下(价值观/ styles.xml):

 <样式名称=Theme.AppCompat.Light.NoActionBar.FullScreen父=@风格/ Theme.AppCompat.Light>
    <项目名称=windowNoTitle>真< /项目>
    <项目名称=windowActionBar>假LT; /项目>
    <项目名称=机器人:windowFullscreen>真< /项目>
    <项目名称=机器人:windowContentOverlay> @空< /项目>
< /风格><样式名称=AppThemeBase父=Theme.AppCompat.Light.NoActionBar.FullScreen>< /风格><样式名称=AppTheme父=AppThemeBase>< /风格><样式名称=ButtonDefault父=Widget.AppCompat.Button>
    <项目名称=?机器人:TEXTSIZE> attr指示/ font_medium< /项目>
< /风格><样式名称=fontstyle的>< /风格><样式名称=FontStyle.Small>
    <项目名称=font_small>&12SP LT; /项目>
    <项目名称=font_medium> 14sp< /项目>
    <项目名称=font_large>&16SP LT; /项目>
< /风格><样式名称=FontStyle.Medium>
    <项目名称=font_small>&16SP LT; /项目>
    <项目名称=font_medium> 18sp< /项目>
    <项目名称=font_large>&20SP LT; /项目>
< /风格><样式名称=FontStyle.Large>
    <项目名称=font_small>&20SP LT; /项目>
    <项目名称=font_medium> 22sp< /项目>
    <项目名称=font_large> 24sp< /项目>
< /风格>

和价值观/ ATTRS:

 <申报-设置样式名称=fontstyle的>
    < attr指示NAME =font_small格式=维/>
    < attr指示NAME =font_medium格式=维/>
    < attr指示NAME =font_large格式=维/>
< /申报,设置样式>

属性的 font_medium 的是描述定义<一个href=\"http://stackoverflow.com/questions/4877153/android-application-wide-font-size-$p$pference\">here.我不明白的行为是登录活动被打开时,一切正常,没有例外。但是,当我打开另一个活动从登录活性片段内,该片段具有这种风格的按钮时,我得到一个异常说错误充气类按钮。当我删除从ButtonDefault风格的 TEXTSIZE 的属性,一切正常。为什么它的地方,并没有什么地方工作?是不是有什么错的自定义属性?

我试图创造价值-V21 / styles.xml与风格,但没有效果。

你能不能也请说明在父样式定义之间的区别是什么?我迷路。

 父=Widget.AppCompat.Button
父=@风格/ Widget.AppCompat.Button
父=机器人:Widget.Button
父=机器人:Widget.AppCompat.Button
父=机器人:Widget.Material.Button
父=机器人:风格/ Widget.Material.Button

感谢您。

修改1 - 例外:

  10月12日至17日:56:53.950:E / AndroidRuntime(7251):致命异常:主要
10月12日至17日:56:53.950:E / AndroidRuntime(7251):工艺:test.android,PID:7251
10月12日至17日:56:53.950:E / AndroidRuntime(7251):了java.lang.RuntimeException:无法启动活动ComponentInfo {} test.dci.android/test.dci.android.view.activity.TransactionActivity:android.view .InflateException:二进制XML文件行#49:错误充气类按钮
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2702)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2767)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.app.ActivityThread.access $ 900(ActivityThread.java:177)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1449)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.os.Handler.dispatchMessage(Handler.java:102)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.os.Looper.loop(Looper.java:145)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.app.ActivityThread.main(ActivityThread.java:5951)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在java.lang.reflect.Method.invoke(本机方法)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在java.lang.reflect.Method.invoke(Method.java:372)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1400)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):android.view.InflateException:二进制XML文件行#49:错误充气类按钮产生的原因
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:770)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.view.LayoutInflater.rInflate(LayoutInflater.java:813)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.view.LayoutInflater.rInflate(LayoutInflater.java:821)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.view.LayoutInflater.inflate(LayoutInflater.java:511)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.view.LayoutInflater.inflate(LayoutInflater.java:415)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在test.dci.android.view.fragment.TransactionFragment.onCreateView(TransactionFragment.java:71)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.support.v4.app.Fragment.performCreateView(Fragment.java:1962)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1036)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1226)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1328)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2284)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.support.v4.app.FragmentController.onCreateView(FragmentController.java:111)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.support.v4.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:314)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:31)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:79)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在test.dci.android.view.activity.TransactionActivity.onCreateView(TransactionActivity.java:1)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:740)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.view.LayoutInflater.rInflate(LayoutInflater.java:813)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.view.LayoutInflater.inflate(LayoutInflater.java:511)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.view.LayoutInflater.inflate(LayoutInflater.java:415)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.view.LayoutInflater.inflate(LayoutInflater.java:366)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:256)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:109)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在test.dci.android.view.activity.TransactionActivity.onCreate(TransactionActivity.java:31)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.app.Activity.performCreate(Activity.java:6289)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2655)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):10 ...更多
10月12日至17日:56:53.950:E / AndroidRuntime(7251):了java.lang.RuntimeException:产生的原因无法解析下标12属性
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.content.res.TypedArray.getDimensionPixelSize(TypedArray.java:582)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.widget.TextView&LT;&初始化GT;(TextView.java:1400)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.widget.Button&LT;&初始化GT;(Button.java:115)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.widget.Button&LT;&初始化GT;(Button.java:108)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.support.v7.widget.AppCompatButton&LT;&初始化GT;(AppCompatButton.java:62)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.support.v7.widget.AppCompatButton&LT;&初始化GT;(AppCompatButton.java:58)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:98)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.support.v7.app.AppCompatDelegateImplV7.createView(AppCompatDelegateImplV7.java:938)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在android.support.v7.app.AppCompatDelegateImplV7.onCreateView(AppCompatDelegateImplV7.java:992)
10月12日至17日:56:53.950:E / AndroidRuntime(7251):在


解决方案

解决。问题是,该属性UKNOWN(或不指定),用于充气器。解决方案是充气使用该属性的观点之前定义的属性值!

解决方案1:与此属性的样式必须指定不仅在活动,但也有与此属性的一些看法的片段。所以这行添加到片段的 onCreateView() 之前的膨胀片段的根视图的行:

 的getContext()getTheme()applyStyle(fontStyleResId,真)。

解决方案2 :设置直接在应用程序的主题属性值:

 &LT;样式名称=AppThemeBase父=Theme.AppCompat.Light.NoActionBar.FullScreen&GT;
    &LT;项目名称=font_small&GT; @扪/ font_size_medium_small&LT; /项目&GT;
    &LT;项目名称=font_medium&GT; @扪/ font_size_medium_medium&LT; /项目&GT;
    &LT;项目名称=font_large&GT; @扪/ font_size_medium_large&LT; /项目&GT;
&LT; /风格&GT;

I have an application with min sdk 16 up to 23. I want to use Material design as much as possible. It also has to be fullscreen app. AppCompat support library is included. Now I have Logon activity with some buttons:

<Button
    android:id="@+id/act_logon_btn_logon"
    style="@style/ButtonDefault"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/act_logon_logon" />

Styles are as follows (values/styles.xml):

<style name="Theme.AppCompat.Light.NoActionBar.FullScreen" parent="@style/Theme.AppCompat.Light">
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowContentOverlay">@null</item>
</style>

<style name="AppThemeBase" parent="Theme.AppCompat.Light.NoActionBar.FullScreen"></style>

<style name="AppTheme" parent="AppThemeBase"></style>

<style name="ButtonDefault" parent="Widget.AppCompat.Button">
    <item name="android:textSize">?attr/font_medium</item>
</style>

<style name="FontStyle"></style>

<style name="FontStyle.Small">
    <item name="font_small">12sp</item>
    <item name="font_medium">14sp</item>
    <item name="font_large">16sp</item>
</style>

<style name="FontStyle.Medium">
    <item name="font_small">16sp</item>
    <item name="font_medium">18sp</item>
    <item name="font_large">20sp</item>
</style>

<style name="FontStyle.Large">
    <item name="font_small">20sp</item>
    <item name="font_medium">22sp</item>
    <item name="font_large">24sp</item>
</style>

And in values/attrs:

<declare-styleable name="FontStyle">
    <attr name="font_small" format="dimension" />
    <attr name="font_medium" format="dimension" />
    <attr name="font_large" format="dimension" />
</declare-styleable>

Attribute font_medium is defined as described here. The behavior I don't understand is that when the Logon activity gets opened, everything is OK, no exceptions. But when I open another activity from Logon activity with fragment inside and the fragment has a button with this style, I get an exception saying "Error inflating class Button". When I delete the textSize attribute from the ButtonDefault style, everything works. Why it does work somewhere and somewhere not? Is there something wrong with the custom attribute?

I've tried to create values-v21/styles.xml with that style but without effect.

Can you also please explain differences between following parent style definitions? I'm getting lost.

parent="Widget.AppCompat.Button"
parent="@style/Widget.AppCompat.Button"
parent="android:Widget.Button"
parent="android:Widget.AppCompat.Button"
parent="android:Widget.Material.Button"
parent="android:style/Widget.Material.Button"

Thank you.

EDIT 1 - exception:

12-17 10:56:53.950: E/AndroidRuntime(7251): FATAL EXCEPTION: main
12-17 10:56:53.950: E/AndroidRuntime(7251): Process: test.android, PID: 7251
12-17 10:56:53.950: E/AndroidRuntime(7251): java.lang.RuntimeException: Unable to start activity ComponentInfo{test.dci.android/test.dci.android.view.activity.TransactionActivity}: android.view.InflateException: Binary XML file line #49: Error inflating class Button
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2702)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2767)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.app.ActivityThread.access$900(ActivityThread.java:177)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1449)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.os.Handler.dispatchMessage(Handler.java:102)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.os.Looper.loop(Looper.java:145)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.app.ActivityThread.main(ActivityThread.java:5951)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at java.lang.reflect.Method.invoke(Native Method)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at java.lang.reflect.Method.invoke(Method.java:372)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)
12-17 10:56:53.950: E/AndroidRuntime(7251): Caused by: android.view.InflateException: Binary XML file line #49: Error inflating class Button
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:770)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:813)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:821)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.view.LayoutInflater.inflate(LayoutInflater.java:511)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.view.LayoutInflater.inflate(LayoutInflater.java:415)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at test.dci.android.view.fragment.TransactionFragment.onCreateView(TransactionFragment.java:71)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1036)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1226)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1328)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2284)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.support.v4.app.FragmentController.onCreateView(FragmentController.java:111)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.support.v4.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:314)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:31)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:79)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at test.dci.android.view.activity.TransactionActivity.onCreateView(TransactionActivity.java:1)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:740)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:813)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.view.LayoutInflater.inflate(LayoutInflater.java:511)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.view.LayoutInflater.inflate(LayoutInflater.java:415)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.view.LayoutInflater.inflate(LayoutInflater.java:366)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:256)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:109)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at test.dci.android.view.activity.TransactionActivity.onCreate(TransactionActivity.java:31)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.app.Activity.performCreate(Activity.java:6289)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2655)
12-17 10:56:53.950: E/AndroidRuntime(7251):     ... 10 more
12-17 10:56:53.950: E/AndroidRuntime(7251): Caused by: java.lang.RuntimeException: Failed to resolve attribute at index 12
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.content.res.TypedArray.getDimensionPixelSize(TypedArray.java:582)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.widget.TextView.<init>(TextView.java:1400)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.widget.Button.<init>(Button.java:115)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.widget.Button.<init>(Button.java:108)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.support.v7.widget.AppCompatButton.<init>(AppCompatButton.java:62)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.support.v7.widget.AppCompatButton.<init>(AppCompatButton.java:58)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:98)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.support.v7.app.AppCompatDelegateImplV7.createView(AppCompatDelegateImplV7.java:938)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at android.support.v7.app.AppCompatDelegateImplV7.onCreateView(AppCompatDelegateImplV7.java:992)
12-17 10:56:53.950: E/AndroidRuntime(7251):     at 

解决方案

Solved. The problem is that the attribute is uknown (or not specified) for the inflater. Solution is defining attributes values before inflating views that use the attribute!

Solution 1: The style with this attribute must be specified not only in the activity, but also in the fragment that has some views with this attribute. So add this line to fragment's onCreateView() before the line that inflates fragment's root view:

getContext().getTheme().applyStyle(fontStyleResId, true);

Solution 2: Set attributes value directly in application's theme:

<style name="AppThemeBase" parent="Theme.AppCompat.Light.NoActionBar.FullScreen">
    <item name="font_small">@dimen/font_size_medium_small</item>
    <item name="font_medium">@dimen/font_size_medium_medium</item>
    <item name="font_large">@dimen/font_size_medium_large</item>
</style>

这篇关于在Android的错误充气类按钮的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆