2010-06-06 3 views
67

Возможно ли иметь виджет EditText с набором android:inputType="textMultiLine" и android:imeOptions="actionDone" в то же время?Multi-line EditText с кнопкой «Готово»

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

Спасибо аванс

+0

Что о попытке соединения виджет с многострочного EditText и кнопки в сочетании друг с другом? –

+1

похоже на http://stackoverflow.com/questions/5014219/multiline-edittext-with-done-softinput-action-label-on-2-3 – larham1

ответ

2

Если речь идет не о внешнем виде экранной клавиатуры, вы можете просто ввести слушателя ввода на клавиатуре и запустить «done» -status, если пользователь вводит новую строку.

3

Короткий ответ: Нет, я считаю, что это невозможно до уровня API 11 (3.0).

Та же проблема всплыло здесь (обсуждается в комментариях к принятому ответ):

Android Soft keyboard action button

Из заключительного комментария:

Глядя на несколько приложений на моем телефоне, кажется, кажется, что многострочный ящик последний, с видимой кнопкой «Готово» или «Отправить» под ним (например, приложение электронной почты).

6

Я думаю, что это путь к вам. Имея android:inputType="textMultiLine", android:imeOptions="actionDone" делает двузначную функциональность ключа ввода. Просто имейте в виду, что вы можете использовать android:lines="10" и, возможно, удалить android:inputType="textMultiLine", но это зависит от того, чего вы хотите достичь, иногда вам нужно только android:inputType="textMultiLine", а три не заменяют его.

EditText ed=new EditText(this); 
ed.setOnKeyListener(new OnKeyListener() { 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      if(keyCode==66){ 
       //do your stuff here 
      } 
      return false; 
     } 
}); 
+0

Использование фиксированного количества максимальных номеров с ** android: lines = " 10 "** работал для меня, получая кнопку ok на клавиатуре. Хороший трюк, если известно, сколько строк будет, например, с небольшим набором maxLength. – sunadorer

+0

Я хочу отключить keyCode # 66, возможно ли это? Как я могу это сделать? –

+1

почему keyCode == 66 вместо keyCode == EditorInfo.IME_ACTION_GO? – tse

48

От андроида документации: "„textMultiLine“ Нормальный текст клавиатуры, что позволяет пользователям вводить длинные строки текста, которые включают в себя разрывы строк (возврат каретки). 'Поэтому атрибут textMultiLine не подходит, если вы хотите иметь кнопку «Готово» на клавиатуре.

Простой способ получить многострочную (в данном случае 3 линии) в поле ввода с проделанной кнопкой, чтобы использовать EditText с

android:lines="3" 
android:scrollHorizontally="false" 

Однако, по какой-то причине это работает только для меня, если я сделать эти параметры в коде вместо файла макета (в OnCreate) по

TextView tv = (TextView)findViewById(R.id.editText); 
if (tv != null) { 
    tv.setHorizontallyScrolling(false); 
    tv.setLines(3); 
} 

Я надеюсь, что это поможет кому-то, как это потребовалось некоторое время, чтобы выяснить. Если вы найдете способ заставить его работать из манифеста, сообщите нам об этом.

+4

Я бы также предложил попробовать 'maxLines()' вместо 'setLines()', если вы хотите избежать изменения высоты 'EditText' –

+0

Я думаю, что в вопросе не выяснено, что вы должны установить android: imeOptions с значение, например actionSend. Завершив этот ответ, мне пришлось установить андроид: singleLine = "true", даже если setMaxLines перезаписывает его по коду (это не даст вам ключ ввода, например, «Отправить»). Чтобы зафиксировать действие , проверьте первый ответ из http://stackoverflow.com/questions/5014219/multiline-edittext-with-done-softinput-action-label-on-2-3. – DNax

+0

Извините, лучшая альтернатива, которую я нашел о захвате , - это @earlcasper answer здесь http://stackoverflow.com/questions/1489852/android-handle-enter-in-an-edittext – DNax

2

если вы используете параметр ввода textImeMultiline с imeoptions flagnext и actionnext вы получите следующую кнопку вместо возвращения cariage

1

Я на 4.x и пытался дозвониться setHorizontallyScrolling() (с или без setLine() или setMaxLines()), а также множество различных конфигураций XML, чтобы отобразить кнопку «Готово». Ни один из них не работал. Суть в том, что если ваш EditText является многострочным, Android всегда будет хотеть показывать возврат каретки вместо кнопки «Готово», если вы не вложите в нее какой-то хак.

Решение наименьшего разрешения, которое я обнаружил, не включает переназначение поведения возврата каретки здесь: https://stackoverflow.com/a/12570003/3268329. Это решение аннулирует нежелательное желание Android принудительно установить флаг IME_FLAG_NO_ENTER_ACTION для многострочных представлений, что приведет к исчезновению кнопки «Готово».

1

Простой способ обойти эту ситуацию:

  • держать это атрибуты на EditText:

    android:inputType="textMultiLine" 
    android:scrollHorizontally="false" 
    
  • затем добавить этот код, чтобы только скрыть клавиатуру, когда ENTER нажата:

    editText.setOnEditorActionListener(new OnEditorActionListener() 
    { 
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
        if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) 
        { 
         editText.setSelection(0); 
         InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
         imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);  
         return true; 
        } 
        else 
        { 
         return false; 
        } 
        } 
    }); 
    
20

Рабочий пример! Создайте соответствующий пользовательский класс EditText, который поддерживает эту функцию, и используйте класс в XML-файле. Рабочий код:

package com.example; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.inputmethod.EditorInfo; 
import android.view.inputmethod.InputConnection; 
import android.widget.EditText; 

public class ActionEditText extends EditText 
{ 
    public ActionEditText(Context context) 
    { 
     super(context); 
    } 

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

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

    @Override 
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) 
    { 
     InputConnection conn = super.onCreateInputConnection(outAttrs); 
     outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION; 
     return conn; 
    } 
} 

<com.example.ActionEditText 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:imeOptions="actionDone" 
     android:inputType="textAutoCorrect|textCapSentences|textMultiLine" /> 
+0

Thanks - простой и хорошо работает +1 – Simon

+0

Это работало для меня, мое требование состояло в том, чтобы сделать текст редактирования, который должен быть многострочным, а также должен иметь следующую кнопку на программных клавишах ................так что спасибо много , что я сделал в редактировании текста я добавил 2 строки андроида: inputType = «textMultiLine» андроида: imeOptions = «actionNext» И в пользовательском классе выше я сделал: InputConnection сопп = супер. onCreateInputConnection (outAttrs); //outAttrs.imeOptions & = ~ EditorInfo.IME_FLAG_NO_ENTER_ACTION; outAttrs.imeOptions & = EditorInfo.IME_ACTION_NEXT; return conn; – yash

+0

Работы. Протестировано на Andorid 6.0.1. – AmiguelS

0

Я слишком долго боролся, но я наконец нашел решение!

Просто создайте пользовательский класс EditText как таковые:

public class EditTextImeMultiline extends EditText { 

    public void init() { 
     addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

      } 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 

      } 

      @Override 
      public void afterTextChanged(Editable s) { 
       for (int i = s.length(); i > 0; i--) 
        if (s.subSequence(i - 1, i).toString().equals("\n")) 
         s.replace(i - 1, i, ""); 
      } 
     }); 
     setSingleLine(); 
     setHorizontallyScrolling(false); 
     this.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 
       EditTextImeMultiline.this.setLines(EditTextImeMultiline.this.getLineCount()); 
      } 
     }); 
    } 

    public EditTextImeMultiline(Context context) { 
     super(context); 
     init(); 
    } 

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

    public EditTextImeMultiline(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(); 
    } 

    @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    public EditTextImeMultiline(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
     init(); 
    } 
} 

Этот класс удаляет переносы (\ п), оборачивает текст textMultiline будет делать, и позволяет заменить кнопку Enter на ImeAction;) ,

Вам просто нужно называть его в XML вместо классического класса EditText.

Чтобы объяснить логику здесь:

  • Установите EditText как SingleLine, чтобы иметь возможность показать кнопку ImeAction вместо Enter.
  • Снимите горизонтальную прокрутку, чтобы текст переместился на следующую строку при достижении конца обзора.
  • Просмотрите изменения компоновки с помощью onGlobalLayoutListener и установите его «линейный» параметр в «lineCount» текущего текста, хранящегося в editText. Это то, что освежает его высоту.
0

Рабочий раствор здесь, создать свой собственный EditTextView (только продлить TextView) и переопределить onInputConnection остроумие кусок кода вы будете найти в общепринятом ответ здесь: Multiline EditText with Done SoftInput Action Label on 2.3

-1

Простой способ работать вокруг этой ситуации:

изменения атрибутов на EditText:

android:inputType="textMultiLine" 
android:scrollHorizontally="false" 

к:

android:inputType="textImeMultiLine" 
android:scrollHorizontally="false" 
+0

Это не работает –

79

Использование

editText.setImeOptions(EditorInfo.IME_ACTION_DONE); 
editText.setRawInputType(InputType.TYPE_CLASS_TEXT); 

и XML:

android:inputType="textMultiLine" 
+1

Как-то работает ^^ –

+0

Работает на меня на android 6. – JoshuaTree

+1

Genius. Большое спасибо – Antonio

0

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

В коде Java:

////////////Code to Hide SoftKeyboard on Enter (DONE) Press/////////////// 
editText.setRawInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD|InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); 
editText.setImeActionLabel("DONE",EditorInfo.IME_ACTION_DONE);    //Set Return Carriage as "DONE" 
editText.setImeOptions(EditorInfo.IME_ACTION_DONE); 

editText.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) 
    { 
       if (event == null) { 
        if (actionId == EditorInfo.IME_ACTION_DONE) { 
         // Capture soft enters in a singleLine EditText that is the last EditText 
         // This one is useful for the new list case, when there are no existing ListItems 
         editText.clearFocus(); 
         InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE); 
         inputMethodManager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0); 
        } 

        else if (actionId == EditorInfo.IME_ACTION_NEXT) { 
         // Capture soft enters in other singleLine EditTexts 
        } else if (actionId == EditorInfo.IME_ACTION_GO) { 
        } else { 
         // Let the system handle all other null KeyEvents 
         return false; 
        } 
       } 
     else if (actionId == EditorInfo.IME_NULL) { 
        // Capture most soft enters in multi-line EditTexts and all hard enters; 
        // They supply a zero actionId and a valid keyEvent rather than 
        // a non-zero actionId and a null event like the previous cases. 
        if (event.getAction() == KeyEvent.ACTION_DOWN) { 
         // We capture the event when the key is first pressed. 
        } else { 
         // We consume the event when the key is released. 
         return true; 
        } 
       } 
     else { 
        // We let the system handle it when the listener is triggered by something that 
        // wasn't an enter. 
        return false; 
       } 
       return true; 
     } 
}); 
5

Это, кажется, отлично работает для меня

int lineNum = 2; 
mEditText.setHorizontallyScrolling(false); 
mEditText.setLines(3); 
Смежные вопросы