簡體   English   中英

Android 在不丟失光標的情況下從 EditText 隱藏軟鍵盤

[英]Android Hide Soft Keyboard from EditText while not losing cursor

我已經走到了這一步, 讓我走到了一半,但並不完全。 我有一個撥號Fragment ,它具有所有常用的Button來輸入包括退格鍵在內的數字,所以我不需要軟鍵盤。 我還想讓用戶能夠粘貼文本(長按...默認情況下工作正常),以及編輯已輸入的內容,因此我需要光標。

如果用戶在EditText內單擊,我發現確保軟鍵盤不會彈出的最簡單方法是將inputType設置為 null - 但這也會殺死光標。

那么,我如何聲明我的EditText以及我應該啟動什么樣的命令來讓我的EditText字段永遠不會顯示軟鍵盤,無論用戶嘗試什么,但仍然保留粘貼功能和光標?

我也試過android:windowSoftInputMode="stateAlwaysHidden"在我的清單中,但無濟於事。

這對我有用:

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

我終於找到了一個(對我來說)可行的解決方案。

第一部分(在 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 中免費提供。

將標志 textIsSelectable 設置為 true 將禁用軟鍵盤。

您可以像這樣在 xml 布局中設置它:

<EditText
    android:id="@+id/editText"
    ...
    android:textIsSelectable="true"/>

或者以編程方式,像這樣:

EditText editText = (EditText) findViewById(R.id.editText);
editText.setTextIsSelectable(true);

光標仍然存在,您可以選擇/復制/剪切/粘貼,但軟鍵盤永遠不會顯示。

從@Lupsaa最好的解決方案在這里

將標志 textIsSelectable 設置為 true 將禁用軟鍵盤。

您可以像這樣在 xml 布局中設置它:

<EditText
android:id="@+id/editText"
...
android:textIsSelectable="true"/>

或者以編程方式,像這樣:

EditText editText = (EditText) findViewById(R.id.editText);

editText.setTextIsSelectable(true);

光標仍然存在,您可以選擇/復制/剪切/粘貼,但軟鍵盤永遠不會顯示。

采用

android:windowSoftInputMode="stateHidden" 

在您的清單文件中而不是android:windowSoftInputMode="stateAlwaysHidden"

這就是我所做的。 首先,在 manifest 中的活動

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,則會應用此方法。 有了這個,您仍然可以使用自定義鍵盤(如果有)鍵入,可以復制和粘貼,並且光標仍然可見。

您需要的確切功能是通過將 EditText 中的標志textIsSelectable設置為true 來提供的 這樣,光標仍然存在,您將能夠選擇/復制/剪切/粘貼,但 SoftKeyboard 永遠不會顯示. 需要 API 11 及更高版本。

您可以像這樣在 xml 布局中設置它:

<EditText
    android:textIsSelectable="true"
    ...
/>

或者以編程方式,像這樣:

EditText editText = (EditText) findViewById(R.id.editText);
editText.setTextIsSelectable(true);

對於使用 API 10 及以下版本的任何人,此處提供了 hack: https : //stackoverflow.com/a/20173020/7550472

這分兩步(對我而言)非常有效:

  1. <activity... android:windowSoftInputMode="stateHidden">在清單文件中

  2. 在您的 editText XML 代碼中添加這些屬性

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

你必須同時輸入 1 和 2,只有這樣它才會起作用。

干杯

    EditText text = (EditText) findViewById(R.id.text);
    if (Build.VERSION.SDK_INT >= 11) {
        text.setRawInputType(InputType.TYPE_CLASS_TEXT);
        text.setTextIsSelectable(true);
    } else {
        text.setRawInputType(InputType.TYPE_NULL);
        text.setFocusable(true);
    }

如果你的最小 SDK 是 21,你可以從 java 代碼中使用這個方法:

editText.setShowSoftInputOnFocus(false);

學分陳蘇文章

首先在清單文件中的活動下添加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;
    }
});

我發現這個非常有用的代碼,它很有魅力,它完全位於鍵盤上,但保持光標,你可以復制過去,移動光標......等等

使用 :

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

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

哈......這是正確的做法......這項工作完成......這會起作用!

您可以在活動的 onCreate 方法中使用以下代碼行來確保鍵盤僅在用戶單擊或觸摸 EditText 字段時彈出。 我嘗試了許多來自 stackoverflow 的方法和代碼,但沒有任何效果,但這對我來說非常有效!! 試試這個.. :)`

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

您可以在活動的 onCreate 方法中使用以下代碼行來確保鍵盤僅在用戶單擊或觸摸 EditText 字段時彈出。 我嘗試了許多來自 stackoverflow 的方法和代碼,但沒有任何效果,但這對我來說非常有效!! 試試這個.. :)`

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM