java - 自定义Edittext输入文本后隐藏pin栏

标签 java android kotlin android-edittext android-appcompat

我是一个初学者 android 开发人员,尝试使用以下代码创建自定义 Pin Edittext,并且我想将 pin 的颜色设置为透明(如果填充),不幸的是 android 的 attr 中没有 state_filled ,应该如何我这样做吗?请帮助我,这是我的代码。

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));
    }
}

}

有办法吗?

最佳答案

没有 state_filled 但您可以创建一个。您可以使用 TextWatcher 接口(interface),只要文本更新,它就会被触发。您可以检查当前文本大小是否等于您的 mMaxLength 将引脚颜色设置为透明,否则。 这是 TextWatcher 实现的示例:

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
}
});

关于java - 自定义Edittext输入文本后隐藏pin栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61202265/

相关文章:

android - PWA 的推送通知或 Web 推送通知

android - 导航 popBackStack 禁止进一步导航到该 fragment

android - 启动器中未显示图标

java - 我的 WebSocket 没有按预期工作;服务器用 Java 实现,客户端用 JavaScript

java - 替换字符串中的子字符串,除非字符串在引号内

java - 由 : java. lang.RuntimeException 引起:Parcelable 读取 Serialized 对象时遇到 IOException

database - Kotlin:sqlite数据库表未创建

java - 如何检查 BottomNavigationView 中哪个菜单文件已膨胀?

java - Jenkins 无法为我的 Selenium 项目编译 Maven

java - 带有加号字符的字符串匹配方法返回 false