为样式中的子类定义layout_width和layout_height属性的默认值

时间:2015-01-11 19:07:52

标签: android android-custom-view android-styles

Min和目标SDK是21(Lollipop),不使用支持库。

我正在尝试创建floating action button。到目前为止一切顺利,确实有效(基于其他一些SO线程),这里是代码:

  • attrs.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    
        <attr name="fabStyle" format="reference"/>
    
    </resources>
    
  • styles.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    
        <style name="MyTheme" parent="android:Theme.Material.Light.NoActionBar">
            <item name="floatingActionButtonStyle">@style/FabStyle</item>
        </style>
    
        <style name="FabStyle" parent="android:Widget.ImageButton">
            <item name="android:background">@drawable/ripple</item>
            <item name="android:elevation">4dp</item>
        </style>
    

(我希望按钮继承默认的ImageButton特性,它似乎工作正常,这是正确的方法吗?)

  • 查看代码(注意第二个构造函数中自定义样式属性的用法):

    public class FloatingActionImageButton extends ImageButton {
    
        public FloatingActionImageButton(Context context) {
            this(context, null);
        }
    
        public FloatingActionImageButton(Context context, AttributeSet attrs) {
            this(context, attrs, R.attr.floatingActionButtonStyle);
        }
    
        public FloatingActionImageButton(Context context, AttributeSet attrs, int defStyleAttr) {
            this(context, attrs, defStyleAttr, 0);
        }
    
        public FloatingActionImageButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
            super(context, attrs, defStyleAttr, defStyleRes);
    
            setOutlineProvider(new ViewOutlineProvider() {
    
                @Override
                public void getOutline(View view, Outline outline) {
                    int width = view.getMeasuredWidth();
                    int height = view.getMeasuredHeight();
                    outline.setOval(0, 0, width, height);
                }
            });
            setClipToOutline(true);
        }
    }
    
  • ripple.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <ripple xmlns:android="http://schemas.android.com/apk/res/android"
            android:color="?android:attr/colorPrimary">
    
        <item android:drawable="?android:attr/colorAccent"/>
    
    </ripple>
    
  • 在XML中的用法:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                    xmlns:tools="http://schemas.android.com/tools"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    tools:context="com.test.TestActivity">
    
        <com.test.FloatingActionImageButton
            android:id="@+id/refresh_button"
            android:layout_width="@dimen/fab_size"
            android:layout_height="@dimen/fab_size"
            android:layout_alignParentBottom="true"
            android:layout_alignParentEnd="true"
            android:layout_marginBottom="@dimen/padding_big"
            android:layout_marginEnd="@dimen/padding_big"
            android:src="@drawable/ic_action_restart"/>
    
    </RelativeLayout>
    

(@ dimen / fab_size是56dp)

结果是看起来很好看的FAB,涟漪效应按预期工作:

fab

  1. 由于这是我在Android中首次尝试造型等,我想问一下我所做的是“佳能”。如果我想发布我自己的Fab-ulous库,我该怎么办呢?现在样式代码是否已经为我的lib的潜在客户准备好只是在他们的styles.xml中以某种方式定义fabStyle(如何?),我的View将使用这些设置?

  2. 我不喜欢我的解决方案是,虽然我希望所有的FAB都是56dp,正如Google在上面链接的文档中所建议的那样,我必须在每次使用工厂时定义尺寸XML。因为我希望按钮默认为56dp,我尝试将layout_width和_height放在FabStyle中并从XML中删除,但AndroidStudio说我应该设置它们,并且应用程序实际上在运行时崩溃说需要设置值。

  3. 我尝试在崩溃的XML中设置@null,并且尝试将按钮设置为0dp / px,这是不可见的......

    是否可以为这些属性定义默认值,或者我在这里运气不好?

0 个答案:

没有答案