我来到this,这让我在那里,但并不完全。
我有一个拨号器Fragment
,其中包含所有常用的Button
输入包含退格键的数字,因此我不需要软键盘。我还想让用户能够粘贴文本(长按...默认情况下工作正常),以及编辑已输入的内容,因此我需要光标。
我发现,如果用户在EditText
内单击,则确保软键盘不会弹出的最简单方法是将inputType
设置为null - 但这也会导致光标死亡。
那么,我如何声明我的EditText
以及我应该启动什么样的命令让我的EditText
字段永远不会显示软键盘,无论用户尝试什么,但仍保留粘贴功能和光标?
我也在我的清单中尝试了android:windowSoftInputMode="stateAlwaysHidden"
,但无济于事。
答案 0 :(得分:38)
这对我有用:
// Update the EditText so it won't popup Android's own keyboard, since I have my own.
EditText editText = (EditText)findViewById(R.id.edit_mine);
editText.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
v.onTouchEvent(event);
InputMethodManager imm = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
return true;
}
});
答案 1 :(得分:6)
我终于找到了一个(对我而言)工作解决方案。
第一部分(在onCreate中):
// Set to TYPE_NULL on all Android API versions
mText.setInputType(InputType.TYPE_NULL);
// for later than GB only
if (android.os.Build.VERSION.SDK_INT >= 11) {
// this fakes the TextView (which actually handles cursor drawing)
// into drawing the cursor even though you've disabled soft input
// with TYPE_NULL
mText.setRawInputType(InputType.TYPE_CLASS_TEXT);
}
此外,android:textIsSelectable需要设置为true(或在onCreate中设置),并且EditText不能专注于初始化。如果您的EditText是第一个可聚焦的视图(在我的情况下是它),您可以通过将它放在它上面来解决这个问题:
<LinearLayout
android:layout_width="0px"
android:layout_height="0px"
android:focusable="true"
android:focusableInTouchMode="true" >
<requestFocus />
</LinearLayout>
您可以在Grapher应用程序中看到此结果,免费并可在Google Play中使用。
答案 2 :(得分:4)
将textIsSelectable标志设置为true会禁用软键盘。
您可以在xml布局中设置它,如下所示:
<EditText
android:id="@+id/editText"
...
android:textIsSelectable="true"/>
或者以编程方式,像这样:
EditText editText = (EditText) findViewById(R.id.editText);
editText.setTextIsSelectable(true);
光标仍然存在,您可以选择/复制/剪切/粘贴,但软键盘永远不会显示。
答案 3 :(得分:3)
使用
android:windowSoftInputMode="stateHidden"
在您的清单文件中,而不是android:windowSoftInputMode="stateAlwaysHidden"
答案 4 :(得分:3)
这就是我所做的。 首先,在清单内部活动
android:windowSoftInputMode="stateAlwaysHidden|adjustNothing"
其次,onCreate
如果在内部活动,或onActivityCreated
如果在内部片段
editText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
hideSoftKeyboard(v);
}
});
不要忘记请求焦点到editText
editText.requestFocus();
然后添加hideSoftKeyboard(v)
方法与其他答案相同。
private void hideSoftKeyboard(View v){
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
这里的关键是在点击EditText之前requestFocus。如果没有焦点,首先点击将使键盘显示(我的经验)。但是,如果活动中有一个EditText,则会应用此选项。有了这个,您仍然可以使用自定义键盘(如果有)键入,可以复制和粘贴,并且光标仍然可见。
答案 5 :(得分:3)
通过将EditText中的标记HomePage
设置为 true ,可以提供所需的确切功能。这样, 光标仍然存在,您将能够选择/复制/剪切/粘贴,但SoftKeyboard将永远不会显示 。需要API 11及更高版本。
您可以在xml布局中设置它,如下所示:
textIsSelectable
或者以编程方式,像这样:
<EditText
android:textIsSelectable="true"
...
/>
对于使用API 10及更低版本的任何人,此处提供了hack: https://stackoverflow.com/a/20173020/7550472
答案 6 :(得分:2)
来自@Lupsaa here的最佳解决方案:
将textIsSelectable标志设置为true会禁用软键盘。
您可以在xml布局中设置它,如下所示:
<EditText
android:id="@+id/editText"
...
android:textIsSelectable="true"/>
或者以编程方式,像这样:
EditText editText = (EditText) findViewById(R.id.editText);
editText.setTextIsSelectable(真);
光标仍然存在,您可以选择/复制/剪切/粘贴,但软键盘永远不会显示。
答案 7 :(得分:2)
cell.backgroundColor = self.colors[indexPath.row % self.colors.count]
// ...
return cell
答案 8 :(得分:1)
这完全(对我来说)分两步完成:
<activity... android:windowSoftInputMode="stateHidden">
在editText XML代码中添加这些属性
android:focusable="true"
android:focusableInTouchMode="true
你必须同时放置1和2,然后它才会起作用。
干杯
答案 9 :(得分:1)
首先在活动下的清单文件中添加android:windowSoftInputMode="stateHidden"
。像这样
<activity... android:windowSoftInputMode="stateHidden">
在您的xml上添加此android:textIsSelectable="true"
。这将使指针可见。
然后在活动的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;
}
});
答案 10 :(得分:0)
EditText editText =(EditText)findViewById(R.id.edit_mine); editText.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
v.onTouchEvent(event);
InputMethodManager imm = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
return true;
}
});
哈哈......这是正确的做法...这项工作已经完成......这将会奏效!
答案 11 :(得分:0)
您可以在活动的onCreate方法中使用以下代码行,以确保仅在用户单击或触摸EditText字段时才弹出键盘。我尝试了很多来自stackoverflow的方法和代码,但没有用,但这 非常适合我!试试这个..:)`
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
答案 12 :(得分:0)
您可以在活动的onCreate方法中使用以下代码行,以确保仅在用户单击或触摸EditText字段时才弹出键盘。我尝试了很多来自stackoverflow的方法和代码,但是没有用,但这对我来说是完美的!试试这个..:)`
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
答案 13 :(得分:0)
答案 14 :(得分:0)
我发现这个非常有用的代码,它很有魅力,它完全控制键盘,但保持光标,你可以复制过去,移动光标......等
使用:
hideSoftKeyboard(editText);
方法:
public void hideSoftKeyboard(EditText edit) {
if (android.os.Build.VERSION.SDK_INT <= 10) {
edit.setInputType(InputType.TYPE_NULL);
} else {
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
try {
Class<EditText> cls = EditText.class;
Method setSoftInputShownOnFocus;
setSoftInputShownOnFocus = cls.getMethod("setShowSoftInputOnFocus", boolean.class);
setSoftInputShownOnFocus.setAccessible(true);
setSoftInputShownOnFocus.invoke(edit, false);
} catch (Exception e) {
e.printStackTrace();
}
}
}