禁用edittext上的键盘

dba5bblo  于 2021-07-03  发布在  Java
关注(0)|答案(15)|浏览(346)

我在做计算器。所以我自己做了 Buttons 用数字和函数。必须计算的表达式位于 EditText ,因为我希望用户可以在表达式的中间添加数字或函数,所以 EditText 我有 cursor . 但我想禁用 Keyboard 当用户单击 EditText . 我发现这个例子可以 Android 2.3 ,但与 ICS 禁用 Keyboard 还有光标。

public class NoImeEditText extends EditText {

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

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

然后我用这个 NoImeEditText 在我的 XML 文件

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

我怎样才能使这个编辑文本与ics兼容???谢谢。

2wnc66cl

2wnc66cl1#

禁用键盘(api 11至当前版本)

这是迄今为止我发现的最好的禁用键盘的方法(我也见过很多)。

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

无需使用反射或设置 InputType 设置为空。

重新启用键盘

下面是如何在需要时重新启用键盘。

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);
}

关于为什么需要撤销复杂的pre-api 21版本,请参见本问答 setTextIsSelectable(true) :
使用settextisselectable禁用触摸屏后如何启用触摸屏

这个答案需要更彻底的检验。

我已经测试过了 setShowSoftInputOnFocus 在更高的api设备上,但是在@androiddeveloper发表了下面的评论之后,我发现这需要进行更彻底的测试。
下面是一些剪切粘贴代码来帮助测试这个答案。如果您可以确认它是否适用于api 11到20,请留下评论。我没有任何api 11-20设备,我的模拟器有问题。
活动\u 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>

主活动.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);
        }
    }
}
eqqqjvef

eqqqjvef2#

添加到alexkucherenko解决方案:调用后光标消失的问题 setInputType(0) 是由于ics(和jb)上的框架错误造成的。
错误记录如下:https://code.google.com/p/android/issues/detail?id=27609.
若要解决此问题,请致电 setRawInputType(InputType.TYPE_CLASS_TEXT) 就在那之后 setInputType 打电话。
要阻止键盘出现,只需重写 OnTouchListener 编辑文本并返回true(吞下触摸事件):

ed.setOnTouchListener(new OnTouchListener() {

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

                return true;
            }
        });

光标出现在gb设备上而不是ics+上的原因让我花了几个小时才把头发拔出来,所以我希望这能节省一些人的时间。

5t7ly7z5

5t7ly7z53#

尝试: android:editable="false" 或者 android:inputType="none"

sbdsn5lh

sbdsn5lh4#

这对我有用。先加上这个 android:windowSoftInputMode="stateHidden" 在你的android清单文件中,在你的活动下。如下所示:

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

然后在Activity的oncreate方法中,添加以下代码:

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;
    }
});

如果希望指针可见,请在xml中添加此项 android:textIsSelectable="true" .
这将使指针可见。这样,当您的活动开始时,键盘将不会弹出,当您单击编辑文本时,键盘也将隐藏。

qij5mzcb

qij5mzcb5#

editText.setShowSoftInputOnFocus(false);
7hiiyaii

7hiiyaii6#

把这一行放在manifest中的activity标记中android:windowsoftinputmode=“隐藏状态”

trnvg8h3

trnvg8h37#

我不知道´我不知道这个答案是否更好,但我找到了一个可能更快的解决办法。在xml上,只需在edittext上添加以下属性:

android:focusable="true"
android:focusableInTouchMode="false"

然后用onclicklistener做你需要的事情。

1cklez4t

1cklez4t8#

这里是一个网站,将给你什么你需要的
作为摘要,它提供了 InputMethodManager 以及 View 来自android开发者。它将引用 getWindowToken 内部 View 以及 hideSoftInputFromWindow() 为了 InputMethodManager 一个更好的答案是在链接,希望这有帮助。
下面是一个使用ontouch事件的示例:

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

这是同一个网站的另一个例子。这声称有效,但似乎是个坏主意,因为您的editbox为空,它将不再是编辑器:

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
  }
});

希望这能给你指明正确的方向

disbfnqx

disbfnqx9#

从stackoverflow的多个地方收集解决方案,我想下一个总结:
如果您不需要在活动的任何地方显示键盘,只需使用用于对话框的下一个标志(从这里获得):

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

如果您不希望它只用于特定的edittext,您可以使用这个(从这里获得):

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

或者这个(取自这里):

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

yhqotfr810#

// 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);
mzmfm0qo

mzmfm0qo11#

下面的代码同时适用于api>=11和api<11。光标仍然可用。

/**
 * 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);
    }
}
lvjbypge

lvjbypge12#

刚刚设定:

NoImeEditText.setInputType(0);

或在构造函数中:

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

sqserrrh13#

我找到了适合我的解决方案。当单击edittext时,它还会将光标放置在正确的位置。

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;
        }
    });
u7up0aaq

u7up0aaq14#

您也可以直接在api 21+上使用setshowsoftinputonfocus(布尔值),或通过api 14+上的反射使用setshowsoftinputonfocus:

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
    }
}
6ju8rftf

6ju8rftf15#

将以下属性添加到布局文件中的edittext控制器

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

我已经使用这个解决方案一段时间了,它对我很好。

相关问题