Android Studio添加自定义视图中断构建

时间:2016-09-14 02:14:47

标签: android android-studio

我正在使用Android Studio上下文菜单制作新的自定义视图。当我添加新视图时,构建被破坏。为什么Android Studio会添加破坏构建的代码。

我正在运行Android Studio 2.1.3。

过程如下......

  1. 我右键单击我的src / java / [my_package]文件夹。
  2. 我点击了New> UI组件>自定义视图
  3. 在随后的对话框中,我命名我的视图并点击回车。
  4. 我点击make项目,我收到以下错误......
  5. Error:(7) No resource identifier found for attribute 'exampleColor' in package 'com.username.appname'
    Error:(7) No resource identifier found for attribute 'exampleDimension' in package 'com.username.appname'
    Error:(7) No resource identifier found for attribute 'exampleDrawable' in package 'com.username.appname'
    Error:(7) No resource identifier found for attribute 'exampleString' in package 'com.username.appname'
    

    以下是Android Studio创建的课程。我没有在这里触及一行代码,除了编辑我的用户和应用程序名称信息。

    我好像错误是R.无法在文件中解析。

    package com.username.appname;
    
    import android.content.Context;
    import android.content.res.TypedArray;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.drawable.Drawable;
    import android.text.TextPaint;
    import android.util.AttributeSet;
    import android.view.View;
    import android.widget.LinearLayout;
    
    import com.example.ringtonegenerator.R;
    
    /**
     * TODO: document your custom view class.
     */
    public class SwipeLayout extends LinearLayout {
        private String mExampleString; // TODO: use a default from R.string...
        private int mExampleColor = Color.RED; // TODO: use a default from R.color...
        private float mExampleDimension = 0; // TODO: use a default from R.dimen...
        private Drawable mExampleDrawable;
    
        private TextPaint mTextPaint;
        private float mTextWidth;
        private float mTextHeight;
    
        public SwipeLayout(Context context) {
            super(context);
            init(null, 0);
        }
    
        public SwipeLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
            init(attrs, 0);
        }
    
        public SwipeLayout(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            init(attrs, defStyle);
        }
    
        private void init(AttributeSet attrs, int defStyle) {
            // Load attributes
            final TypedArray a = getContext().obtainStyledAttributes(
                    attrs, R.styleable.SwipeLayout, defStyle, 0);
    
            mExampleString = a.getString(
                    R.styleable.SwipeLayout_exampleString);
            mExampleColor = a.getColor(
                    R.styleable.SwipeLayout_exampleColor,
                    mExampleColor);
            // Use getDimensionPixelSize or getDimensionPixelOffset when dealing with
            // values that should fall on pixel boundaries.
            mExampleDimension = a.getDimension(
                    R.styleable.SwipeLayout_exampleDimension,
                    mExampleDimension);
    
            if (a.hasValue(R.styleable.SwipeLayout_exampleDrawable)) {
                mExampleDrawable = a.getDrawable(
                        R.styleable.SwipeLayout_exampleDrawable);
                mExampleDrawable.setCallback(this);
            }
    
            a.recycle();
    
            // Set up a default TextPaint object
            mTextPaint = new TextPaint();
            mTextPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
            mTextPaint.setTextAlign(Paint.Align.LEFT);
    
            // Update TextPaint and text measurements from attributes
            invalidateTextPaintAndMeasurements();
        }
    
        private void invalidateTextPaintAndMeasurements() {
            mTextPaint.setTextSize(mExampleDimension);
            mTextPaint.setColor(mExampleColor);
            mTextWidth = mTextPaint.measureText(mExampleString);
    
            Paint.FontMetrics fontMetrics = mTextPaint.getFontMetrics();
            mTextHeight = fontMetrics.bottom;
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
    
            // TODO: consider storing these as member variables to reduce
            // allocations per draw cycle.
            int paddingLeft = getPaddingLeft();
            int paddingTop = getPaddingTop();
            int paddingRight = getPaddingRight();
            int paddingBottom = getPaddingBottom();
    
            int contentWidth = getWidth() - paddingLeft - paddingRight;
            int contentHeight = getHeight() - paddingTop - paddingBottom;
    
            // Draw the text.
            canvas.drawText(mExampleString,
                    paddingLeft + (contentWidth - mTextWidth) / 2,
                    paddingTop + (contentHeight + mTextHeight) / 2,
                    mTextPaint);
    
            // Draw the example drawable on top of the text.
            if (mExampleDrawable != null) {
                mExampleDrawable.setBounds(paddingLeft, paddingTop,
                        paddingLeft + contentWidth, paddingTop + contentHeight);
                mExampleDrawable.draw(canvas);
            }
        }
    
        /**
         * Gets the example string attribute value.
         *
         * @return The example string attribute value.
         */
        public String getExampleString() {
            return mExampleString;
        }
    
        /**
         * Sets the view's example string attribute value. In the example view, this string
         * is the text to draw.
         *
         * @param exampleString The example string attribute value to use.
         */
        public void setExampleString(String exampleString) {
            mExampleString = exampleString;
            invalidateTextPaintAndMeasurements();
        }
    
        /**
         * Gets the example color attribute value.
         *
         * @return The example color attribute value.
         */
        public int getExampleColor() {
            return mExampleColor;
        }
    
        /**
         * Sets the view's example color attribute value. In the example view, this color
         * is the font color.
         *
         * @param exampleColor The example color attribute value to use.
         */
        public void setExampleColor(int exampleColor) {
            mExampleColor = exampleColor;
            invalidateTextPaintAndMeasurements();
        }
    
        /**
         * Gets the example dimension attribute value.
         *
         * @return The example dimension attribute value.
         */
        public float getExampleDimension() {
            return mExampleDimension;
        }
    
        /**
         * Sets the view's example dimension attribute value. In the example view, this dimension
         * is the font size.
         *
         * @param exampleDimension The example dimension attribute value to use.
         */
        public void setExampleDimension(float exampleDimension) {
            mExampleDimension = exampleDimension;
            invalidateTextPaintAndMeasurements();
        }
    
        /**
         * Gets the example drawable attribute value.
         *
         * @return The example drawable attribute value.
         */
        public Drawable getExampleDrawable() {
            return mExampleDrawable;
        }
    
        /**
         * Sets the view's example drawable attribute value. In the example view, this drawable is
         * drawn above the text.
         *
         * @param exampleDrawable The example drawable attribute value to use.
         */
        public void setExampleDrawable(Drawable exampleDrawable) {
            mExampleDrawable = exampleDrawable;
        }
    }
    

1 个答案:

答案 0 :(得分:0)

当您通过此菜单添加新视图时,Studio会使用一些示例代码和资源填充它。它似乎是一些未添加的示例代码引用属性。您需要在资源文件中提供所需的资源(exampleColor等),或者将示例引用更改为实际的。