Android Custom EditText не показывает курсор в ICS - PullRequest
7 голосов
/ 02 апреля 2012

В моем приложении есть EditText, который должен принимать входные данные только от кнопок, которые я поместил на экран.

Чтобы избежать появления программной клавиатуры, я настроил класс EditText следующим образом:

public class CustomEditText extends EditText {

    public CustomEditText(Context context) {         
        super(context);
}

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

    @Override
    // Disables Keyboard;
    public boolean onCheckIsTextEditor() {
        return false;
    }   

}

Это успешно останавливает появление клавиатуры, однако в ICS этот подход также останавливает появление курсора.

setCursorVisible(true) не имеет никакого эффекта.

Я пробовал альтернативные способы скрытия программной клавиатуры, такие как android:editable="false" и .setKeyListener(null);, но ни одно из этих решений никогда не работало в моих тестах. Клавиатура всегда появляется.

Итак, есть ли способ вернуть курсор в ICS, сохранив переопределение onCheckIsTextEditor, как есть?

Ответы [ 2 ]

3 голосов
/ 05 июня 2012

почему бы вам не попробовать отключить программную клавиатуру, как это

PINLockactivity.java

    //text field for input sequrity pin
    txtPin=(EditText) findViewById(R.id.txtpin);
    txtPin.setInputType(
      InputType.TYPE_CLASS_NUMBER | InputType.TYPE_TEXT_VARIATION_PASSWORD);
    txtPin.setSelection(txtPin.getText().length());
    txtPin.setTextSize(22);
    txtPin.setSingleLine(true);


    //disable keypad
    txtPin.setOnTouchListener(new OnTouchListener(){
        @Override
        public boolean onTouch(View v, MotionEvent event) {

              int inType = txtPin.getInputType(); // backup the input type
              txtPin.setInputType(InputType.TYPE_NULL); // disable soft input
              txtPin.onTouchEvent(event); // call native handler
              txtPin.setInputType(inType); // restore input type
                return true; // consume touch even
        }
        });

и для этого поля EditText

xmlкод

<EditText android:layout_width="wrap_content" 
            android:id="@+id/txtpin"  
            android:maxLength="4" 
            android:layout_height="37dp" 
            android:gravity="center_horizontal" 
            android:longClickable="false" 
            android:padding="2dp"

            android:inputType="textPassword|number" 
            android:password="true" 
            android:background="@drawable/edittext_shadow" 
            android:layout_weight="0.98" 
            android:layout_marginLeft="15dp">
                <requestFocus></requestFocus>
   </EditText>

у меня это нормально работает для ввода защитного PIN-кода с курсором.

Я принимаю ввод с кнопки, а не с клавиатуры.

1 голос
/ 09 января 2013

Я наконец-то нашел (для меня) рабочее решение этой проблемы.

Первая часть (в onCreate):

// Set to TYPE_NULL on all Android API versions
mText.setInputType(InputType.TYPE_NULL);
// for later than GB only
if (android.os.Build.VERSION.SDK_INT >= 11) {
    // this fakes the TextView (which actually handles cursor drawing)
    // into drawing the cursor even though you've disabled soft input
    // with TYPE_NULL
    mText.setRawInputType(InputType.TYPE_CLASS_TEXT);
}

Кроме того, для android: textIsSelectable должно быть установлено значениеЗначение true (или установлено в onCreate) и EditText не должны фокусироваться на инициализации.Если ваш EditText является первым фокусируемым представлением (как это было в моем случае), вы можете обойти это, поместив его прямо над ним:

<LinearLayout
  android:layout_width="0px"
  android:layout_height="0px"
  android:focusable="true"
  android:focusableInTouchMode="true" >
    <requestFocus />
</LinearLayout>

Вы можете увидеть результаты этого в приложении Grapher,бесплатная и доступная в Google Play.

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

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