何時間にもわたる調査の結果、私はついにすべてのAPIバージョンで機能するソリューションを見つけました。これが誰かの時間を節約することを願っています。
API> = 11で開発している場合、解決策は次のいずれかです。
1)EditTextのxmlファイルに以下の2つのプロパティを追加します
android:inputType="none"
android:textIsSelectable="true"
また
2)プログラムで以下を実行します
myEditText.setInputType(InputType.TYPE_NULL);
myEditText.setTextIsSelectable(true);
これで完了です。
API <11にも対応したい場合、コピー&ペーストの目的でテキストを選択したい場合は、キーボードが飛び出さないようにする方法がないことがわかりました。focusableをfalseに設定するとキーボードが無効になりますが、テキストを選択する機能も無効になるため、役に立ちません。私がstackoverflowで見つけた他の解決策はすべて機能しないか、同時にテキスト選択を無効にします。
これを解決するための醜い方法の1つはそれ自体です。
まず、このプロパティをEditTextのxmlファイルに追加します
android:editable="false"
はい、これは非推奨ですが、APIバージョン<11でEditTextを編集できないようにするために必要です。
次に、キーボードが表示されたらすぐに非表示にして、キーボードが邪魔にならないようにテキストを選択し続けることができるようにする必要があります。
以下のコードを使用して、キーボードが表示されていることを検出し(https://stackoverflow.com/a/9108219/1241783から取得したソリューション)、すぐに非表示にします。
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);
}
}
}
});
}
私の場合はうまくいきます。キーボードが一瞬で表示されるのを見ることができますが(これは醜い部分です)、これを書いている時点でこれを機能させる他の方法は考えられません。より良い解決策があれば、コメントを残してください!
これで誰かの時間を節約できるかどうかも教えてください:)