Android 4.0 EditText без мягкой клавиатуры и с позиционированием курсора

Я пытаюсь определить окно EditText без автоматического отображения экранной клавиатуры при касании окна. Мне также нужно, чтобы мигающий курсор отображался и перемещался по касанию. Это просто сделать до Android 4.0, просто используя mText.setInputType (InputType.TYPE_NULL). Это единственный способ подавить автоматический дисплей мягкой клавиатуры, но в Android 4.0 он также подавляет мигающий курсор. Курсор, однако, правильно позиционируется, и mText.getSelectionStart () возвращает последнее местоположение касания. Например, если я касаюсь между «2» и «3» в окне EditText, содержащем «123», mText.getSelectionStart () корректно возвращает 2, даже если курсор не отображается. Есть ли способ программно отобразить курсор в этом месте?

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

public class TestCodeActivity extends Activity implements OnClickListener { private EditText mText; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getApplicationContext(); setContentView(R.layout.test); findViewById(R.id.Button01).setOnClickListener(this); findViewById(R.id.Button02).setOnClickListener(this); findViewById(R.id.Button03).setOnClickListener(this); findViewById(R.id.Button04).setOnClickListener(this); mText = (EditText) findViewById(R.id.editText1); mText.setInputType(InputType.TYPE_NULL); } @Override public void onClick(View v) { if (v.getTag().equals("Clear")) { mText.setText(""); } else { String buttontag = v.getTag().toString(); String str = mText.getText().toString(); int cursor = mText.getSelectionStart(); if(cursor==str.length()) str = str + buttontag; else str = str.substring(0, cursor) + buttontag + str.substring(cursor, str.length()); mText.setText(str); mText.setSelection(cursor+1); // ---> need code to display blinking cursor at cursor+1 location ??? } } } 

Вот макет xml:

  <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="85dp" > <EditText android:id="@+id/editText1" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="0.13" android:ems="10" android:textSize="25sp" > <requestFocus /> </EditText> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <Button android:id="@+id/Button01" android:layout_width="60dp" android:layout_height="60dp" android:text="1" android:tag="1" android:layout_gravity="center" android:textSize="30sp" /> <Button android:id="@+id/Button02" android:layout_width="60dp" android:layout_height="60dp" android:text="2" android:tag="2" android:layout_gravity="center" android:textSize="30sp" /> <Button android:id="@+id/Button03" android:layout_width="60dp" android:layout_height="60dp" android:text="3" android:tag="3" android:layout_gravity="center" android:textSize="30sp" /> <Button android:id="@+id/Button04" android:layout_width="60dp" android:layout_height="60dp" android:text="Clear" android:tag="Clear" android:layout_gravity="center" android:textSize="30sp" /> </LinearLayout> </LinearLayout> 

Я наконец понял, как подавить мягкую клавиатуру и по-прежнему получать мигающий курсор для отображения в окне EditText. Я закодировал onTouchListener и вернул true, чтобы отключить клавиатуру вместо использования «mText.setInputType (InputType.TYPE_NULL)». Затем мне нужно было установить положение касания, чтобы установить курсор в нужное место.

Вот код, который я использовал:

  mText = (EditText) findViewById(R.id.editText1); OnTouchListener otl = new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: Layout layout = ((EditText) v).getLayout(); float x = event.getX() + mText.getScrollX(); int offset = layout.getOffsetForHorizontal(0, x); if(offset>0) if(x>layout.getLineMax(0)) mText.setSelection(offset); // touch was at end of text else mText.setSelection(offset - 1); break; } return true; } }; mText.setOnTouchListener(otl);