Android 自定义创建的 xml 按钮未显示在预览中

标签 android android-studio android-layout

我创建了一个带有自定义属性的按钮(实际上是一个线性布局,它有一个 ImageView 和一个 TextView,功能类似于按钮)。 问题是,当我尝试在 Activity 的 xml 布局定义中实现此自定义按钮时,它没有显示。我该如何解决这个问题?

FacebookCustomButton

package com.android.neuron.custombuttons;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.Gravity;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class FacebookCustomButton extends LinearLayout {
    private Context context;

    private ImageView iconView;
    private TextView textView;

    private String iconPath;
    private Drawable iconResource;
    private String textSource;

    private int iconWidth;
    private int iconHeight;
    private int iconGravity = 0x11; //Gravity.CENTER
    private int iconMarginStart;
    private int iconMarginEnd;
    private int iconMarginTop;
    private int iconMarginBottom;

    private int textGravity = 0x11; //center
    private int textSize;
    private int textColor;



    public FacebookCustomButton(Context context) {
        super(context);
        this.context = context;

        initializeButton();
    }

    public FacebookCustomButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        initAttrs(context, attrs);

        initializeButton();
    }

    public FacebookCustomButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initAttrs(context, attrs);

        initializeButton();
    }

    void initAttrs(Context context, AttributeSet attrs) {
        if(attrs!=null) {
            TypedArray attributeArray = context.obtainStyledAttributes(attrs, R.styleable.FacebookCustomButton);

            iconResource = attributeArray.getDrawable(R.styleable.FacebookCustomButton_icon_resource);

            String text = attributeArray.getString(R.styleable.FacebookCustomButton_text_source);
            if(text==null) { //no fb textView attribuute
                text = attributeArray.getString(R.styleable.FacebookCustomButton_android_text);
            }
            textSource = text;

            iconWidth = (int) attributeArray.getDimension(R.styleable.FacebookCustomButton_icon_width, Constants.fbButton_icon_default_width);
            iconHeight = (int) attributeArray.getDimension(R.styleable.FacebookCustomButton_icon_height, Constants.fbButton_icon_default_height);
            iconGravity = attributeArray.getInt(R.styleable.FacebookCustomButton_icon_gravity, Constants.fbButton_icon_default_gravity);

            iconMarginStart = attributeArray.getInt(R.styleable.FacebookCustomButton_icon_marginStart, Constants.fbButton_icon_default_margin_start);
            iconMarginEnd = attributeArray.getInt(R.styleable.FacebookCustomButton_icon_marginEnd, Constants.fbButton_icon_default_margin_end);
            iconMarginTop = attributeArray.getInt(R.styleable.FacebookCustomButton_icon_marginTop, Constants.fbButton_icon_default_margin_top);
            iconMarginBottom = attributeArray.getInt(R.styleable.FacebookCustomButton_icon_marginBottom, Constants.fbButton_icon_default_margin_bottom);

            textGravity = attributeArray.getInt(R.styleable.FacebookCustomButton_text_gravity, Constants.fbButton_icon_default_gravity);
            textSize = (int) attributeArray.getDimension(R.styleable.FacebookCustomButton_text_size, Constants.fbButton_text_size);

            String textFontFamily = attributeArray.getString(R.styleable.FacebookCustomButton_text_font);
            Typeface font = Typeface.createFromAsset(context.getAssets(), textFontFamily);
            textView.setTypeface(font);

            textColor = attributeArray.getColor(R.styleable.FacebookCustomButton_text_color, getResources().getColor(R.color.fb_defaultColor));

        }
    }

    /**
     * Initalizes the button:
     *   - the container (linear layout)
     *   - the iconView view
     *   - the textView view
     */
    private void initializeButton() {
        initializeButtonContainer();
        iconView = initializeIconView();
        textView = initializeTextView();
    }

    private void initializeButtonContainer() {
        this.setOrientation(LinearLayout.HORIZONTAL);

        if(this.getLayoutParams() == null) {
            LayoutParams containerParams = new LayoutParams(LayoutParams.WRAP_CONTENT, Constants.fbButton_default_height);

            containerParams.setMargins(Constants.fbButton_default_margin_start,
                    Constants.fbButton_default_margin_top,
                    Constants.fbButton_default_margin_end,
                    Constants.fbButton_default_margin_bottom);

            this.setLayoutParams(containerParams);
        }

        this.setGravity(Gravity.CENTER);

        this.setBackground(context.getDrawable(R.drawable.background_facebook_sign_up_button));
    }

    private TextView initializeTextView() {
        if(textSource == null) {
            textSource = context.getResources().getString(R.string.fbButton_default_text_source);
        }

        TextView textView = new TextView(context);
        textView.setText(textSource);

        textView.setGravity(textGravity);
        textView.setTextColor(textColor);
        textView.setTextSize(textSize);
        textView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

        /*
        Typeface font = Typeface.createFromAsset(context.getAssets(), Constants.default_font_path);
        textView.setTypeface(font);
        */

        return textView;
    }

    private ImageView initializeIconView() {
        if(iconResource != null) {
            ImageView iconView = new ImageView(context);
            iconView.setImageDrawable(iconResource);

            LayoutParams iconViewParams = new LayoutParams(iconWidth, iconHeight);
            iconViewParams.gravity = iconGravity;
            iconViewParams.setMarginStart(iconMarginStart);
            iconViewParams.setMarginEnd(iconMarginEnd);

            iconView.setLayoutParams(iconViewParams);

            return iconView;
        } else {
            System.out.println("[Neuron.custombuttons.FCB]: Error getting iconView resource! Reutnring null.");
            return null;
        }
    }
}

attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="FacebookCustomButton">
        <!-- Default Android attrs -->
        <attr name="android:enabled" />
        <attr name="android:text" />
        <attr name="android:textSize" />
        <attr name="android:textAllCaps" />
        <attr name="android:textStyle" />
        <attr name="android:fontFamily" />

        <attr name="icon_width" format="dimension"/>
        <attr name="icon_height" format="dimension"/>

        <attr name="icon_gravity" format="enum">
            <enum name="top" value="0x30" />
            <enum name="bottom" value="0x50" />
            <enum name="left" value="0x03" />
            <enum name="right" value="0x05" />
            <enum name="center_vertical" value="0x10" />
            <enum name="fill_vertical" value="0x70" />
            <enum name="center_horizontal" value="0x01" />
            <enum name="fill_horizontal" value="0x07" />
            <enum name="center" value="0x11" />
            <enum name="fill" value="0x77" />
            <enum name="clip_vertical" value="0x80" />
            <enum name="clip_horizontal" value="0x08" />
            <enum name="start" value="0x00800003" />
            <enum name="end" value="0x00800005" />
        </attr>

        <attr name="icon_resource" format="integer"/>

        <attr name="icon_marginStart" format="dimension"/>
        <attr name="icon_marginEnd" format="dimension"/>
        <attr name="icon_marginTop" format="dimension"/>
        <attr name="icon_marginBottom" format="dimension"/>

        <attr name="text_source" format="string"/>

        <attr name="text_gravity" format="enum">
            <enum name="top" value="0x30" />
            <enum name="bottom" value="0x50" />
            <enum name="left" value="0x03" />
            <enum name="right" value="0x05" />
            <enum name="center_vertical" value="0x10" />
            <enum name="fill_vertical" value="0x70" />
            <enum name="center_horizontal" value="0x01" />
            <enum name="fill_horizontal" value="0x07" />
            <enum name="center" value="0x11" />
            <enum name="fill" value="0x77" />
            <enum name="clip_vertical" value="0x80" />
            <enum name="clip_horizontal" value="0x08" />
            <enum name="start" value="0x00800003" />
            <enum name="end" value="0x00800005" />
        </attr>

        <attr name="text_size" format="dimension"/>
        <attr name="text_font" format="string"/>
        <attr name="text_color" format="color"/>
    </declare-styleable>
</resources>

RegisterActivity 中的实现:

<com.android.neuron.custombuttons.FacebookCustomButton
                android:layout_width="match_parent"
                android:layout_height="40dp"
                app:text_source="@string/facebook_signup_button_text"
                app:text_size="14sp"
                app:text_color="@color/white"
                app:text_font="@font/roboto_medium"
                app:text_gravity="center"
                app:icon_resource="@drawable/ic_fb_white"
                app:icon_gravity="center"
                app:icon_height="24dp"
                app:icon_width="24dp"
                app:icon_marginBottom="0dp"
                app:icon_marginEnd="42dp"
                app:icon_marginStart="8dp"
                app:icon_marginTop="0dp" />

最佳答案

您只加载了 LinearLayout。您没有将创建的 subview 添加到父级 LinearLayout。试试这个

private void initializeButton() {
        initializeButtonContainer();
        iconView = initializeIconView();
        textView = initializeTextView();
        this.addView(iconView);
        this.addView(textView); 
    }

关于Android 自定义创建的 xml 按钮未显示在预览中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57846603/

相关文章:

android - GeckoView 发送事件或启动函数 (Android)

安卓测试 : Dagger2 + Gradle

android - 三星galaxy 2s没有权限

android - React-Native- 未能通知项目评估监听器

java - 如何获得中性按钮的标准颜色

android - 在 Recycler View 中使用水平线性布局管理器时布局元素的对齐方式发生变化

android - 更改 TabPageIndicator 页脚和文本颜色 (ViewPagerIndicator)

android-studio - Android Studio 折叠 Mac 的所有快捷方式

java - 无法解析配置 ':app:debugRuntimeClasspath' 的所有文件。问题

android - View 不包含卡片 View 中的内容