2013-03-02 31 views
25

Xin chào, tôi đang tạo trình quay số tùy chỉnh để tôi tạo bảng nhập của riêng mình.Tắt bàn phím mềm từ EditText nhưng vẫn cho phép sao chép/dán?

Sự cố là làm cách nào để vô hiệu hóa EditText nhưng vẫn cho phép cắt/sao chép/dán? Trình quay số chứng khoán có thể thực hiện việc này.

Tôi đã thử android:focusable="false" nhưng nó vô hiệu hoá cắt/sao chép (vẫn có thể dán mặc dù).

Tôi cũng đã cố gắng để vô hiệu hóa programatically inputType mà vô hiệu hóa tất cả ba lệnh:

myEditText.setInputType(InputType.TYPE_NULL); //Can't cut/copy/paste 

Vô hiệu hóa nó từ manifest cũng không hoạt động:

android:configChanges="orientation|keyboardHidden" //Keyboard still popped up 

Bất kỳ giải pháp? Cảm ơn

Trả lời

45

Sau giờ làm việc và giờ nghiên cứu, cuối cùng tôi đã tìm được giải pháp phù hợp với tất cả các phiên bản API. Hy vọng điều này sẽ tiết kiệm thời gian của ai đó.

Nếu bạn đang phát triển cho API> = 11, giải pháp là đơn giản, một trong hai:

1) Thêm hai thuộc tính dưới đây trong file xml của EditText

android:inputType="none" 
android:textIsSelectable="true" 

hoặc

2) Lập trình theo cách bên dưới

myEditText.setInputType(InputType.TYPE_NULL); 
myEditText.setTextIsSelectable(true); 

Và bạn đã hoàn tất.

Nếu bạn muốn phục vụ cho API < 11, tôi nhận thấy rằng không có cách nào để vô hiệu hóa với bàn phím từ popping ra nếu bạn muốn chọn văn bản cho mục đích sao chép dán. Đặt có thể đặt tiêu điểm thành false sẽ vô hiệu hóa bàn phím nhưng điều đó không hữu ích vì nó cũng vô hiệu hóa khả năng chọn văn bản của bạn. Bất kỳ giải pháp khác tôi tìm thấy trong stackoverflow tất cả hoặc không hoạt động hoặc vô hiệu hóa lựa chọn văn bản cùng một lúc quá.

Một cách xấu xí để giải quyết này là như vậy ..

Đầu tiên, thêm thuộc tính này trong file xml của EditText

android:editable="false" 

Có này bị phản đối, nhưng cần thiết cho việc thực hiện các EditText không thể chỉnh sửa trong phiên bản API < 11.

Tiếp theo, chúng tôi sẽ cần phải ẩn bàn phím ngay khi nó xuất hiện, để chúng tôi có thể tiếp tục chọn văn bản mà không cần bàn phím chặn đường.

Sử dụng mã này bên dưới để phát hiện bàn phím hiển thị (giải pháp thu được từ https://stackoverflow.com/a/9108219/1241783) và ẩn ngay lập tức.

if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) 
{ 
    final View activityRootView = findViewById(R.id.activityRoot); 
    activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
     public void onGlobalLayout() { 
      Rect r = new Rect(); 
      //r will be populated with the coordinates of your view that area still visible. 
      activityRootView.getWindowVisibleDisplayFrame(r); 

      int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top); 
      if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard... 

      //Hide the keyboard instantly! 
      if (getCurrentFocus() != null) 
      { 
       InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
       imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); 
      } 
      } 
     } 
     }); 
} 

Nó hoạt động cho trường hợp của tôi. Mặc dù bạn có thể thấy bàn phím hiển thị trong một giây thứ hai (đó là phần xấu xí) nhưng tôi không thể nghĩ ra bất kỳ cách nào khác để có được điều này để làm việc tại thời điểm viết. Nếu bạn có một giải pháp tốt hơn, xin vui lòng để lại một bình luận!

Hãy cho tôi biết quá nếu điều này tiết kiệm thời gian của một ai đó :)

+0

Cảm ơn, điều này hoạt động tốt hơn những gì tôi đã sử dụng trước đây, nhưng vẫn không có tùy chọn dán mặc định cho ít nhất KitKat? Tôi chỉ thấy chọn tất cả và sao chép trên báo chí dài .. – Anonsage

+0

tuyệt vời! vẫn đang làm việc trên API 23 –

+0

Nó đẹp nhưng 'myEditText.setInputType (InputType.TYPE_NULL);' tạo dòng đơn EditText, ngay cả khi kết hợp 'InputType.TYPE_NULL | InputType.TYPE_TEXT_FLAG_MULTI_LINE' – Metatron

2

thử này

EditText et = ... // your EditText 

et.setKeyListener(null) //makes the EditText non-editable so, it acts like a TextView. 

Không cần phải phân lớp. Sự khác biệt chính giữa việc này và làm cho EditText của bạn không thể lấy nét được, là EditText vẫn có con trỏ riêng của nó - bạn có thể chọn văn bản, v.v. Tất cả những gì nó làm là loại bỏ IME khỏi xuất hiện bàn phím mềm của riêng nó.

+0

Cảm ơn bạn đã trả lời. Nhưng cách đó sẽ ẩn con trỏ do đó không cho phép tôi cắt/sao chép/dán. – hrsetyono

7

Kể từ khi câu trả lời đầu hiện tại sử dụng một phương pháp lỗi thời và không có phương pháp dán đối với tôi, đây là một cách khác mà không sử dụng các phương pháp cũ. Nhưng, nó cố gắng sử dụng một phương pháp ẩn thông qua sự phản chiếu với một dự phòng. =)

Tôi đã được phân loại là EditText thành một tiện ích con mới được gọi là KeyboardlessEditText mà vẫn giữ lại tất cả các tính năng chỉnh sửa tuyệt vời mà không cần bàn phím hiển thị. Chỉ cần thả tập tin vào và đi.

Mã đầy đủ là một chút dài cho bài viết này, nhưng miễn là GitHub không đi xuống, sau đó điều này sẽ làm việc: https://github.com/danialgoodwin/android-widget-keyboardless-edittext/blob/master/KeyboardlessEditText2.java

+0

điều này thật tuyệt vời và gần như hoàn hảo! Hầu như vì nó vẫn hiển thị bàn phím trong một kịch bản: nếu bạn gửi ứng dụng ở chế độ nền, sau đó quay trở lại, sau đó nó sẽ hiển thị bàn phím: ( Bất kỳ trợ giúp nào cho điều này? Tôi đã thử câu trả lời được chấp nhận (không hoạt động) và cũng đã cố gắng đặt cha mẹ tập trung nhưng không giúp đỡ ... vẫn chưa tìm thấy giải pháp mang lại cho tôi không có bàn phím nhưng với sao chép/dán – daneejela

+0

Cho (các) phương pháp nào gửi ứng dụng lên nền (và mở) có hiển thị bàn phím không? không thể tạo lại điều này trong sáu kết hợp đóng/mở khác nhau mà tôi đã thử (sử dụng API Nexus 4 21) – Anonsage

29

Để vô hiệu hóa hiển thị bàn phím mềm mại, giữ sao chép/dán và con trỏ chức năng, chỉ cần thêm dòng này trong hoạt động của bạn:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, 
    WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); 
+0

Tính năng này có hoạt động cho API <11? – Bruce

+0

Điều này làm việc tốt cho tôi, để nguyên con trỏ và menu ngữ cảnh Ngoài ra, nó hoạt động trên Android O (v.26) Các yêu cầu của tôi là từ v.19 đến v.26. Tôi đặt nó vào phương thức onCreate của hoạt động có chứa điều khiển EditText. – Gail

2

để vô hiệu hóa hệ thống bàn phím tự động bật lên cho EditText hoặc TextView làm như sau:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    editTextView.setShowSoftInputOnFocus(false); 
} else { 
    editTextView.setTextIsSelectable(true); 
    //N.B. Accepting the case when non editable text will be selectable 
} 
Các vấn đề liên quan