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 đó :)
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
tuyệt vời! vẫn đang làm việc trên API 23 –
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