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.
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
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);
}
}
probiere: Android:editable="false"
oder Android:inputType="none"
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
}
}
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.
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:
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);
}
}
}
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.
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);
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;
}
});
// 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);
Einfach eingestellt:
NoImeEditText.setInputType(0);
oder im Konstruktor:
public NoImeEditText(Context context, AttributeSet attrs) {
super(context, attrs);
setInputType(0);
}
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.
editText.setShowSoftInputOnFocus(false);
Setzen Sie diese Zeile einfach in das Aktivitäts-Tag im Manifest Android: windowSoftInputMode = "stateHidden"
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.