Ответ 1
После нескольких часов и часов исследований я наконец нашел решение, которое работает для всех версий API. Надеюсь, это экономит время.
Если вы разрабатываете API >= 11, решение прост:
1) Добавьте два свойства ниже в xml файл EditText
android:inputType="none"
android:textIsSelectable="true"
или
2) Программно выполните приведенные ниже
myEditText.setInputType(InputType.TYPE_NULL);
myEditText.setTextIsSelectable(true);
И все готово.
Если вы хотите обслуживать API < 11, я обнаружил, что нет возможности отключить клавиатуру от выпадающего меню, если вы хотите выбрать текст для цели копирования. Настройка focusable на false отключит клавиатуру, но это не поможет, поскольку она отключает возможность выбора текста. Любые другие решения, которые я нашел в stackoverflow, либо не работают, либо отключают выбор текста одновременно.
Один уродливый способ решить это как таковой.
Сначала добавьте это свойство в xml файл EditText
android:editable="false"
Да, это устарело, но необходимо для того, чтобы сделать EditText недоступным для редактирования в версии API < 11.
Далее нам нужно будет скрыть клавиатуру, как только она появится, чтобы мы могли продолжать выбирать текст без блокировки клавиатуры.
Используйте этот код для обнаружения клавиатуры (решение, полученное из fooobar.com/questions/16169/...), и немедленно скройте его.
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);
}
}
}
});
}
Это работает для моего дела. Хотя вы можете видеть, что клавиатура появляется в течение секунды (что является уродливой частью), но я не могу придумать другого способа заставить это работать на момент написания. Если у вас есть лучшее решение, оставьте комментарий!
Дайте мне знать, если это экономит время:)