Пользовательский стиль для пользовательского представления внутри стиля [дубликат]

Многие многочисленные дубликаты этого вопроса задают вопрос о влиянии округления с плавающей запятой на конкретные числа. На практике легче понять, как это работает, глядя на точные результаты вычислений, а не просто на чтение. Некоторые языки предоставляют способы сделать это - например, преобразование float или double в BigDecimal в Java.

Так как это вопрос, связанный с языком, ему нужны языковые агностические инструменты, такие как как Десятичный преобразование с плавающей запятой .

Применяя его к числам в вопросе, рассматриваемым как удваивает:

0,1 преобразуется в 0,1000000000000000055511151231257827021181583404541015625,

0,2 преобразуется в 0.200000000000000011102230246251565404236316680908203125,

0,3 конвертируется в 0,29999999999999999989897769753748434595763683319091796875 и

0,30000000000000004 преобразуется в 0,3000000000000000444089209850062616169452667236328125.

Добавление первых двух чисел вручную или в десятичный калькулятор, такой как Full Precision Calculator , показывает точную сумму фактических входов: 0.3000000000000000166533453693773481063544750213623046875.

Если округлить до эквивалента 0,3, ошибка округления будет 0.0000000000000000277555756156289135105907917022705078125. Округление до эквивалента 0,30000000000000004 также дает ошибку округления 0,0000000000000000277555756156289135105907917022705078125.

Возвращаясь к конвертеру с плавающей запятой, необработанный шестнадцатеричный показатель для 0.30000000000000004 равен 3fd3333333333334, который заканчивается четной цифрой и, следовательно, является правильным результатом.

150
задан Vertexwahn 4 March 2016 в 17:37
поделиться

5 ответов

Я понял это! Ответ на NOT указывает пространство имен в стиле.

<?xml version="1.0" encoding="utf-8" ?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="CustomStyle">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>

        <item name="custom_attr">value</item> <!-- tee hee -->
    </style>
</resources>
326
ответ дан styler1972 24 August 2018 в 01:13
поделиться

Для меня работали стилист и модификация Винса. Я хотел бы указать, что объяснение @ vince может быть не совсем точным.

Чтобы проверить гипотезу о том, что атрибут name declare-styleable, соответствующий имени пользовательского класса представления, позволяет нам получить доступ к пользовательскому атрибут без пространства имен Я изменил имя declare-styleable (пользовательское представление было названо TestViewFont:

<declare-styleable name="TextViewFont2">
    <attr name="font" format="integer"/>
</declare-styleable>

Затем я изменил вызов obtainStyledAttributes в пользовательском представлении, чтобы отразить это:

TypedArray ta = context.getTheme().obtainStyledAttributes(attrs, R.styleable.TextViewFont2, 0, 0);

Код все еще работает. Поэтому я не думаю, что это какая-то интроспекция declare-styleable класса, в котором он назван.

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

Независимо от того, спасибо всем парням помощи, он решил мою проблему.

8
ответ дан Abid H. Mujtaba 24 August 2018 в 01:13
поделиться

В случае, если это помогает кому-то другому, моя ошибка заключалась в том, что мой пользовательский класс представления вызывал AttributeSet.getAttributeValue , например

String fontName = attrs.getAttributeValue("http://schemas.android.com/apk/res-auto", "customFont");

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

Исправление заключалось в использовании obtainStyledAttributes в моем пользовательском представлении:

 TypedArray styleAttrs = context.obtainStyledAttributes(attrs, R.styleable.MyTextViewStyleable);
 String fontName = styleAttrs.getString(R.styleable.MyTextViewStyleable_customFont);

Подсказка о том, что это работает правильно, заключается в том, что вы может нажать Ctrl / Apple + щелкнуть по R.styleable.MyTextViewStyleable_customFont, чтобы получить прямое определение вашего attrs.xml.

Мне потребовалось некоторое время, чтобы определить эту критическую разницу между моим кодом и другими примерами, атрибут работал отлично, когда передавался непосредственно через макет XML (а не через стиль).

1
ответ дан Dan J 24 August 2018 в 01:13
поделиться

values ​​/ styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    ...
    <item name="defaultButtonColor">@color/red</item>
    <item name="defaultButtonHeight">@dimen/dp_100</item>
</style>

values ​​/ attrs.xml

<resources>
    <attr name="defaultButtonColor" format="reference" />
    <attr name="defaultButtonHeight" format="reference"/>
</resources>

values ​​/ colors.xml

<resources>
    <color name="red">#f00</color>
</resources>

значения / dimens.xml

<resources>
    <dimen name="dp_100">100dp</dimen>
</resources>

Использование

<Button
    android:layout_width="wrap_content"
    android:layout_height="?attr/defaultButtonHeight"
    android:text="Button"
    android:textColor="?attr/defaultButtonColor"
    />

DEMO

1
ответ дан Phan Van Linh 24 August 2018 в 01:13
поделиться

выше ответ для меня, я попробовал изменить litte, я объявляю стиль для класса в элементе ресурсов.

<declare-styleable name="VerticalView">
    <attr name="textSize" format="dimension" />
    <attr name="textColor" format="color" />
    <attr name="textBold" format="boolean" />
</declare-styleable>

в declare-styleable, атрибут name ссылается на имя класса, поэтому У меня был вызов класса вида «com.my.package.name.VerticalView», он представлял, что это объявление должно использоваться в VerticalView или подклассах VerticalView. поэтому мы можем объявить стиль следующим образом:

<resources>
    <style name="verticalViewStyle">
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">36dip</item>

        <item name="textSize">28sp</item>  <!-- not namespace prefix -->
        <item name="textColor">#ff666666</item>
        <item name="textBold">true</item>
    </style>
</resources>

, поэтому мы не объявили пространство имен в элементе ресурсов, оно все еще работает.

37
ответ дан VinceStyling 24 August 2018 в 01:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: