首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >输入文本后自定义Edittext隐藏拼接栏

输入文本后自定义Edittext隐藏拼接栏
EN

Stack Overflow用户
提问于 2020-04-14 15:00:50
回答 1查看 149关注 0票数 0

我是一个初学者安卓开发人员,并试图创建一个自定义引脚编辑文本使用以下代码,我想设置引脚的颜色为透明,如果填充,不幸的是有没有state_filled在安卓的attr,我应该怎么做?请帮帮我,这是我的代码。

代码语言:javascript
复制
public class PinEntryEditText extends AppCompatEditText {
public static final String XML_NAMESPACE_ANDROID = "http://schemas.android.com/apk/res/android";

private float mSpace = 24; //24 dp by default, space between the lines
private float mCharSize;
private float mNumChars = 6;
private float mLineSpacing = 8; //8dp by default, height of the text from our lines
private int mMaxLength = 6;

private OnClickListener mClickListener;

private float mLineStroke = 1; //1dp by default
private float mLineStrokeSelected = 2; //2dp by default
private Paint mLinesPaint;
int[][] mStates = new int[][]{
        new int[]{android.R.attr.state_selected}, // selected
        new int[]{android.R.attr.state_focused}, // focused
        new int[]{-android.R.attr.state_focused}, // unfocused

};

//Green color = 0xFFB6C800
//Gray color = 0xFFCCCCCC
int[] mColors = new int[]{
        0xFFB6C800,
        0xFFCCCCCC,
        0xFF880000,
};

ColorStateList mColorStates = new ColorStateList(mStates, mColors);

public PinEntryEditText(Context context) {
    super(context);
}

public PinEntryEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context, attrs);
}

public PinEntryEditText(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init(context, attrs);
}

private void init(Context context, AttributeSet attrs) {
    float multi = context.getResources().getDisplayMetrics().density;
    mLineStroke = multi * mLineStroke;
    mLineStrokeSelected = multi * mLineStrokeSelected;
    mLinesPaint = new Paint(getPaint());
    mLinesPaint.setStrokeWidth(mLineStroke);
    setBackgroundResource(0);
    mSpace = multi * mSpace; //convert to pixels for our density
    mLineSpacing = multi * mLineSpacing; //convert to pixels for our density
    mMaxLength = attrs.getAttributeIntValue(XML_NAMESPACE_ANDROID, "maxLength", 4);
    mNumChars = mMaxLength;

    //Disable copy paste
    super.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return false;
        }

        public void onDestroyActionMode(ActionMode mode) {
        }

        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            return false;
        }

        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            return false;
        }
    });
    // When tapped, move cursor to end of text.
    super.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            setSelection(getText().length());
            if (mClickListener != null) {
                mClickListener.onClick(v);
            }
        }
    });

}

@Override
public void setOnClickListener(OnClickListener l) {
    mClickListener = l;
}

@Override
public void setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {
    throw new RuntimeException("setCustomSelectionActionModeCallback() not supported.");
}

@Override
protected void onDraw(Canvas canvas) {
    //super.onDraw(canvas);
    int availableWidth = getWidth() - getPaddingRight() - getPaddingLeft();
    if (mSpace < 0) {
        mCharSize = (availableWidth / (mNumChars * 2 - 1));
    } else {
        mCharSize = (availableWidth - (mSpace * (mNumChars - 1))) / mNumChars;
    }

    int startX = getPaddingLeft();
    int bottom = getHeight() - getPaddingBottom();

    //Text Width
    Editable text = getText();
    int textLength = text.length();
    float[] textWidths = new float[textLength];
    getPaint().getTextWidths(getText(), 0, textLength, textWidths);

    for (int i = 0; i < mNumChars; i++) {
        updateColorForLines(i == textLength);
        canvas.drawLine(startX, bottom, startX + mCharSize, bottom, mLinesPaint);

        if (getText().length() > i) {
            float middle = startX + mCharSize / 2;
            canvas.drawText(text, i, i + 1, middle - textWidths[0] / 2, bottom - mLineSpacing, getPaint());
        }

        if (mSpace < 0) {
            startX += mCharSize * 2;
        } else {
            startX += mCharSize + mSpace;
        }
    }
    //mLinesPaint.setColor(getColorForState(0xff1a1f71));
}


private int getColorForState(int... states) {
    return mColorStates.getColorForState(states, Color.GRAY);
}

/**
 * @param next Is the current char the next character to be input?
 */
private void updateColorForLines(boolean next) {
    if (isFocused()) {
        mLinesPaint.setStrokeWidth(mLineStrokeSelected);
        mLinesPaint.setColor(getColorForState(android.R.attr.state_focused));
        if (next) {
            mLinesPaint.setColor(getColorForState(android.R.attr.state_selected));
        }
    } else {
        mLinesPaint.setStrokeWidth(mLineStroke);
        mLinesPaint.setColor(getColorForState(-android.R.attr.state_focused));
    }
}

}

有办法做到这一点吗?

EN

回答 1

Stack Overflow用户

发布于 2020-04-14 15:04:12

没有state_filled,但您可以创建一个。你可以使用TextWatcher接口,它会在文本被更新时被触发。您可以在那里检查当前文本大小是否与您的mMaxLength相同,将引脚颜色设置为透明或其他。以下是TextWatcher实现的一个示例:

代码语言:javascript
复制
et1.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {

    // TODO Auto-generated method stub
}

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    // TODO Auto-generated method stub
}

@Override
public void afterTextChanged(Editable s) {

    // TODO Auto-generated method stub
}
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61202265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档