2010-03-19 41 views
37

Tôi đang cố buộc Bàn phím mềm mở trong một Hoạt động và lấy mọi thứ được nhập khi tôi muốn xử lý đầu vào, tôi không có EditText. Hiện tại tôi đã thử điều này nhưng nó không hoạt động. Tôi muốn Soft Keyboard để mở bên dưới mAnswerTextView (Lưu ý: nó là một TextView không EditText).Buộc Bàn phím mềm mở

InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
    // only will trigger it if no physical keyboard is open 
    mgr.showSoftInput(mAnswerTextView, InputMethodManager.SHOW_IMPLICIT); 
  1. làm thế nào để buộc các phím mềm mở
  2. Làm thế nào để Gab tất cả những gì được nhập vì vậy mà tôi có thể xử lý từng nhân vật. Tôi muốn tuôn ra từng nhân vật từ Bàn phím mềm sau khi tôi đã xử lý nó. tức là người dùng không thể nhập toàn bộ từ trong Bàn phím mềm.
+0

Hi, Tôi có câu hỏi tương tự như bạn. Tôi có thể hiển thị bàn phím, nhưng làm cách nào để lấy mọi thứ được nhập mà không có EditText? Thanx! –

Trả lời

13

Có thể bạn sẽ cần phải có một vùng văn bản có thể chỉnh sửa để tập trung. Bạn có thể có thể có một ẩn hoặc trên nền trong suốt mà không có con trỏ. Bạn có thể cần phải đồ chơi xung quanh với các thiết lập focusability cho xem.

Sử dụng trình soạn thảo văn bản để kiểm tra chỉnh sửa cho EditText đó với addTextChangedListener hoặc nếu bạn cần móc nối mức thấp hơn, hãy đặt trình nghe khóa của chế độ xem văn bản bằng phương thức setOnKeyListener(). Xem KeyListener documentation.

Sử dụng cuộc gọi này để buộc các bàn phím mềm mở:

((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)) 
    .showSoftInput(myEditText, InputMethodManager.SHOW_FORCED); 

và một này để đóng nó lại:

((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)) 
    .hideSoftInputFromWindow(myEditText.getWindowToken(), 0); 

lưu ý rằng đây thực sự là không được khuyến khích - buộc bàn phím mở là loại lộn xộn. Trường hợp sử dụng của bạn thực sự cần thiết cho việc nhập người dùng của bạn mà không có một hộp soạn thảo bình thường và yêu cầu ăn đầu vào của người dùng trên cơ sở khóa-by-key mà không lặp lại nó là gì?

+0

Tôi nhận được một số lượng lớn các lỗi từ Droid. Cụ thể là java.lang.IndexOutOfBoundsException: getChars (6 ... 0) đã kết thúc trước khi bắt đầu lỗi. Điều này là do EditText – jax

+0

do EditText là gì? Và đâu là lỗi này đến từ, các TextWatcher, KeyListener, hoặc showSoftInput/hideSoftInput cuộc gọi? Bạn cũng sẽ phải đăng mã của mình và theo dõi ngăn xếp để mọi người có thể giúp bạn ở đây. –

+0

Nó không làm việc cho tôi. –

121

thử này để buộc mở bàn phím mềm:

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

sau đó bạn có thể sử dụng mã này để đóng bàn phím:

((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(_pay_box_helper.getWindowToken(), 0); 
+0

Cảm ơn. _pay_box_helper trong ví dụ 'đóng bàn phím' là gì? EDIT: Ah, tôi thấy, đó là một biến trường văn bản. –

+3

Nó không làm việc cho tôi. –

+0

Hoạt động tuyệt vời cho tôi, trên menu chỉnh sửa có thể gập lại trên Thanh Hành động Sherlock. Cảm ơn. – Soham

8

Buộc thực hiện bàn phím để mở tôi đã sử dụng

this.getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE); 

nó đã hiệu quả đối với tôi.

+0

Làm việc cho tôi, nhưng bạn phải gọi điều này trước khi 'siêu.onCreate() 'in' onCreate ' – Palani

+0

tính năng này không hoạt động đối với tôi (API23, Google Nexus) – keinabel

5

Đôi khi các câu trả lời khác sẽ không hoạt động.
Đây là một cách khác ..

Nó sẽ buộc bàn phím hiển thị khi hoạt động bắt đầu bằng cách nghe tiêu điểm cửa sổ. onWindowFocusChanged() nó sẽ xóa và yêu cầu tiêu điểm của EditText, sau đó đặt chế độ nhập mềm để hiển thị và đặt lựa chọn thành văn bản trong hộp. Điều này sẽ luôn luôn hoạt động nếu bạn đang gọi nó từ hoạt động.

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 
    if (hasFocus) { 
     mEditText.clearFocus(); 
     mEditText.requestFocus(); 
     getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE); 
     mEditText.setSelection(mEditText.getText().toString().length()); 
    } 
} 

Bạn cũng có thể cần

mEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if (hasFocus) { 
       InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
       imm.showSoftInput(mEditText, InputMethodManager.SHOW_IMPLICIT); 
      } 
     } 
    }); 

Edit: Tôi cũng đã thấy bàn phím không mở mảnh vỡ bên trong lồng nhau, hãy cẩn thận của những loại tình huống.

1

nếu bạn muốn kiểm soát mềm bàn phím bên trong hoạt động sau đó sử dụng mã này:

//create soft keyboard object 
InputMethodManager imm = (InputMethodManager)this.getSystemService(INPUT_METHOD_SERVICE); 

//1.USE 
your_view.setFocusableInTouchMode(true); //Enable touch soft keyboard to this view 
//or 
your_view.setFocusable(true); //Enable keyboard to this view 
imm.showInputMethod(your_view, InputMethodManager.SHOW_IMPLICIT); 

//2.USE show keyboard if is hidden or hide if it is shown 
imm.toggleSoftInputFromWindow(your_view.getWindowToken(),InputMethodManager.SHOW_IMPLICIT, InputMethodManager.HIDE_IMPLICIT_ONLY); 
//or 
imm.toggleSoftInputFromWindow(InputMethodManager.SHOW_IMPLICIT, InputMethodManager.HIDE_IMPLICIT_ONLY); 

//3.USE (you cannot control imm) 
this.getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE); 

//4.USE (with Dialog) 
Dialog d = new Dialog(this, android.R.style.Theme_Panel); 
d.getWindow().setTitle(null); 
d.setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE); 
d.setOnKeyListener(keyListener); 
d.setCanceledOnTouchOutside(true); 
d.setCancelable(true); 
d.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 
d.show(); 

//to hide keyboard call: 
d.dismiss(); 
//if you want get soft keyboard visibility call: 
d.isShowing(); 
0
if(search.getText().toString().trim().isEmpty()) { 
    InputMethodManager imm = (InputMethodManager)getSystemService(
       Context.INPUT_METHOD_SERVICE); 
    imm.hideSoftInputFromWindow(search.getWindowToken(), 0); 
} 
+1

Vui lòng chỉnh sửa giải thích tại sao/cách mã này trả lời câu hỏi? Các câu trả lời chỉ có mã không được khuyến khích, bởi vì chúng không dễ học từ mã với lời giải thích. Nếu không có một lời giải thích, phải mất nhiều thời gian và công sức để hiểu những gì đang được thực hiện, những thay đổi được thực hiện đối với mã, nếu mã trả lời câu hỏi, vv Giải thích là quan trọng cho cả những người cố gắng học hỏi từ câu trả lời và đánh giá trả lời để xem liệu nó có hợp lệ hay không, hoặc đáng để bỏ phiếu. – Makyen

+0

xem http://stackoverflow.com/help/how-to-answer – SMR

-1

tôi đã thử nghiệm và điều này đang làm việc:

... // để hiển thị bàn phím mềm

imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); 

// để ẩn, hãy gọi lại phương thức

imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); 
+1

Sao chép và dán không hợp lệ – webbi

1

Đáng buồn thay, nhiều như tôi đã muốn bỏ phiếu cho một trong những câu trả lời, không có câu trả lời nào phù hợp với tôi. Có vẻ như giải pháp là chờ cho giai đoạn bố trí hoàn thành. Trong đoạn mã bên dưới, hãy chú ý cách tôi kiểm tra xem phương thức showKeyboard có trả về TRUE hay không và đó là khi tôi xóa trình lắng nghe bố cục chung. Nếu không làm điều này, nó đã bị đánh và bỏ lỡ. Bây giờ nó có vẻ hoạt động hoàn hảo.

Bạn cần phải làm như dưới đây lý tưởng trong onResume()

@Override 
public void onResume() 
{ 
    super.onResume(); 

    ViewTreeObserver vto = txtTaskTitle.getViewTreeObserver(); 
      vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() 
      { 
       @Override 
       public void onGlobalLayout() 
       { 
        if (txtTaskTitle.requestFocus()) 
        { 
         if (showKeyboard(getContext(), txtTaskTitle)) 
         { 
          txtTaskTitle.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
         } 
        } 
       } 
      }); 
} 

public static boolean showKeyboard(Context context, EditText target) 
{ 
     if (context == null || target == null) 
     { 
      return false; 
     } 

     InputMethodManager imm = getInputMethodManager(context); 

     ((InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(target, InputMethodManager.SHOW_FORCED); 

     boolean didShowKeyboard = imm.showSoftInput(target, InputMethodManager.SHOW_FORCED); 
     if (!didShowKeyboard) 
     { 
      didShowKeyboard = ((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(target, InputMethodManager.SHOW_FORCED); 
     } 
     return didShowKeyboard; 
} 
0

công tác vĩ đại .........

edt_searchfilter_searchtext.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if(hasFocus){ 
       edt_searchfilter_searchtext.post(new Runnable() { 
        @Override 
        public void run() { 
         InputMethodManager imm = (InputMethodManager) getFragmentActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
         imm.showSoftInput(edt_searchfilter_searchtext, InputMethodManager.SHOW_IMPLICIT); 
        } 
       }); 
      } 
     } 
    }); 

Dưới đây gọi dòng khi bạn muốn mở bàn phím

edt_searchfilter_searchtext.requestFocus(); 
0

Đơn giản chỉ cần sử dụng thêm 2 dây chuyền sẽ làm việc như một nét duyên dáng:

Nếu sử dụng XML

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

khác trong Java:

view.setFocusableInTouchMode(true); 
view.requestFocus(); 
Các vấn đề liên quan