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


84

在我的应用程序中,所有屏幕的第一个视图都是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)是焦点所在。


您能张贴您的xml代码吗?
user1213202

Answers:


177

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

android:windowSoftInputMode =“ stateHidden”


例:

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

描述:

  • 当活动成为用户关注的焦点时,软键盘的状态(无论是隐藏的还是可见的)。
  • 对活动的主窗口所做的调整-是将其调整为较小的尺寸以为软键盘腾出空间,还是在其一部分窗口被软键盘覆盖时是否平移其内容以使当前焦点可见。

引入于:

  • API等级3。

链接到文档

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


3
如果您在活动中混用了多个文本字段,其中一些要使用键盘,而其他则不需要,则这种方法将失败。请参阅我的答案,以了解在这种情况下如何在每个文本字段的基础上实现这一目标。
slogan621

@ slogan621请在此处花点时间了解问题。您处在不同的切线上!
天网

1
当我最近打开我的应用程序时,它不起作用。
Mohd Naushad

83

您必须在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


26
与将android:windowSoftInputMode =“ stateHidden”添加到Activity的清单条目相比,添加无用的视图是次优的解决方案。
克里斯·霍纳

@ChrisHorner中的两个都需要为活动或布局指定...同样是令人讨厌的事情..两者都适用于此解决方案。
Nicolas Jafelle 2013年

2
我尝试了所有解决方案,而这是唯一可以正常工作的解决方案!清楚而简单地感谢您
alfo888_ibg 2013年

正如@ChrisHorner所说,添加无用的视图不是一个好主意,最好按照他的建议在Manifest文件中添加一个属性,或将这行代码添加到您的活动中 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
aB9 2015年

1
View层次结构的实现如此糟糕!我认为,应尽可能避免这种情况。
sud007'7

42
     edittext.setShowSoftInputOnFocus(false);

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


谢谢,这是这里唯一适用于我的解决方案,而且操作简便快捷。
Max O.

20
可从API级别21
Jithu PS

这就是我想要的。
Sanjay Joshi

@ JithuP.S,为什么要在API级别为19的Karbon Titanium上工作?
尤金宝汉子18/12/15

23

人们在这里提出了许多很好的解决方案,但是我在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"/>

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

在此处输入图片说明



20

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

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

当用户单击EditText时,键盘将弹出


9

您可以使用以下代码来禁用“屏幕键盘”。

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

1
我可以通过使用EditText.onClick(im.unhideSoftInputFromWindow(editText.getWindowToken(),0);)或类似的东西再次启用它?
家蝇

8

两种简单的解决方案:

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

android:windowSoftInputMode =“ stateHidden”

例:

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

第二个解决方案是在活动中添加以下代码行

//Block auto opening keyboard  
  this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

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


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

这会起作用。


请发布您的代码。执行过程中您会得到什么。
AndroGeek

所有代码都在问题中,当我单击编辑文本时,屏幕上的键盘没有显示
Housefly

您是使用仿真器还是设备进行测试。如果您正在使用仿真器进行尝试,则不会获得软键。使用设备对其进行测试。会的。
AndroGeek

是的,我正在使用一种设备进行测试
Housefly,2012年

嗯,这很奇怪。如果您可以发布代码,那么您编写的方法可能会有所帮助。否则上面的代码在我的设备上可以正常工作。
2012年

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

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

默认情况下,您无法在任何计算器上输入任何内容,但可以设置任何字符串。

尝试一下


3

感谢@AB提供好的解决方案

    android:focusableInTouchMode="false"

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

在Android Studio 3.0.1中为我工作minsdk 16,maxsdk26


1
这是对A.B答案的评论吗?还是对原始问题的答案?如果这是对A.B答案的注释,则应使用StackOverflow提供的注释选项,并删除原始问题的答案。
David Walschots,

对不起,如果我不明白答案的答案。我要感谢AB为解决我的问题提供了一个很好的答案。如果我错了,我可以删除该答案,对不起@DavidWalschots。
NZXT

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

它的工作方式与以前相同。...我需要对布局进行任何更改吗?为此EditText视图?
家蝇

好了,现在的作品中加入一些布局属性...机器人之后:点击=“真正的”机器人:cursorVisible =“假”机器人:可聚焦=“假”谢谢你
家蝇

否。做一件事。在edittext.setOnFocusChangeListener()方法中编写隐藏键盘代码,然后尝试
user1213202 2012年

如果可以确切指定何时使用调用hideSoftInput,这将是解决方案。onCreate和onResume之后,键盘会自动弹出
ahmet emrah

2

好吧,我遇到了同样的问题,我只是将焦点放在XML文件中。

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

您可能也在寻找安全性。这也将有所帮助。


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

1

您唯一需要做的就是将其添加android:focusableInTouchMode="false"到xml中的EditText中,然后就可以了。


1

对于Xamarin用户:

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

1
       <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"/>

1

如果您使用的是Xamarin,则可以添加

Activity[(WindowSoftInputMode = SoftInput.StateAlwaysHidden)]

之后,您可以在OnCreate()方法中添加此行

youredittext.ShowSoftInputOnFocus = false;

如果目标设备不支持以上代码,则可以在EditText click事件中使用以下代码

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

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

0

在我正在构建的Android应用中,我有3EditTextLinearLayout水平排列。我必须防止在加载片段时出现软键盘。除了设置focusablefocusableInTouchMode对真LinearLayout,我必须设置descendantFocusabilityblocksDescendants。在onCreate,我叫requestFocusLinearLayout。这样可以防止在创建片段时出现键盘。

布局-

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


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>

不赞成投票的人,请在不赞成投票之前发表评论!
阿吉马尔·萨利姆

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


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

-1

用于您活动中的任何textview(或使用android:layout_width =“ 0dp” android:layout_height =“ 0dp”创建伪造的空textfiew),然后为该textview添加以下内容:android:textIsSelectable =“ true”



-1

只需要添加属性android:focusable="false"尤其EditText在布局XML。然后,您可以编写单击列表器,EditText而不会弹出键盘。


-1

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


嘿,谢谢你写答案!但是,由于这里已经有很多答案,因此,如果您实际上将其写为对Ranjith Kumar答案的评论而不是将其作为自己的答案,则可能会更有帮助。提及省略该操作inputType会产生什么效果也可能很有趣。但是,如果我选择其他答案,似乎确实很高兴,因此,即使您坚持将其作为自己的答案,也请考虑在此处留下任何评论。
标记
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.