20

私は Android 開発に不慣れで、onKeyUpリスナーの使用方法に関する適切なガイドが見つからないようです。

私のアプリでは、EditText誰かがキーを押して離したときに大きな があり、そのEditText中で正規表現を実行する関数を呼び出したいと考えていEditTextます。

onKeyUp の使い方がわかりません。誰かが私に方法を教えてもらえますか?

4

7 に答える 7

34

非常に正しい方法は、TextWatcher クラスを使用することです。

EditText tv_filter = (EditText) findViewById(R.id.filter);

TextWatcher fieldValidatorTextWatcher = new TextWatcher() {
        @Override
        public void afterTextChanged(Editable s) {
        }

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

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (filterLongEnough()) {
                populateList();
            }
        }

        private boolean filterLongEnough() {
            return tv_filter.getText().toString().trim().length() > 2;
        }
    };
    tv_filter.addTextChangedListener(fieldValidatorTextWatcher);
于 2011-08-26T20:12:18.433 に答える
12

修正:

しばらくの間、汎用のonKeyListenerを使用しました。コードが 2 回呼び出されていることがすぐにわかりました。キーダウンで 1 回、キーアップで 1 回。次のリスナーを使用して、コードを 1 回だけ呼び出します。 "if (event.getAction() == KeyEvent.ACTION_UP)"が鍵です。

OnKeyListener keyListener = new OnKeyListener() {

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_UP) {
            //do something here
        }
        return false;
    }
};

onKeyUp()アクティビティ内のすべてのコントロールに対して自動的に呼び出されることがわかりました。これが必要な場合は、追加するのと同じようにアクティビティに追加しますonCreate()

例:

public boolean onKeyUp(int keyCode, KeyEvent event) {
    //do something here
    return false;
};

これは古い質問であることは知っていますが、同じ問題を抱えている他の人に役立つかもしれません。

于 2011-02-18T17:05:24.100 に答える
2

次のコードの使用を検討してください。

 @Override 
 public boolean onKeyUp(int keyCode, KeyEvent event) {
    switch (keyCode) {
        ...
        case KeyEvent.KEYCODE_J:
            if (event.isShiftPressed()) {
                fireLaser();
            } else {
                fireMachineGun();
            }
            return true;
        case KeyEvent.KEYCODE_K:
            if (event.isShiftPressed()) {
                fireSeekingMissle();
            } else {
                fireMissile();
            }
            return true;
        default:
            return super.onKeyUp(keyCode, event);
    } }

ここで最後に、super.onkeyUp メソッドを呼び出しました。ユーザーが有効なキーを押さない場合のイベントを処理します。

詳細については、次のリンクを検討してください。

于 2016-07-16T15:24:24.197 に答える
0

のためだけにEditText。それ自体で達成しsetOnClickListener()ます。の必要はありませんonKeyUp()。それはクリック/タッチイベントによって実行されるためです。右?これを行うだけです。

edittext_object.setOnClickListener(new OnClickListener() {
     public void onClick(View v) {
    //do what you need 
    }
}
于 2010-09-18T09:59:39.977 に答える
0

これを私の頭から書きますが、次の行の中にあるはずです:

text.setKeyListener(new KeyListener() {
    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {


        if(keyCode == KeyEvent.KEYCODE_0) dosomething // pick the custom key from keyEvent


        return super.onKeyUp(keyCode, event);
    }
});
于 2010-09-18T10:01:34.637 に答える
0
    ‏       public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
        ‏               case KeyEvent.KEYCODE_BACK:
        ‏                   actionLabel.setText("KEYCODE_BACK key pressed");
        ‏                   Toast.makeText(this, "Press again back for exit", Toast.LENGTH_SHORT).show();
        ‏                   counter++;
        ‏                   if (counter > 1) {
        ‏                       super.onBackPressed();
        ‏                   }
        ‏                   return true;
        ‏               case KeyEvent.KEYCODE_VOLUME_UP:
        ‏                   actionLabel.setText("VOLUME_UP key pressed");
        ‏                   return true;
        ‏               case KeyEvent.KEYCODE_VOLUME_DOWN:
        ‏                   actionLabel.setText("VOLUME_DOWN key pressed");
        ‏                   return true;
        ‏           }
        return super.onKeyDown(keyCode, event);
        ‏       }
    // catches the onKeyUp button event
    ‏       @Override
    ‏       public boolean onKeyUp(int keyCode, KeyEvent event) {
    ‏           switch (keyCode) {
    ‏               case KeyEvent.KEYCODE_BACK:
    ‏                   actionLabel.setText("KEYCODE_BACK key released");
    ‏                   return true;
    ‏               case KeyEvent.KEYCODE_VOLUME_UP:
    ‏                   actionLabel.setText("VOLUME_UP key released");
    ‏                   return true;
    ‏               case KeyEvent.KEYCODE_VOLUME_DOWN:
    ‏                   actionLabel.setText("VOLUME_DOWN key released");
    ‏                   return true;
    ‏           }
    ‏           return super.onKeyDown(keyCode, event);
    ‏       }
    // works for API level 5 and lower
    ‏       @Override
    ‏       public void onBackPressed() {
    ‏           actionLabel.setText("BACK key pressed");
    ‏           super.onBackPressed();
    ‏       }
    // catches the long press button event (longer than 2 seconds)
    ‏       @Override
    ‏       public boolean onKeyLongPress(int keyCode, KeyEvent event) {
    ‏           Toast.makeText(this, "Pressed for a long time", Toast.LENGTH_SHORT).show();
    ‏           return true;
    ‏       }
    // catches the on touch event on screen and shows the specific pixels
    ‏       // touched
    ‏       @Override
    ‏       public boolean onTouchEvent(MotionEvent event) {
    ‏           float x = event.getX();
    ‏           float y = event.getY();
    ‏           actionLabel.setText("Touch press on x: " + x + " y: " + y);
    ‏           return true;
    ‏       }}
于 2021-03-01T21:57:11.777 に答える