質問

とのダイアログがあります 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 = d

問題は...どのようにSテキストを置き換えることができますか?

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

役に立ちましたか?

解決 2

いくつかのヘッドバンギングの後、私はついに解決策を見つけました。 S.Clear()が機能した後、S.Append(filtered_str)のようです。なぜ以前はうまくいかなかったのか。

他のヒント

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を見ました。

最初の試みは、このようなもので編集上のインライン変換methodを行うことでした。

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によるクラッシュが発生しました...理由を理解できませんでした。

それで、パスワード変換のコードを確認し、次に交換トランスフォーメーションをチェックしました - どちらも非常に複雑に見え、私はそのすべてを気にしたくありませんか?

その後、シンプルなSingLelineTransFormationサブクラスをチェックアウトしました。

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