2011-11-04 84 views
7

我的佈局中有一個WebView和一些按鈕。我的WebView中有一個大標籤。這個應用程序用於編輯文本文件。這些按鈕用於影響WebView中的textarea。當用戶按下一個按鈕(例如箭頭按鈕來移動文本視圖)時,它將關閉鍵盤。我使用了toggleSoftInput,但只是切換鍵盤來顯示或不顯示。我想讓這些按鈕在按下按鈕時停止隱藏軟鍵盤。我沒有發現任何關於我的具體問題。我已經搜索了幾個星期。任何人有任何想法,我怎麼能阻止我的按鈕隱藏Android軟鍵盤?防止按鍵隱藏Android上的軟鍵盤

回答

4

問題的解決方案可能是始終顯示鍵盤並讓用戶在完成操作後關閉它。

InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
inputManager.toggleSoftInput (InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY); 

請在您的活動的onCreate()方法中嘗試此代碼。 請注意,如果用戶按下鍵盤上的關閉按鈕或後退按鈕,它應關閉它。我想你不應該干涉這種情況。 當動作完成後,您可以從代碼關閉鍵盤。

4

我在同一條船上,所以如果你找到理想的解決方案,我很樂意聽到它。編輯: 成功!無論如何,或者比以前好得多。我刪除了我的舊解決方案,因爲這個更好。

https://stackoverflow.com/a/10536033/513038所述,事實證明loadData()隱藏了鍵盤。 但是,我發現在WebView的hideSoftKeyboard()中,它通過imm.isActive(mWebView)檢查InputMethodManager以查看webview是否處於活動狀態。因此,如果您在loadData()之前將焦點切換到EditText,並且立即切換回WebView,則鍵盤仍然存在!它簡單地切換爲大寫,我認爲將焦點返回到webview(實際上,這似乎並不總是會發生;這取決於),但它遠不如鍵盤閃爍而回。

需要發生的要點如下。

擴展WebView。給它一個EditText字段:

public EditText mFocusDistraction; 

在構造函數中,有下面幾行:

mFocusDistraction = new EditText(context); 
addView(mFocusDistraction); 

然後覆蓋使用loadURL():

public void loadUrl(String s) { 
    mFocusDistraction.requestFocus(); 
    super.loadUrl(s); 
    this.requestFocus(); 
} 

這應該得到它的工作,基本上是這樣。這是一個有點馬車,不過,這裏有一個更加完整的類:

import android.app.Activity; 
import android.content.Context; 
import android.util.AttributeSet; 
import android.webkit.WebView; 
import android.widget.EditText; 

public class WebViewMod extends WebView { 
    public EditText mFocusDistraction; 
    public Context mContext; 

    public WebViewMod(Context context) { 
     super(context); 
     init(context); 
    }  

    public WebViewMod(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(context); 
    }  

    public WebViewMod(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     init(context); 
    } 

    public WebViewMod(Context context, AttributeSet attrs, int defStyle, boolean privateBrowsing) { 
     super(context, attrs, defStyle, privateBrowsing); 
     init(context); 
    } 

    public void init(Context context) { 
     // This lets the layout editor display the view. 
     if (isInEditMode()) return; 

     mContext = context; 

     mFocusDistraction = new EditText(context); 
     mFocusDistraction.setBackgroundResource(android.R.color.transparent); 
     this.addView(mFocusDistraction); 
     mFocusDistraction.getLayoutParams().width = 1; 
     mFocusDistraction.getLayoutParams().height = 1; 
    } 

    @Override 
    public void loadUrl(final String url) { 
     if (mContext instanceof Activity && this.isFocused()) { 
      ((Activity)mContext).runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        mFocusDistraction.requestFocus(); 
        WebViewMod.super.loadUrl(url); 
        WebViewMod.this.requestFocus(); 
       } 
      }); 
     } else { 
      super.loadUrl(url); 
     } 
    } 
} 
+2

這是從先前選擇的輸入/文本字段失去焦點的問題。 1)選擇輸入用於輸入 2)loadUrl被稱爲 3)鍵盤仍然打開,但鍵入它什麼都不做(你不再輸入相同的輸入 –

+0

@HaykSaakian真的嗎?我不知道;我對我有用,而且我不會在我把它放在這裏時犯錯。我假設你正在嘗試輸入與運行loadUrl相同的webview,對吧? – Erhannis

+0

也許這只是一小段時間窗口,在你的情況下,你沒有注意到它?在我的情況下,我有一個頁面,我每秒多次調用loadUrl(聊天頁面使用java websockets,使用loadUrl使用javascript注入消息) –

0

Xamarin的Android(備選):

InputMethodManager inputManager = (InputMethodManager)GetSystemService(Context.InputMethodService); 
inputManager.ToggleSoftInput (ShowFlags.Forced, HideSoftInputFlags.ImplicitOnly);