Пользовательский Edittext Скрытие панели выводов после ввода текста - PullRequest
0 голосов
/ 14 апреля 2020

Я новичок android разработчик и пытаюсь создать пользовательский текст для редактирования пин-кода, используя следующий код, и я хочу установить прозрачный цвет булавки, если он заполнен, к сожалению, в атрибуте * 1008 нет аргумента 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));
    }
}

}

Есть ли способ сделать это?

1 Ответ

0 голосов
/ 14 апреля 2020

состояние не заполнено, но вы можете его создать. Вы можете использовать интерфейс TextWatcher, он будет срабатывать при каждом обновлении текста. там вы можете проверить, равен ли текущий размер текста вашему 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
}
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...