如何在edittext上禁用键盘弹出?

时间:2012-05-16 04:02:43

标签: android android-edittext

在我的应用程序中,我所有屏幕的第一个视图是EditText,因此每次进入屏幕时,屏幕键盘都会弹出。如何禁用此弹出窗口并在手动单击EditText ????

时启用它
    eT = (EditText) findViewById(R.id.searchAutoCompleteTextView_feed);

    eT.setOnFocusChangeListener(new OnFocusChangeListener() {

        public void onFocusChange(View v, boolean hasFocus) {

            if(hasFocus){
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
            imm.hideSoftInputFromWindow(eT.getWindowToken(), 0);
            }
        }
    });

xml代码:

<ImageView
    android:id="@+id/feedPageLogo"
    android:layout_width="45dp"
    android:layout_height="45dp"
    android:src="@drawable/wic_logo_small" />

<Button
    android:id="@+id/goButton_feed"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:text="@string/go" />

<EditText
    android:id="@+id/searchAutoCompleteTextView_feed"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_toLeftOf="@id/goButton_feed"
    android:layout_toRightOf="@id/feedPageLogo"
    android:hint="@string/search" />

<TextView
    android:id="@+id/feedLabel"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/feedPageLogo"
    android:gravity="center_vertical|center_horizontal"
    android:text="@string/feed"
    android:textColor="@color/white" />

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ButtonsLayout_feed"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true" >

    <Button
        android:id="@+id/feedButton_feed"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_margin="0dp"
        android:layout_weight="1"
        android:background="@color/white"
        android:text="@string/feed"
        android:textColor="@color/black" />

    <Button
        android:id="@+id/iWantButton_feed"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_margin="0dp"
        android:layout_weight="1"
        android:background="@color/white"
        android:text="@string/iwant"
        android:textColor="@color/black" />

    <Button
        android:id="@+id/shareButton_feed"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_margin="0dp"
        android:layout_weight="1"
        android:background="@color/white"
        android:text="@string/share"
        android:textColor="@color/black" />

    <Button
        android:id="@+id/profileButton_feed"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_margin="0dp"
        android:layout_weight="1"
        android:background="@color/white"
        android:text="@string/profile"
        android:textColor="@color/black" />
</LinearLayout>

<ListView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/feedListView"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_above="@id/ButtonsLayout_feed"
    android:layout_below="@id/feedLabel"
    android:textSize="15dp" >
</ListView>

第三个视图(EditText)是焦点所在。

29 个答案:

答案 0 :(得分:167)

最佳解决方案在Project Manifest文件(AndroidManifest.xml)中,在activity构造中添加以下属性

  

机器人:windowSoftInputMode = “stateHidden”


示例:

    <activity android:name=".MainActivity" 
              android:windowSoftInputMode="stateHidden" />

说明:

  • 当活动成为用户关注的焦点时,软键盘的状态 - 无论是隐藏还是可见。
  • 对活动主窗口进行的调整 - 是否调整较小以便为软键盘腾出空间,或者当软键盘覆盖部分窗口时,其内容是否平移以使当前焦点可见。

介绍于:

  • API Level 3。

Link to the Docs

注意: 此处设置的值(“stateUnspecified”和“adjustUnspecified”除外)会覆盖主题中设置的值。

答案 1 :(得分:81)

您必须在EditText上方创建一个视图,该视图采用“虚假”焦点:

类似的东西:

<!-- Stop auto focussing the EditText -->
<LinearLayout
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:background="@android:color/transparent"
    android:focusable="true"
    android:focusableInTouchMode="true">
</LinearLayout>

<EditText
    android:id="@+id/searchAutoCompleteTextView_feed"
    android:layout_width="200dp"
    android:layout_height="wrap_content"
    android:inputType="text" />

在这种情况下,我使用LinearLayout来请求焦点。希望这会有所帮助。

这非常有效......感谢Zaggo0

答案 2 :(得分:35)

     edittext.setShowSoftInputOnFocus(false);

现在您可以使用自己喜欢的任何自定义键盘。

答案 3 :(得分:20)

在您的活动类上添加以下代码。

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

当用户点击EditText

时,会弹出键盘

答案 4 :(得分:19)

人们在这里提出了许多很好的解决方案,但我在EditText中使用了这个简单的技术(java中没有任何东西,并且需要AnroidManifest.xml)。只需在EditText上直接将focusable和focusableInTouchMode设置为false。

 <EditText
        android:id="@+id/text_pin"
        android:layout_width="136dp"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:textAlignment="center"
        android:inputType="numberPassword"
        android:password="true"
        android:textSize="24dp"
        android:focusable="false"
        android:focusableInTouchMode="false"/>

我的目的是在App锁定活动中使用此编辑框,我要求用户输入PIN码,并且我想显示我的自定义密码键盘。在Android Studio 2.1上使用minSdk = 8和maxSdk = 23进行测试

enter image description here

答案 5 :(得分:9)

您可以使用以下代码禁用OnScreen键盘。

InputMethodManager im = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
im.hideSoftInputFromWindow(editText.getWindowToken(), 0);

答案 6 :(得分:7)

两个简单的解决方案:

第一个解决方案 将添加到清单xml文件中的代码行下方。 在Manifest文件(AndroidManifest.xml)中,在活动构造中添加以下属性

机器人:windowSoftInputMode = “stateHidden”

示例:

<activity android:name=".MainActivity" 
          android:windowSoftInputMode="stateHidden" />

第二个解决方案在活动

中添加以下代码行
//Block auto opening keyboard  
  this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

我们可以使用上述任何一种解决方案。感谢

答案 7 :(得分:5)

为InputMethodManager声明全局变量:

 private InputMethodManager im ;

在onCreate()下定义它:

 im = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
 im.hideSoftInputFromWindow(youredittext.getWindowToken(), 0);

将onClickListener设置为oncreate()中的编辑文本:

 youredittext.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        im.showSoftInput(youredittext, InputMethodManager.SHOW_IMPLICIT);
    }
});

这样可行。

答案 8 :(得分:4)

使用以下代码,将其写在onCreate()

InputMethodManager inputManager = (InputMethodManager)
                                   getSystemService(Context.INPUT_METHOD_SERVICE); 
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
                                   InputMethodManager.HIDE_NOT_ALWAYS);         
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

答案 9 :(得分:4)

试试.......我用代码解决了这个问题: -

EditText inputArea;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
inputArea = (EditText) findViewById(R.id.inputArea);

//This line is you answer.Its unable your click ability in this Edit Text
//just write
inputArea.setInputType(0);
}

除了你可以设置任何字符串之外,你可以默认输入任何东西。

试试吧

答案 10 :(得分:2)

试试这个:

EditText yourEditText= (EditText) findViewById(R.id.yourEditText); 
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT); 

要关闭,您可以使用:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
 imm.hideSoftInputFromWindow(yourEditText.getWindowToken(), 0); 

在您的代码中尝试这样:

ed = (EditText)findViewById(R.id.editText1);

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);  
imm.hideSoftInputFromWindow(ed.getWindowToken(), 0);  

ed.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);  
        imm.showSoftInput(ed, InputMethodManager.SHOW_IMPLICIT);  
    }
});

答案 11 :(得分:2)

好吧,我遇到了同样的问题,我刚刚在XML文件中解决了这个问题。

<EditText
            android:cursorVisible="false"
            android:id="@+id/edit"
            android:focusable="false"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

您可能也在寻找安全性。这也有助于此。

答案 12 :(得分:2)

感谢@ A.B提供了良好的解决方案

    android:focusableInTouchMode="false"

这种情况如果您要在编辑文本中禁用键盘,只需在edittext标语中添加 android:focusableInTouchMode =“false”

在Android Studio 3.0.1 minsdk 16,maxsdk26

中为我工作

答案 13 :(得分:1)

如果您使用的是Xamarin 你可以添加这个

Activity[(WindowSoftInputMode = SoftInput.StateAlwaysHidden)]

此后你可以在OnCreate()方法

中添加这一行
youredittext.ShowSoftInputOnFocus = false;

如果目标设备不支持上述代码,您可以在EditText点击事件中使用以下代码

InputMethodManager Imm = (InputMethodManager)this.GetSystemService(Context.InputMethodService);
Imm.HideSoftInputFromWindow(youredittext.WindowToken, HideSoftInputFlags.None);

答案 14 :(得分:1)

我发现以下模式在我想要显示对话框以获取输入的代码中很适合我(例如,文本字段中显示的字符串是从对话框中的复选框列表中进行选择的结果,而不是通过键盘输入的文字)。

  1. 禁用编辑字段上的软输入焦点。我无法禁用整个活动,因为有编辑字段我希望键盘在同一布局中使用。
  2. 文本字段中的初始点击产生焦点更改,重复点击会产生点击事件。所以我重写两者(这里我不重构代码以说明两个处理程序都做同样的事情):

    tx = (TextView) m_activity.findViewById(R.id.allergymeds);
    if (tx != null) {
        tx.setShowSoftInputOnFocus(false);
        tx.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View view, boolean hasFocus) {
                if (hasFocus) {
                    MedicationsListDialogFragment mld = new MedicationsListDialogFragment();
                    mld.setPatientId(m_sess.getActivePatientId());
                    mld.show(getFragmentManager(), "Allergy Medications Dialog");
                }
            }
        });
        tx.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                MedicationsListDialogFragment mld = new MedicationsListDialogFragment();
                mld.setPatientId(m_sess.getActivePatientId());
                mld.show(getFragmentManager(), "Allergy Medications Dialog");
            }
        });
    }
    

答案 15 :(得分:1)

您唯一需要做的就是将android:focusableInTouchMode="false"添加到xml中的EditText中,这就是全部。(如果有人仍然需要知道如何以简单的方式做到这一点)

答案 16 :(得分:1)

对于Xamarin用户:

[Activity(MainLauncher = true, 
        ScreenOrientation = ScreenOrientation.Portrait, 
        WindowSoftInputMode = SoftInput.StateHidden)] //SoftInput.StateHidden - disables keyboard autopop

答案 17 :(得分:1)

onCreate()方法中使用以下代码 -

    editText = (EditText) findViewById(R.id.editText);
    editText.requestFocus();
    editText.postDelayed(new Runnable() {
        public void run() {
            InputMethodManager keyboard = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            keyboard.hideSoftInputFromWindow(
                    editText.getWindowToken(), 0);
        }
    }, 200);

答案 18 :(得分:0)

使用此选项启用和禁用EditText ....

InputMethodManager imm;

imm = (InputMethodManager)
getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);

if (isETEnable == true) {

    imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
    ivWalllet.setImageResource(R.drawable.checkbox_yes);
    etWalletAmount.setEnabled(true);
    etWalletAmount.requestFocus();
    isETEnable = false;
    } 
else {

    imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY,0);
    ivWalllet.setImageResource(R.drawable.checkbox_unchecked);
    etWalletAmount.setEnabled(false);
    isETEnable = true;
    }

答案 19 :(得分:0)

试试这个答案,

editText.setRawInputType(InputType.TYPE_CLASS_TEXT);
editText.setTextIsSelectable(true);

注意:仅适用于API 11 +

答案 20 :(得分:0)

private InputMethodManager imm;

...


editText.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        v.onTouchEvent(event);
        hideDefaultKeyboard(v);
        return true;
    }
});

private void hideDefaultKeyboard(View et) {
  getMethodManager().hideSoftInputFromWindow(et.getWindowToken(), 0);
}

private InputMethodManager getMethodManager() {
        if (this.imm == null) {
            this.imm = (InputMethodManager)  getContext().getSystemService(android.content.Context.INPUT_METHOD_SERVICE);
        }
  return this.imm;
}

答案 21 :(得分:0)

如果有人仍在寻找最简单的解决方案,请在父布局上将以下属性设置为true

android:focusableInTouchMode="true"

示例:

<android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:focusableInTouchMode="true">

.......
......
</android.support.constraint.ConstraintLayout>

答案 22 :(得分:0)

       <TextView android:layout_width="match_parent"
                 android:layout_height="wrap_content"

                 android:focusable="true"
                 android:focusableInTouchMode="true">

                <requestFocus/>
      </TextView>

      <EditText android:layout_width="match_parent"
                android:layout_height="wrap_content"/>

答案 23 :(得分:0)

在我正在构建的Android应用中,我在水平排列的EditText中有三个LinearLayout个。当片段加载时,我不得不阻止软键盘出现。除了在focusable上将focusableInTouchModeLinearLayout设置为true之外,我还必须将descendantFocusability设置为blocksDescendants。在onCreate,我在requestFocus上拨打了LinearLayout。这样就可以防止键盘在创建片段时出现。

布局 -

    <LinearLayout
       android:id="@+id/text_selector_container"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:weightSum="3"
       android:orientation="horizontal"
       android:focusable="true"
       android:focusableInTouchMode="true"
       android:descendantFocusability="blocksDescendants"
       android:background="@color/black">

       <!-- EditText widgets -->

    </LinearLayout>

onCreate - mTextSelectorContainer.requestFocus();

答案 24 :(得分:0)

简单,只需从xml文件中删除“”标签

答案 25 :(得分:0)

可以通过使用以下方式对问题进行排序: 无需将editText inputType设置为任何值, 只需添加以下行, editText.setTextIsSelectable(true);

答案 26 :(得分:0)

如果您想在任何事件中在屏幕上隐藏键盘,请尝试使用以下代码行。它对我有用。

context.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN );

final InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);

if (inputMethodManager.isAcceptingText())       inputMethodManager.hideSoftInputFromWindow(context.getCurrentFocus().getWindowToken(), 0);

答案 27 :(得分:-1)

对于您活动中的任何textview(或使用android创建假空文本视图:layout_width =“0dp” 机器人:layout_height = “0dp” )并为下一个文本视图添加: 机器人:textIsSelectable = “真”

答案 28 :(得分:-1)

只需在布局xml中添加属性android:focusable="false",尤其是EditText。然后,您可以编写EditText的点击列表,而无需弹出键盘。