2012-01-30 4 views
1

Я дал android:singleLine="true" вариант на EditTextPreference, а когда поле редактирования в диалоговом окне имеет фокус, на клавиатуре программного обеспечения появляется кнопка «Готово» вместо клавиши «Ввод». Однако, если я нажимаю кнопку «Готово», закрывается только клавиатура программного обеспечения, и мне еще нужно нажать кнопку «Готово» в диалоговом окне.Как сделать работу с ключом в диалоговом окне EditTextPreference

Есть ли способ сделать ключ ввода и ime на клавиатуре программного обеспечения, чтобы закрыть диалоговое окно и применить новое значение?

ответ

6

Во-первых, я установил IME вариант для IME_ACTION_DONE

mEditTextPreference.getEditText().setImeOptions(EditorInfo.IME_ACTION_DONE); 

, а затем используя следующий код, чтобы сохранить значение и закрыть диалоговое окно.

mEditTextPreference.getEditText().setOnEditorActionListener(new OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
     if (actionId == EditorInfo.IME_ACTION_DONE){ 
      //mEditTextPreference.setText(mEditTextPreference.getEditText().getText().toString()); 

      //better solution 
      mEditTextPreference.onClick(mEditTextPreference.getDialog(), Dialog.BUTTON_POSITIVE); 
      mEditTextPreference.getDialog().dismiss(); 
      return true; 
     } 
     return false; 
    } 
}); 
+2

Спасибо. Мне удалось обмануть его, чтобы думать, что нажата положительная кнопка, вызвав 'editPref.onClick (editPref.getDialog(), DialogInterface.BUTTON_POSITIVE);' перед вызовом 'reject()'. Это хакерский подход, но я могу повторить ту же логику. – dasony

+1

Ваше решение лучше, чем мое, я объединил его в должность. спасибо: D – LZN

+0

Еще лучше установить ime в макете xml в тексте редактирования следующим образом: 'android: imeOptions =" ​​actionDone "'. –

0

Вы пробовали using android:inputType="textCapSentences" (textCapSentences - один из многих вариантов) в XML для текста редактирования. У меня была аналогичная проблема, и я смог ее решить, и дал мне контроль над клавиатурой, которую я мог бы показать.

Например, если у меня был номер только поле я мог бы использовать android:inputType="number", который будет показывать цифровую клавиатуру против QWERTY-клавиатуры первой, есть много различных вариантов

+0

К сожалению, я видел это поздно, но меня не волнует тип клавиатуры. Я просто хочу, чтобы ключ ввода закрыл диалоговое окно и применил измененное значение. Наверное, для этого мне нужно создать свой собственный диалог. – dasony

0

Я думаю, что DialogPreference с EditText обычно должен всегда закрывать себя, когда пользователь нажимает Готовы кнопку и экранная клавиатура закрывается. Чтобы сделать это поведение по умолчанию, легко реализовать настроенный EditTextPreferenceCustomized, а затем использовать его везде, а не стандартный EditTextPreference.

import android.app.Dialog; 
import android.content.Context; 
import android.preference.EditTextPreference; 
import android.view.KeyEvent; 
import android.view.View; 
import android.view.inputmethod.EditorInfo; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.TextView.OnEditorActionListener; 

public class EditTextPreferenceCustomized extends EditTextPreference 
{ 
    public EditTextPreferenceCustomized(Context context) 
    { 
     super(context); 
    } 

    public EditTextPreferenceCustomized(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
    } 

    public EditTextPreferenceCustomized(Context context, AttributeSet attrs, int defStyle) 
    { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    protected void onAddEditTextToDialogView(View dialogView, EditText editText) 
    { 
     super.onAddEditTextToDialogView(dialogView, editText); 

     // editText.setImeOptions(EditorInfo.IME_ACTION_DONE); - uncomment if it's not specified in preferences.xml 

     editText.setOnEditorActionListener(new OnEditorActionListener() 
     { 
      @Override 
      public boolean onEditorAction(TextView v, int actionId, KeyEvent event) 
      { 
       if(actionId == EditorInfo.IME_ACTION_DONE) 
       { 
       onClick(getDialog(), Dialog.BUTTON_POSITIVE); 
       getDialog().dismiss(); 
       return true; 
       } 
       return false; 
      } 
     }); 
    } 
} 

Код частично на основе полезного решения от @LZN, но это позволит устранить необходимость установки действий слушателя для каждого предпочтения в Java коде. Просто замените в preferences.xml все экземпляры EditTextPreference на com.yourpackage.EditTextPreferenceCustomized.

Смежные вопросы