2011-11-04 41 views
7

Tôi có một WebView và một số nút trong bố cục của tôi. Có một thẻ lớn trong WebView của tôi. Ứng dụng này được sử dụng để chỉnh sửa các tệp văn bản. Các nút được sử dụng để tạo hiệu ứng textarea bên trong WebView của tôi. Khi người dùng nhấn một nút (Chẳng hạn như nút mũi tên để di chuyển chế độ xem văn bản), nó sẽ đóng bàn phím. Tôi đã sử dụng toggleSoftInput, nhưng điều đó chỉ chuyển sang bàn phím để hiển thị hay không. Tôi muốn các nút dừng ẩn bàn phím mềm khi nhấn nút. Tôi đã không tìm thấy gì về vấn đề cụ thể của mình. Tôi đã tìm kiếm trong nhiều tuần. Bất cứ ai có bất kỳ ý tưởng về cách tôi có thể ngăn chặn các nút của tôi từ ẩn bàn phím mềm trên Android?Ngăn các nút từ ẩn bàn phím mềm trên Android

Trả lời

4

Giải pháp cho vấn đề của bạn có thể là giữ cho bàn phím luôn được hiển thị và cho phép người dùng đóng bàn phím khi thực hiện các tác vụ.

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

Hãy thử mã này trong phương thức onCreate() của Hoạt động của bạn. Lưu ý rằng nếu người dùng nhấn nút đóng trên bàn phím hoặc nút quay lại, nó sẽ đóng nó lại. Và tôi đoán bạn không nên can thiệp vào kịch bản đó. Và khi các hành động được thực hiện, bạn có thể đóng bàn phím từ mã.

4

Tôi đang ở chính xác cùng một chiếc thuyền, vì vậy nếu bạn đã từng tìm thấy một giải pháp lý tưởng, tôi rất muốn nghe nó.

EDIT: Thành công! Hay tốt hơn nhiều so với trước đây. Tôi đã xóa giải pháp cũ của mình, vì giải pháp này tốt hơn.

Như đã nêu trong https://stackoverflow.com/a/10536033/513038, nó chỉ ra rằng loadData() ẩn bàn phím. Tuy nhiên, tôi phát hiện ra rằng trong hideSoftKeyboard() của WebView, nó kiểm tra InputMethodManager để xem liệu webview có đang hoạt động hay không, thông qua imm.isActive (mWebView).

Vì vậy, nếu bạn chuyển tiêu điểm thành EditText trước loadData() và chuyển trở lại WebView ngay sau đó, bàn phím sẽ bao quanh! Nó nhanh chóng chuyển sang trường hợp trên, tôi nghĩ về việc quay trở lại tập trung vào webview, (thực sự, điều này không phải lúc nào cũng xảy ra; nó phụ thuộc) nhưng nó ít đáng chú ý hơn bàn phím nhấp nháy và quay lại.

Ý chính của những gì cần phải xảy ra như sau.

Mở rộng WebView. Cho nó một trường EditText:

public EditText mFocusDistraction; 

Trong constructor, có những dòng sau:

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

Sau đó ghi đè loadUrl():

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

Điều đó sẽ giúp cho nó hoạt động, về cơ bản. Đó là một lỗi bit, mặc dù, vì vậy đây là một lớp học hoàn chỉnh hơn:

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

này có vấn đề mất tập trung từ một lĩnh vực đầu vào/văn bản đã chọn trước đó. 1) chọn đầu vào để nhập 2) loadUrl được gọi là 3) bàn phím vẫn còn, nhưng gõ vào nó không có gì (bạn không gõ vào cùng một đầu vào nữa –

+0

@HaykSaakian Thật sao?Tôi không biết; những gì tôi đã làm việc cho tôi, và tôi không _think_ tôi đã phạm sai lầm khi tôi đặt nó lên đây. Tôi giả sử rằng bạn đang cố gắng nhập vào cùng một webview như đang chạy loadUrl, phải không? – Erhannis

+0

có lẽ nó chỉ là một cửa sổ nhỏ của thời gian, và trong trường hợp của bạn, bạn không nhận thấy nó? trong trường hợp của tôi, tôi có một trang mà tôi gọi loadUrl đến nhiều lần mỗi giây (trang trò chuyện sử dụng java websockets để tiêm thông điệp bằng cách sử dụng loadUrl với javascript) –

0

Xamarin Android (Alternative):

InputMethodManager inputManager = (InputMethodManager)GetSystemService(Context.InputMethodService); 
inputManager.ToggleSoftInput (ShowFlags.Forced, HideSoftInputFlags.ImplicitOnly); 
Các vấn đề liên quan