it-swarm.com.de

Deaktivieren Sie die Tastatur für EditText

Ich mache einen Rechner . Also habe ich meine eigene Buttons mit Zahlen und Funktionen erstellt .___ Der Ausdruck, der berechnet werden muss, ist in einer EditText, weil ich Benutzer möchte addiere Zahlen oder Funktionen auch in der Mitte des Ausdrucks, also habe ich mit EditText die cursor. Ich möchte jedoch die Keyboard deaktivieren, wenn Benutzer auf die EditText..__ klicken. Ich fand dieses Beispiel, dass es für Android 2.3 in Ordnung ist, aber mit ICS deaktivieren Sie Keyboard und auch der Cursor.

public class NoImeEditText extends EditText {

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

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

Und dann verwende ich diese NoImeEditText in meiner XML-Datei

<com.my.package.NoImeEditText
      Android:id="@+id/etMy"
 ....  
/>

Wie kann ich diesen EditText mit ICS kompatibel machen ??? Danke.

51
Ferox

Hier ist eine Website, die Ihnen das gibt, was Sie brauchen

Zusammenfassend enthält es Links zu InputMethodManager und View von Android-Entwicklern. Es wird auf getWindowToken innerhalb von View und hideSoftInputFromWindow() für InputMethodManager verweisen.

Eine bessere Antwort gibt der Link, hoffe das hilft.

hier ein Beispiel für das onTouch-Ereignis:

editText_input_field.setOnTouchListener(otl);

private OnTouchListener otl = new OnTouchListener() {
  public boolean onTouch (View v, MotionEvent event) {
        return true; // the listener has consumed the event
  }
};

Hier ist ein weiteres Beispiel von derselben Website. Dies behauptet zu arbeiten, scheint aber eine schlechte Idee zu sein, da Ihre EditBox NULL ist, es wird kein Editor mehr sein:

MyEditor.setOnTouchListener(new OnTouchListener(){

  @Override
  public boolean onTouch(View v, MotionEvent event) {
    int inType = MyEditor.getInputType(); // backup the input type
    MyEditor.setInputType(InputType.TYPE_NULL); // disable soft input
    MyEditor.onTouchEvent(event); // call native handler
    MyEditor.setInputType(inType); // restore input type
    return true; // consume touch even
  }
});

Hoffe, das weist dich in die richtige Richtung 

39
Hip Hip Array

Der folgende Code steht für API> = 11 und API <11. Der Cursor ist noch verfügbar.

/**
 * Disable soft keyboard from appearing, use in conjunction with Android:windowSoftInputMode="stateAlwaysHidden|adjustNothing"
 * @param editText
 */
public static void disableSoftInputFromAppearing(EditText editText) {
    if (Build.VERSION.SDK_INT >= 11) {
        editText.setRawInputType(InputType.TYPE_CLASS_TEXT);
        editText.setTextIsSelectable(true);
    } else {
        editText.setRawInputType(InputType.TYPE_NULL);
        editText.setFocusable(true);
    }
}
59

probiere: Android:editable="false" oder Android:inputType="none"

20
K_Anas

Sie können auch setShowSoftInputOnFocus (boolean) direkt auf API 21+ oder durch Nachdenken über API 14+ verwenden:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
    editText.setShowSoftInputOnFocus(false);
} else {
    try {
        final Method method = EditText.class.getMethod(
                "setShowSoftInputOnFocus"
                , new Class[]{boolean.class});
        method.setAccessible(true);
        method.invoke(editText, false);
    } catch (Exception e) {
        // ignore
    }
}
12
kuelye

Deaktivieren Sie die Tastatur (API 11 auf aktuell)

Dies ist die beste Antwort, die ich bisher gefunden habe, um die Tastatur zu deaktivieren (und ich habe viele davon gesehen). 

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) { // API 21
    editText.setShowSoftInputOnFocus(false);
} else { // API 11-20
    editText.setTextIsSelectable(true);
}

Es ist nicht erforderlich, die Reflektion zu verwenden oder die Variable InputType auf null zu setzen.

Aktivieren Sie die Tastatur erneut

So können Sie die Tastatur bei Bedarf wieder aktivieren.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) { // API 21
    editText.setShowSoftInputOnFocus(true);
} else { // API 11-20
    editText.setTextIsSelectable(false);
    editText.setFocusable(true);
    editText.setFocusableInTouchMode(true);
    editText.setClickable(true);
    editText.setLongClickable(true);
    editText.setMovementMethod(ArrowKeyMovementMethod.getInstance());
    editText.setText(editText.getText(), TextView.BufferType.SPANNABLE);
}

In diesem Q & A wird erläutert, warum die komplizierte Version von API 21 erforderlich ist, um setTextIsSelectable(true) rückgängig zu machen:

Diese Antwort muss gründlicher getestet werden.

Ich habe setShowSoftInputOnFocus auf höheren API-Geräten getestet, aber nach dem Kommentar von @ androiddeveloper sehe ich, dass dies gründlicher getestet werden muss.

Hier ist ein Code zum Ausschneiden und Einfügen, mit dem diese Antwort getestet werden kann. Wenn Sie bestätigen können, dass es für API 11 bis 20 funktioniert oder nicht funktioniert, hinterlassen Sie bitte einen Kommentar. Ich habe keine API 11-20-Geräte und mein Emulator hat Probleme.

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/activity_main"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:paddingBottom="@dimen/activity_vertical_margin"
    Android:paddingLeft="@dimen/activity_horizontal_margin"
    Android:paddingRight="@dimen/activity_horizontal_margin"
    Android:paddingTop="@dimen/activity_vertical_margin"
    Android:orientation="vertical"
    Android:background="@Android:color/white">

    <EditText
        Android:id="@+id/editText"
        Android:textColor="@Android:color/black"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"/>

    <Button
        Android:text="enable keyboard"
        Android:onClick="enableButtonClick"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"/>

    <Button
        Android:text="disable keyboard"
        Android:onClick="disableButtonClick"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"/>
</LinearLayout>

MainActivity.Java

public class MainActivity extends AppCompatActivity {

    EditText editText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText = (EditText) findViewById(R.id.editText);
    }

    // when keyboard is hidden it should appear when editText is clicked
    public void enableButtonClick(View view) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) { // API 21
            editText.setShowSoftInputOnFocus(true);
        } else { // API 11-20
            editText.setTextIsSelectable(false);
            editText.setFocusable(true);
            editText.setFocusableInTouchMode(true);
            editText.setClickable(true);
            editText.setLongClickable(true);
            editText.setMovementMethod(ArrowKeyMovementMethod.getInstance());
            editText.setText(editText.getText(), TextView.BufferType.SPANNABLE);
        }
    }

    // when keyboard is hidden it shouldn't respond when editText is clicked
    public void disableButtonClick(View view) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) { // API 21
            editText.setShowSoftInputOnFocus(false);
        } else { // API 11-20
            editText.setTextIsSelectable(true);
        }
    }
}
10
Suragch

Fügen Sie dem Edittext-Controller in der Layoutdatei unten Eigenschaften hinzu

<Edittext
   Android:focusableInTouchMode="true"
   Android:cursorVisible="false"
   Android:focusable="false"  />

Ich habe diese Lösung schon länger verwendet und es funktioniert gut für mich.

6
Nishara MJ

Auf StackOverflow sammle ich Lösungen von mehreren Stellen. Ich denke, der nächste bringt es auf den Punkt:

Wenn die Tastatur nicht an einer beliebigen Stelle in Ihrer Aktivität angezeigt werden soll, können Sie einfach die nächsten Flags verwenden, die für Dialoge verwendet werden (erhalten von hier ):

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

Wenn Sie es nicht nur für einen bestimmten EditText wünschen, können Sie diesen verwenden (erhalten von hier ):

public static boolean disableKeyboardForEditText(@NonNull EditText editText) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
        editText.setShowSoftInputOnFocus(false);
        return true;
    }
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)
        try {
            final Method method = EditText.class.getMethod("setShowSoftInputOnFocus", new Class[]{boolean.class});
            method.setAccessible(true);
            method.invoke(editText, false);
            return true;
        } catch (Exception ignored) {
        }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2)
        try {
            Method method = TextView.class.getMethod("setSoftInputShownOnFocus", boolean.class);
            method.setAccessible(true);
            method.invoke(editText, false);
            return true;
        } catch (Exception ignored) {
        }
    return false;
}

Oder das (aus hier ):

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop)
           editText.setShowSoftInputOnFocus(false);
       else
           editText.setTextIsSelectable(true); 
6

Ich habe diese Lösung gefunden, die für mich funktioniert. Es positioniert auch den Cursor, wenn Sie an der richtigen Stelle auf EditText klicken.

EditText editText = (EditText)findViewById(R.id.edit_mine);
// set OnTouchListener to consume the touch event
editText.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            v.onTouchEvent(event);   // handle the event first
            InputMethodManager imm = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
            if (imm != null) {
                imm.hideSoftInputFromWindow(v.getWindowToken(), 0);  // hide the soft keyboard 
            }                
            return true;
        }
    });
5
Vijay
// only if you completely want to disable keyboard for 
// that particular edit text
your_edit_text = (EditText) findViewById(R.id.editText_1);
your_edit_text.setInputType(InputType.TYPE_NULL);
5
Abel Terefe

Einfach eingestellt:

 NoImeEditText.setInputType(0);

oder im Konstruktor:

   public NoImeEditText(Context context, AttributeSet attrs) { 
          super(context, attrs);   
          setInputType(0);
       } 
4
Alex Kucherenko

Zu Alex Kucherenko Lösung hinzufügen: Das Problem, dass der Cursor nach dem Aufruf von setInputType(0) verschwindet, ist auf einen Rahmenfehler in ICS (und JB) zurückzuführen. 

Der Fehler ist hier dokumentiert: https://code.google.com/p/Android/issues/detail?id=27609

Um dies zu umgehen, rufen Sie setRawInputType(InputType.TYPE_CLASS_TEXT) direkt nach dem Aufruf von setInputType auf. 

Um zu verhindern, dass die Tastatur angezeigt wird, überschreiben Sie einfach OnTouchListener des EditText und geben Sie true zurück (Schlucken des Berührungsereignisses):

ed.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                return true;
            }
        });

Die Gründe für die Anzeige des Cursors auf GB-Geräten und nicht auf ICS + hatten mich dazu veranlasst, mir einige Stunden lang die Haare zu reissen. Ich hoffe, das spart jemandem Zeit.

3
Jay Sidri
editText.setShowSoftInputOnFocus(false);
1
Kanagalingam

Setzen Sie diese Zeile einfach in das Aktivitäts-Tag im Manifest Android: windowSoftInputMode = "stateHidden"

1
mahmoud alaa

Dies funktionierte für mich . Fügen Sie diesen Android:windowSoftInputMode="stateHidden" zunächst in Ihre Android-Manifestdatei unter Ihrer Aktivität ein. Wie unten: 

<activity ... Android:windowSoftInputMode="stateHidden">

Fügen Sie dann bei onCreate-Methode Ihrer Aktivität den folgenden Code hinzu:

EditText editText = (EditText)findViewById(R.id.edit_text);
edit_text.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        v.onTouchEvent(event);
        InputMethodManager inputMethod = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        if (inputMethod!= null) {
            inputMethod.hideSoftInputFromWindow(v.getWindowToken(), 0);
        }                
        return true;
    }
});

Wenn der Zeiger sichtbar sein soll, fügen Sie dies in Ihrem xml Android:textIsSelectable="true" hinzu.

Dadurch wird der Zeiger sichtbar. Auf diese Weise wird die Tastatur beim Start Ihrer Aktivität nicht eingeblendet und auch ausgeblendet, wenn Sie auf den Edittext klicken. 

1
Jerin A Mathews