7

とボタンのあるダイアログがEditTextあります。これEditTextにより、作成するデータベース テーブルに名前が付けられるため、検証が最も重要になります。だから私は2つの質問をしたいと思います:

1) これは非常に単純ですが、どこにも見つけることができませんでした: データベースのテーブル名に使用できる文字は何ですか? 数字を受け入れることはできますか?また、数字を最初の文字にすることはできますか?

EditText2) を使用して検証することができました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 =D

問題は...どうすればsテキストを置き換えることができますか?

-> s.replace(0, s.toString().length(), filtered_str);(もちろん、s.clear を削除します) も機能しないようです。

4

4 に答える 4

6

いくつかのヘッドバンギングの後、私は最終的に解決策を見つけました。s.clear() が機能した後、 s.append(filtered_str) のようです。なぜ以前は機能しなかったのかわかりません。

于 2010-11-23T18:12:45.463 に答える
1

おい!入力テキストをすべて小文字にすることで同様のことを試みています。s.clear() の後に s.append() が続くと、私にも (またはまだ) StackOverflow が発生します。

なぜ Android は小文字への変換を強制するためにフープを通過させるのだろうか?

TextWatcher を使用するとクラッシュしていたので (当然のことですが、スパンの操作方法がわかりませんでした)、TransformationMethod を調べました。

最初の試みは、次のようなものを使用して、EditText でインライン TransformationMethod を実行することでした。

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

これにより、ET に単一の文字を入力するとすぐに IndexArrayOutOfBounds が原因でクラッシュが発生しました...理由がわかりませんでした。

そこで、PasswordTransformation と ReplacementTransformation のコードをチェックしました。どちらも非常に複雑に思えます。

次に、単純な SinglelineTransformation サブクラスをチェックアウトしました...次のように、ReplacementTransformation のサブクラスとして LowerCaseTransformation を作成しました。

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())...

これは機能します!!

誰かがより良い解決策を持っている場合は、啓発してください!

于 2010-12-01T23:00:19.820 に答える
0

問題は、挿入メソッドを呼び出すと、テキスト変更メソッドが再度呼び出されることです。これにより、スタック オーバーフローという悪循環が発生します。これは、適切にフォーマットされた文字列を置き換えないことで回避できます。

于 2010-11-22T18:47:21.810 に答える