6

私が欲しい のは、ユーザーが10.40などの値を入力できるEditTextがあります。ユーザーが編集を終えたら、入力を通貨にフォーマットします。たとえば、上記の値は$ 10.40(Locale.USの場合)にフォーマットされます。そして、その結果を、ユーザーが以前に編集したのと同じEditTextで表示します。

問題 私は彼の入力をフォーマット(つまり変更)しようとしているので、彼がいつ完了したかを知る必要があります(したがって、私のフォーマットは彼の進行中の入力に干渉しません)。

私が試し たTextWatcherは、すべての編集で起動するため、オプションではありません。したがって、ユーザーが1、0、4、ドット、およびゼロ(= 10.40)を入力すると発生します。現在、希望どおりに機能するOnFocusChangeListenerを使用していますが、問題は次のとおりです。アプリケーションにボタンがあり、EditTextの編集後にユーザーがボタンをクリックしても、EditTextはフォーカスを失うことはないため、フォーマットコードは呼び出されません。 ..

この後、ボタンのフォーカスをいじってみて、FocusableInTouchModeに設定しました。これにより、ボタンを最初にフォーカスを取得し、2番目にアクティブ化されるため、ボタンを2回クリックして起動する必要があります(これは失敗です)。時間。たくさんのハッキングをした後、このジレンマを解決する方法について誰かがアイデアを持っているかどうか疑問に思いました。

いくつかのコード

上記の関数のEditTextに次のOnFocusChangeListenerを追加します。EditTextは、CurrencyTextbox内にカプセル化されています(これは実際には関係ありません)。

@Override
protected OnFocusChangeListener getOnFocusChangeListener() {
    return new OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {
                //Member variable in the class which contains an EditText
                CurrencyTextbox.this.hadFocus = true;
            } else {
                // Thes EditText has lost focus
                Log.v(TAG, "Lost focus.");
                if (CurrencyTextbox.this.hadFocus) {
                    // We previously had focus, now we lost it, format the user input!
                    // Get current value of the Textbox
                    String value = CurrencyTextbox.this.textbox.getText().toString();
                    // Formatting the user input
                    value = String.format(//Doing some formatting);
                    // Reset the had focus
                    CurrencyTextbox.this.hadFocus = false;
                }
            }
        }
    };
}

ただし、問題は、上記のOnFocusChangelistenerが呼び出されるのは、EditTextがフォーカスを失った場合のみですが、アクティビティのボタンをクリックしてもフォーカスが失われることはなく、前述のように、ボタンのisFocusableInTouchModeをtrueに設定することはできません。発砲するには毎回2回クリックする必要があるためです。

4

4 に答える 4

10

私はいくつかの調査を行い、とりわけこのスレッドを見つけました。それはあなたが抱えている(ボタンが焦点を合わせていない)同様の問題について詳しく述べています。次のことを試してください。ボタンでsetFocusable(true)を設定し(setFocusableInTouchModeではありません!これにより、OPで指定した迷惑な動作が発生するため)、ボタンで次のOnClickListenerを設定します。

    return new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO workaround because of android issue nr. 2705
            button.requestFocusFromTouch();
            // Do some stuff to handle OnClick
        }
    };

しかし、おそらくボタンのフォーカスを修正するだけでよいでしょう。現在の動作は実際にいくつかの問題を引き起こします(あなたのような)。

于 2011-12-29T12:10:43.183 に答える
0

との両方View.setFocusableInTouchMode()を使用してみてくださいView.requestFocus()。インターフェイスを使用してonKeyListener()ユーザー入力を検出し、各onKeyイベントの後にタイマーを開始して、妥当な遅延の後に編集を開始できます。

于 2011-12-29T10:12:44.293 に答える
0

何が問題になっていますか?setOnFocusChangeListenerurに含める必要がありますeditfield。確認してください。onFocusChangeをオーバーライドする必要があります。

plzはそれをチェックします...

ここにリンクの説明を入力してください

于 2011-12-29T10:13:05.010 に答える
0

はい、編集テキストが取得された後、フォーカスを失わないという問題は間違いなくあります。かなりグーグルした後、回避策だけで目的の結果を達成できることがわかりました。
同様の要件があり、上記のタスクを実行するための回避策を作成しました。これは私にとって非常に効果的です。
回避策は次のとおりです
。editTextのonClickListenerを設定し、onClickイベントでeditTextがクリックされたことを示すフラグを設定します。
editTextのonKeyListenerを設定し、onKeyイベントでeditTextの現在の値を取得します。
ここで、アクティビティ/ダイアログで[完了]/[戻る]ボタンをクリックしたとします。ここでは、editTextがクリックされたときに設定されたフラグを確認できます。したがって、その真の場合は、必要なプロシージャ呼び出しを行います。

EditText v = (EditText) layout.findViewById(R.id.framerate);
v.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        Log.d(ExploreUIActivity.TAG, "Insided onClick");
        vClicked= true;
    }
});
v.setOnKeyListener(new OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        Log.d(ExploreUIActivity.TAG, "Inside onKeyListener");
        value = ((EditText) v).getText().toString();
        return false;
    }
});


次に、戻る/完了ボタンについて、onClickListenerを設定し、フラグが設定されているかどうかを確認します

back.setOnClickListener(new OnClickListener() {
    public onClick(View v) {
        //check the flag
        //if set do some stuff
    });
于 2012-10-12T13:02:36.143 に答える