6

私はAndroidアプリを開発していますが、EditText1つと2つRadioButtonsAB)があります。

私がやろうとしていることは:

Aがチェックされている場合RadioButton、キーボードレイアウトを変更して[完了]ボタンで表示しますRadioButton。Bがチェックされている場合、キーボードレイアウトを変更して、[検索]ボタンで表示します。

IMEOptions私はこのように私のを変更しようとしましたEditTextが、それでも機能しません:

注意:キーボードはすでに表示されています。私がやりたいのは、[検索]ボタンを[完了]ボタンで変更することです。radioButtons

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    if(btnA.isChecked() ) { 
        txtSearch.setImeOptions(EditorInfo.IME_ACTION_DONE);
//      txtSearch.invalidate(); 
    }
    else {
        txtSearch.setImeOptions(EditorInfo.IME_ACTION_SEARCH);
//      txtSearch.invalidate();
    }   
}

それを行う方法についてのアイデアはありますか?

前もって感謝します。

4

4 に答える 4

11

どのAndroidバージョンをターゲットにしていますか?申し訳ありませんがコメントを投稿できません(新しいアカウント)が、現在、あなたの質問に答えるためにテストケースを作成しています。

編集:わかりました、私はそれを理解しました。少しグーグル(この問題を参照)してコーディングした後、imeOptionsがキャッシュ/入力メソッドに関連付けられているように見えることがわかりました。これがバグなのか意図的な機能なのかわかりません。ユーザーがいずれかのラジオボタンをタップしたときにキーボードを切り替えるには、最初にinputTypeがEditText(android:inputType="text")に設定されていることを確認してから、onCreateメソッドで次を使用します。

final RadioGroup btn_group = (RadioGroup) findViewById(R.id.btn_group);
final RadioButton btnA = (RadioButton) findViewById(R.id.btnA);
final RadioButton btnB = (RadioButton) findViewById(R.id.btnB);

btn_group.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
        final EditText txtSearch = (EditText) findViewById(R.id.edit_text);

        txtSearch.setInputType(InputType.TYPE_NULL);

        if(btnA.isChecked()) {
            txtSearch.setImeOptions(EditorInfo.IME_ACTION_DONE);
        } else {
            txtSearch.setImeOptions(EditorInfo.IME_ACTION_SEARCH);
        }

        txtSearch.setInputType(InputType.TYPE_CLASS_TEXT);
    }
});

InputTypeのヌルアウトと再設定に注意してください。

最後に、一般的なキーボードの実装の多くは、設定した内容を気にimeOptionsしないため、アプリのこの機能に依存しないように注意してください。たとえば、Swype。

結論として(私がそこで何をしたかを見てください)、負けないように、私は自分のテストプログラムをまとめました。ここで見つけることができます:http://dl.dropbox.com/u/52276321/ChangeKeyboardTest.zip

于 2012-03-08T08:15:10.073 に答える
1

巨人の肩の上に立っていることに基づいて、これが私が思いついたものです。@aaronsnoswellに感謝します。

private void imeSetup(boolean isDoneOk){
    if (isDoneOk!=lastIsDoneOk) {
        int inputType = editText.getInputType();
        int selectionStart = editText.getSelectionStart();
        editText.setInputType(InputType.TYPE_NULL);
        if (isDoneOk)
            editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
        else
            editText.setImeOptions(EditorInfo.IME_ACTION_NEXT);
        editText.setInputType(inputType);
        editText.setSelection(selectionStart);
        lastIsDoneOk = isDoneOk;
    }
}

シェナニガンなしで、lastIsDoneOk私は無限ループに入りました。YMMVは、これを内から呼び出しているTextWatcherため、必要ない場合があります。を追跡せずにselectionStart、Androidはカーソルを最初に戻します。

于 2014-08-18T22:34:27.967 に答える
0

これを試してくださいRadioGroup。それは間違いなく動作します。またはリンクを使用

https://gist.github.com/475320

// This will get the radiogroup
RadioGroup rGroup = (RadioGroup)findViewById(r.id.radioGroup1);
// This will get the radiobutton in the radiogroup that is checked
RadioButton checkedRadioButton = (RadioButton)rGroup.findViewById(rGroup.getCheckedRadioButtonId());


// This overrides the radiogroup onCheckListener
rGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()
{
    public void onCheckedChanged(RadioGroup rGroup, int checkedId)
    {

    switch(checkedId){
        case R.id.btnA:
            txtSearch.setImeOptions(EditorInfo.IME_ACTION_DONE);
            break;
        case R.id.btnB:
             txtSearch.setImeOptions(EditorInfo.IME_ACTION_SEARCH);
            break;enter code here
        default:
            break;
    }
       txtSearch.setCloseImeOnDone(true); // close the IME when done is pressed
    }
});
于 2012-03-05T12:38:26.003 に答える
0

クラスハンドラーを使用して、ビューを動的に更新してみてください。

差出人:Androidのボタンテキストを変更

于 2012-03-05T19:37:26.447 に答える