textimemultiline Android InputType 레이아웃 매개 변수-음수를 허용하는 방법은 무엇입니까?



android inputtype numberdecimal (6)

3 개의지도 좌표를 입력 할 수있는 세 개의 필드가있는 레이아웃이 있습니다. 여태까지는 그런대로 잘됐다. 나는 android : inputType = "numberDecimal"레이아웃을 사용하고 있습니다. 필드에 들어가면 사용자는 숫자 키패드를 얻습니다. 여전히 좋은.

그러나 음수 좌표를 입력해야하는 경우에는이를 수행 할 분명한 방법이 없습니다.

23.2342가 정상적으로 작동합니다. 232.3421이 정상적으로 작동합니다. -11.23423을 입력 할 수 없습니다. 선행하는 음수 부호를 입력하거나 좌표를 () 안에 감쌀 수 없습니다.

나는 이것을 직선 텍스트 inputType으로 변경하는 길을 찾아 정규 표현식을 사용하여 입력 된 내용이 실제로 숫자 좌표인지 확인하고 사용자에게 다시 메시징 오류를 처리하는 등의 작업을 할 수있을 것이라고 확신한다. 오히려 그 길로 가지 마라.

나는 깡통을 가지고 몇 시간 동안이 질문을 Googled and Stackoverflowed했다. 어떤 제안?

https://ffff65535.com


나는 당신의 자신의 주문 keylistener 창조가 당신의 최선의 방법일지도 모른다 생각한다. 나는 비슷한 것을했다. 다음과 같이 SignedDecimalKeyListener를 만들었습니다.

public class SignedDecimalKeyListener extends NumberKeyListener 
{
    private char[] mAccepted;
    private static SignedDecimalKeyListener sInstance;

    private static final char[] CHARACTERS = new char[] { '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.' };

    @Override
    protected char[] getAcceptedChars()
    {
        return mAccepted;
    }

    private SignedDecimalKeyListener()
    {
        mAccepted = CHARACTERS;
    }

    public static SignedDecimalKeyListener getInstance()
    {
        if(sInstance != null) 
            return sInstance;
        sInstance = new SignedDecimalKeyListener();
        return sInstance;
    }

    public int getInputType()
    {
        return InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL;
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend)
    {
        CharSequence out = super.filter(source, start, end, dest, dstart, dend);

        if(out != null)
        {
            source = out;
            start = 0;
            end = out.length();
        }

        //Only allow a '-' to be the very first char
        //and don't allow '.' to be the first char
        if(dstart > 0 && source.equals("-") || dstart == 0 && source.equals("."))
        {
            SpannableStringBuilder stripped = null;

            stripped = new SpannableStringBuilder(source, start, end);
            stripped.delete(start, end);

            if(stripped != null)
                return stripped;
        }
        else if(source.equals("."))
        {
            for(int lo = dend-1; lo > 0; lo--)
            {
                char c = dest.charAt(lo);
                if(source.equals(String.valueOf(c)))
                {
                    SpannableStringBuilder stripped = null;

                    stripped = new SpannableStringBuilder(source, start, end);
                    stripped.delete(start, end);

                    if(stripped != null)
                        return stripped;
                }
            }
        }

        if(out != null)
            return out;
        else
            return null;
    }
}

그리고이 custom keylistener를 다음과 같은 edittext와 함께 사용하십시오 :

EditText myEditText = (EditText)findViewById(R.id.myedittext);
myEditText.setKeyListener(SignedDecimalKeyListener.getInstance());

내가 뭔가를 놓치지 않는다면 이것 만 있으면 충분 해.

android:inputType="numberDecimal|numberSigned"

메신저 입력 유형에 대해 모르겠지만 항상 자신의 텍스트 필터를 만들고 editText 필드에 첨부 할 수 있습니다. 그 중 하나는 꽤 간단합니다. 모든 문자를 확인하고 원하는 숫자, 점 또는 사용자 정의 문자 만 허용 할 수 있습니다.


실제 텍스트 입력 형식을 그대로두고 각 축에 대해 Pattern 및 Matcher를 사용하여 종료했습니다.

3 축 필드, 저장 버튼 트리거 저장. 필드가 유효하고 삽입이 발생하거나 제출자에게 Axes 필드에 대한 필수 형식에 대한 오류 메시지가 발생합니다. 적절한 형식은 1-3 자리이며 선택적으로 '-'앞에 붙을 수 있으며 선택적으로 '.' 및 추가 자릿수.

이 코드를보십시오 :

private View.OnClickListener onSave=new View.OnClickListener(){
    public void onClick(View v){
        Pattern xAxis = Pattern.compile("[-+]?([0-9]*\\.)?[0-9]+");
        Matcher mForX = xAxis.matcher(xaxis.getText().toString());

        Pattern yAxis = Pattern.compile("[-+]?([0-9]*\\.)?[0-9]+");
        Matcher mForY = yAxis.matcher(yaxis.getText().toString());

        Pattern zAxis = Pattern.compile("[-+]?([0-9]*\\.)?[0-9]+");
        Matcher mForZ = zAxis.matcher(zaxis.getText().toString());

        //If Axis X and Axis Y and Axis Z are all valid entries, the proceed.
        if(mForX.find() && mForY.find() && mForZ.find()){
             //handle insert or update statement here
        }else{
             //give error message regarding correct Axis value format
        }
   }

}


이것은 나를 위해 일하고있다.

etbox.setInputType (InputType.TYPE_NUMBER_FLAG_SIGNED | InputType.TYPE_CLASS_NUMBER);


EditText.setInputType InputType.TYPE_NUMBER_FLAG_SIGNED를 설정하십시오.





layout