Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android 4.0 EditText without soft keyboard and with cursor positioning

I am attempting to define an EditText box without having the soft keyboard display automatically when the box is touched. I also need to have the blinking cursor displayed and moved based on touch. This is simple to do prior to Android 4.0 by just using mText.setInputType(InputType.TYPE_NULL). This is the only way to suppress automatic soft keyboard display but in Android 4.0 it also suppresses the blinking cursor. The cursor does, however, position properly and mText.getSelectionStart() does return the last touch location. For example, if I touch between the "2" and "3" in an EditText box containing "123", mText.getSelectionStart() correctly returns a 2 even though no cursor is displayed. Is there a way to programmatically display a cursor at that location?

Here is the code I am using to test EditText cursor locations:

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 ???
        }
        }
    }

Here is the layout 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>
like image 338
Wayne Kail Avatar asked Dec 10 '12 23:12

Wayne Kail


1 Answers

I finally figured out how to suppress the soft keyboard and still get a blinking cursor to display in an EditText box. I coded an onTouchListener and returned true to disable the keyboard instead of using "mText.setInputType(InputType.TYPE_NULL)". I then had to get the touch position to set the cursor to the correct spot.

Here is the code I used:

  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);
like image 188
Wayne Kail Avatar answered Nov 13 '22 22:11

Wayne Kail