禁用键盘上的EditText禁用键盘上的EditText(Disable keyboard on E

2019-05-14 07:35发布

我在做一个计算器。 所以我做了我自己的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"
 ....  
/>

我怎样才能让这个兼容使用的EditText ICS ??? 谢谢。

Answer 1:

这里是一个网站,会给你你需要什么

作为一个总结,它提供了指向InputMethodManagerView来自Android开发者。 这将参照getWindowToken的内ViewhideSoftInputFromWindow()用于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
  }
};

下面是来自同一网站的另一个例子。 这要求工作,但似乎是一个糟糕的主意,因为你的编辑框为空,将不再编辑:

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

希望这点你在正确的方向



Answer 2:

下面的代码既是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);
    }
}


Answer 3:

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



Answer 4:

您还可以使用setShowSoftInputOnFocus(布尔)直接API 21+或者通过API 14+反思:

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


Answer 5:

禁用键盘(API 11对电流)

这是最好的答案,我发现迄今禁用键盘(我已经看到了很多他们的)。

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

有没有必要使用反射或设置InputType为null。

重新启用键盘

下面是如果需要的话你如何重新启用键盘。

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

看到这个Q&A为什么需要复杂的前21 API版本撤消setTextIsSelectable(true)

  • 如何使用setTextIsSelectable禁用后启用键盘上的触摸

这个答案需要更彻底的测试。

我已经测试setShowSoftInputOnFocus较高API的设备,但低于@ androiddeveloper的评论后,我看到,这需要更彻底的测试。

下面是一些剪切和粘贴代码,以帮助测试这个答案。 如果你能确认它或API 11不起作用20,请发表评论。 我没有任何API 11-20设备和我的模拟器有问题。

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


Answer 6:

下面添加属性的EDITTEXT控制器布局文件

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

我一直在使用这种解决方案,同时,它为我工作得很好。



Answer 7:

我发现这个解决方案,它为我工作。 在正确的位置上的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;
        }
    });


Answer 8:

在计算器上这里收集来自多个地方的解决方案,我想下一个总结道:

如果您不需要键盘在任何地方显示您的活动,您可以简单地使用它们用于对话框(从拿到下一个标志这里 ):

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


Answer 9:

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


Answer 10:

只需设置:

 NoImeEditText.setInputType(0);

或在构造函数:

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


Answer 11:

要添加到亚历克斯Kucherenko解决方案:用光标得到调用后消失的问题setInputType(0)是因为在ICS(和JB)的框架错误。

该缺陷被记录在这里: https://code.google.com/p/android/issues/detail?id=27609 。

要解决此,请拨打setRawInputType(InputType.TYPE_CLASS_TEXT)后右setInputType电话。

要停止显示键盘,只需要重写OnTouchListener的EditText上,并返回true(吞咽触摸事件):

ed.setOnTouchListener(new OnTouchListener() {

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

                return true;
            }
        });

对于出现在GB设备上的光标,而不是ICS的理由+让我撕我的头发出去几个小时,所以我希望这样可以节省别人的时间。



Answer 12:

这为我工作。 首先添加此android:windowSoftInputMode="stateHidden"在你的Android清单文件,您的活动下。 如下图所示:

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

然后在youractivity的onCreate方法,添加foloowing代码:

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"

这将使指针可见。 这样,当你的活动开始,当你点击的EditText也将被隐藏键盘不会弹出。



Answer 13:

只要把此行清单中的android活动标签中:windowSoftInputMode =“stateHidden”



文章来源: Disable keyboard on EditText