سؤال

لدي مربع حوار مع EditText وزر. هذه EditText سوف تسمي جدول قاعدة البيانات التي سأقوم بإنشائها بحيث يتم التحقق من أهميتها. لذلك أود طرح أسئلة 2:

1) هذا بسيط للغاية ، لكنني لم أستطع زناعة ذلك في أي مكان: ما هي الأحرف التي يمكن أن يقبلها اسم جدول قاعدة البيانات؟ هل يمكن أن تقبل الأرقام؟ وهل يمكن أن يكون الرقم الشخصية الأولى؟

2) تمكنت من التحقق من صحة EditText استخدام TextWtacher. هذا هو الرمز:

et_name.addTextChangedListener(new TextWatcher() {

public void afterTextChanged(Editable s) {

    String filtered_str = s.toString();

        if (filtered_str.matches(".*[^a-z^0-9].*")) {

        filtered_str = filtered_str.replaceAll("[^a-z^0-9]", "");

        s.clear();

        // s.insert(0, filtered_str);

        Toast.makeText(context,
            "Only lowercase letters and numbers are allowed!",
            Toast.LENGTH_SHORT).show();

    }

}

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

    public void onTextChanged(CharSequence s, int start, int before, int count) {}
});

حاليًا ، إذا قام المستخدم بإدراج أي حرف آخر غير الأحرف والأرقام الصغيرة ، فسيتم مسح مربع النص. إذا كنت غير متوفرة s.insert(0, filtered_str); من أجل استبدال EditText بالسلسلة المصفاة ، يتم تعليق تطبيقي. وتخمين ما أجده في التصحيح؟

خطأ/AndroidRuntime (2454): java.lang.StackOverflowError = د

السؤال هو ... كيف يمكنني استبدال نص S؟

-> s.replace(0, s.toString().length(), filtered_str); (إزالة S. ، بالطبع) لا يبدو أنه يعمل أيضًا.

هل كانت مفيدة؟

المحلول 2

بعد بعض الرؤوس ، وجدت أخيرًا الحل. يبدو S.Append (filtered_str) بعد أعمال S.Clear (). دونو لماذا لم ينجح من قبل.

نصائح أخرى

private TextWatcher listenerTextChangedFiltro = new TextWatcher() {
        public void afterTextChanged(Editable editable) {

                final String textoFiltrado = StaticString.filterTextCustom(String.valueOf(editable.toString().toLowerCase()));
                if (!textoFiltrado.equals(editable.toString().toLowerCase())) {
                    editable.clear();
                    editable.append(textoFiltrado);
                }
         }
};

مهلا! أحاول شيئًا مشابهًا مع إجبار نص الإدخال على أن يكون كلوزًا صغيرًا ؛ S.Clear () تليها S.Append () يسبب stackoverflow بالنسبة لي أيضا (أو لا يزال).

أتساءل لماذا يضعنا Android من خلال الأطواق لفرض التحويل إلى الأحرف الصغيرة؟

منذ استخدام TextWatcher كان يتعطل بالنسبة لي (عن حق ... ولم أستطع معرفة كيفية عمل تمتد) ، نظرت إلى TransformationMethod.

كانت المحاولة الأولى هي القيام بموجب تحويل مضمّن على edittext مع شيء مثل هذا:

et.setTransformationMethod(new TransformationMethod() {

        public void onFocusChanged(View view, CharSequence sourceText, boolean focused, int direction,
                Rect previouslyFocusedRect) {
        }

        public CharSequence getTransformation(CharSequence source, View view) {
            String ret = source.toString().toLowerCase();
            System.out.println(ret);
            return ret;
        }
    });

تسبب هذا في تعطل بسبب IndexArrayoutofbounds بمجرد أن كتبت شارًا واحدًا في ET ... لم أستطع معرفة السبب.

لذا ، راجعت رمز التحويل إلى كلمة المرور ثم استبدال التحويل - كلاهما يبدو معقدًا للغاية ولم أكن أرغب في الإزعاج بكل هذه الأشياء؟.

ثم في التحقق من الفئة الفرعية SinglelinTransformation التي كانت بسيطة ... لذلك قمت بإنشاء التحويلات السفلية باعتبارها فئة فرعية من التحول البديل على النحو التالي:

public class LowerCaseReplacement extends ReplacementTransformationMethod {
private static final char[] ORIG = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
        'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
private static final char[] REPS = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
        'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
private static LowerCaseReplacement singleton;

@Override
protected char[] getOriginal() {
    return ORIG;
}

@Override
protected char[] getReplacement() {
    return REPS;
}

public static LowerCaseReplacement getInstance() {
    if (singleton == null)
        singleton = new LowerCaseReplacement();
    return singleton;
}

}

وإضافة هذا xform إلى et ... كما في et.setTransformationMethod (lowerCaserePlacement.getInstnace ()) ...

هذا يعمل!!

إذا كان لدى أي شخص حل أفضل ، فيرجى التنوير!

المشكلة هي أنه عند الاتصال بالطريقة الإدراج ، يتم استدعاء طريقة تم تغيير النص مرة أخرى. ينتج عن هذا دائرة مفرغة ، وبالتالي فاضلة المكدس. يمكنك تجنب ذلك من خلال عدم استبدال سلسلة منسقة بشكل صحيح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top