2012-12-10 10 views
6

Ich versuche ein EditText-Feld zu definieren, ohne dass die Soft-Tastatur automatisch angezeigt wird, wenn die Box berührt wird. Ich muss auch den blinkenden Cursor anzeigen lassen und basierend auf Berührung verschieben. Dies ist vor Android 4.0 einfach zu tun, indem Sie nur mText.setInputType (InputType.TYPE_NULL) verwenden. Dies ist die einzige Möglichkeit, die automatische Soft-Tastatur-Anzeige zu unterdrücken, aber in Android 4.0 unterdrückt sie auch den blinkenden Cursor. Der Cursor positioniert sich jedoch richtig und mText.getSelectionStart() gibt den letzten Touch-Speicherort zurück. Wenn ich zum Beispiel in einem EditText-Feld, das "123" enthält, zwischen "2" und "3" berühre, gibt mText.getSelectionStart() korrekt eine 2 zurück, obwohl kein Cursor angezeigt wird. Gibt es eine Möglichkeit, einen Cursor an dieser Stelle programmgesteuert anzuzeigen? HierAndroid 4.0 EditText ohne Softkeyboard und mit Cursor-Positionierung

ist der Code, den ich EditText Cursor-Positionen zu testen, bin mit:

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

Hier ist das 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> 

Antwort

13

ich endlich herausgefunden, wie die Soft-Tastatur zu unterdrücken und noch erhalten ein blinkender Cursor, der in einem EditText-Feld angezeigt wird. Ich habe einen onTouchListener codiert und true zurückgegeben, um die Tastatur zu deaktivieren, anstatt "mText.setInputType (InputType.TYPE_NULL)" zu verwenden. Ich musste dann die Berührungsposition erreichen, um den Cursor an die richtige Stelle zu setzen. Hier

ist der Code, den ich verwendet:

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); 
+0

Sie meinen Tag mit dieser Lösung gespart! +1 –

+0

Diese Lösung funktioniert nicht für mehrzeiligen Text bearbeiten. Können Sie bitte für mehrzeilige Text bearbeiten? – user1213202

+0

@ user1213202: Bitte konzentrieren Sie sich auf 'int offset = layout.getOffsetForHorizontal (0, x);', der erste Parameter der Methode Layout.getOffsetForHorizontal (int line, float horiz) ist der Zeilenindex in Ihrem Editiertext für mehrzeiligen Editiertext , müssen Sie den Zeilenindex bestimmen, auf den Sie den Cursor bewegen wollen, und ihn dann in 'getOffsetForHorizontal' übergeben. – nautilusvn

Verwandte Themen