2

У меня есть приложение с min sdk 16 до 23. Я хочу использовать конструкцию материалов как можно больше. Это также должно быть полноэкранное приложение. Поддерживается библиотека поддержки AppCompat. Теперь я Logon активность некоторых кнопок:Ошибка раздувания класса Button в Android

<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.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> 

И в значениях/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> 

Атрибут font_medium определяется как описано here. Поведение, которое я не понимаю, заключается в том, что когда активность входа в систему открывается, все в порядке, никаких исключений. Но когда я открываю другое действие из активности входа в систему с фрагментом внутри, а фрагмент имеет кнопку с этим стилем, я получаю исключение, говорящее «Ошибка раздувания клавиши класса». Когда я удаляю атрибут text в стиле ButtonDefault, все работает. Почему он работает где-то, а где-то нет? Что-то не так с пользовательским атрибутом?

Я попытался создать значения-v21/styles.xml с этим стилем, но без эффекта.

Можете ли вы также объяснить различия между следующими определениями родительского стиля? Я теряюсь.

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" 

Спасибо.

EDIT 1 - исключение:

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 
+0

Вы можете оставить свою ошибку –

+1

Done. Ошибка возникает не только с кнопками, но и с edittexts - со стилем, который содержит собственный атрибут fontSize. – Tomask

+0

Кажется, что исключение 'android.view.InflateException: двоичная строка XML-файла # 49: ошибка раздувания класса Button' вызвана' java .lang.RuntimeException: Не удалось разрешить атрибут по индексу 12' Кажется, что надуватель имеет проблемы с распознаванием '? attr/font_medium'. Вы пытались изменить это на значение, т. Е .: 14sp, вместо удаления textSize? – Luke47

ответ

1

Решено. Проблема заключается в том, что атрибут является устаревшим (или не указанным) для надувателя. Решение определяет значения атрибутов перед раздуванием представлений, которые используют атрибут!

Решение 1: Стиль с этим атрибутом должен указываться не только в действии, но также и в фрагменте, который имеет некоторые представления с этим атрибутом.Так что добавьте эту строку в осколок onCreateView()перед тем строку, которая раздувает вид корневой фрагмента:

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

Решения 2: Набор атрибуты значения непосредственно в теме приложения:

<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> 
0

Как мы уже говорили в разделе комментариев, проблема заключается в том, что инфлятор как-то не признает ?attr/font_medium, повышая тем самым исключение.

Вы можете использовать файл dimens.xml, чтобы указать пользовательские размеры, например:

<resources> 
    <dimen name="small">14sp</dimen> 
    <dimen name="medium">16sp</dimen> 
    <dimen name="large">18sp</dimen> 
</resources> 

, а затем в вашем styles.xml вы ссылаться на эти значения, как это:

<style name="ButtonDefault" parent="Widget.AppCompat.Button"> 
    <item name="android:textSize">@dimen/medium</item> 
</style> 

Как каждый другой ресурс, dimens.xml может быть помещен в соответствующие папки ресурсов для размещения в определенной конфигурации устройства (размеры экрана, плотность, язык и т. д.).

+0

Я немного ржавый с разработкой Android, но я думаю, что вы не можете ссылаться на другие атрибуты при использовании тегов