33

こんにちは私はカスタムダイヤラを作成しているので、独自の入力パッドを作成します。

問題は、EditTextを無効にしながら、切り取り/コピー/貼り付けを許可するにはどうすればよいですか?ストックダイヤラはこれを行うことができます。

試しandroid:focusable="false"ましたが、カット/コピーが無効になります(ただし、貼り付けることはできます)。

inputTypeまた、プログラムで3つのコマンドすべてを無効にしようとしました。

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

マニフェストから無効にすることもできません。

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

解決策はありますか?ありがとう

4

7 に答える 7

57

何時間にもわたる調査の結果、私はついにすべての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);
            }
            }
         }
        });
}

私の場合はうまくいきます。キーボードが一瞬で表示されるのを見ることができますが(これは醜い部分です)、これを書いている時点でこれを機能させる他の方法は考えられません。より良い解決策があれば、コメントを残してください!

これで誰かの時間を節約できるかどうかも教えてください:)

于 2013-11-24T09:28:12.073 に答える
34

ソフトキーボードの表示を無効にし、コピー/貼り付けとカーソル機能を維持するには、アクティビティに次の行を追加するだけです。

getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
    WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
于 2014-07-18T12:38:04.227 に答える
7

現在のトップアンサーは非推奨のメソッドを使用していて、貼り付けメソッドがなかったので、古いメソッドを使用しない別の方法を次に示します。ただし、フォールバックを使用したリフレクションを介して非表示のメソッドを使用しようとします。=)

私は、キーボードを表示せずにすべてのクールな編集機能を保持するEditTextという新しいウィジェットにサブクラス化しました。KeyboardlessEditTextファイルをドロップして移動します。

この投稿の完全なコードは少し長いですが、GitHubがダウンしない限り、これは機能します:https ://github.com/danialgoodwin/android-widget-keyboardless-edittext/blob/master/KeyboardlessEditText2 .java

于 2014-06-05T01:21:32.047 に答える
6

システムキーボードの自動ポップアップを無効にするには、EditTextまたはTextView次の手順を実行します。

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
}
于 2017-02-16T06:07:33.150 に答える
3

これを試して

 EditText et = ... // your EditText

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

サブクラス化する必要はありません。これとEditTextをフォーカス不可にする主な違いは、EditTextにはまだ独自のカーソルがあることです。テキストなどを選択できます。IMEが独自のソフトキーボードをポップアップしないようにするだけです。

于 2013-03-02T15:03:14.053 に答える
3

私は同じ問題を抱えていましたが、後でダブルタップ後に入力を許可したかったのです。何時間も検索した後、(少なくとも私にとっては)うまくいく解決策を見つけました。onCreateメソッドでこれを使用します。

editText.setCursorVisible(false);
editText.setTextIsSelectable(true);
editText.setShowSoftInputOnFocus(false);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);  // This just hide keyboard when activity starts

これらの行は間違いなくトリックを行う必要があります..そしてそれを元に戻したい場合はこれを使用してください:

editText.setCursorVisible(true);
editText.setShowSoftInputOnFocus(true);

キーボードを再度表示するには、次を使用します。

private void showSoftKeyboard(View view) {
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
    view.requestFocus();
    inputMethodManager.showSoftInput(view, 0);
}

次回コピー/貼り付けを許可するには、次の3行を使用します。

editText.setCursorVisible(false);
editText.setTextIsSelectable(true);
editText.setShowSoftInputOnFocus(false);

さらにキーボードを非表示にするには:

private void hideSoftKeyboard() {
    if(getCurrentFocus() != null) {
        InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
    }
}

このコードはAPI>=21で動作しています

于 2020-03-25T21:53:24.197 に答える
1

フォーカスが編集テキストに移動した後、osソフトキーパッドが表示されていたときにまだ表示されていたカスタムインライン「偽の」入力のために、同様のニーズがありました。解決策は、前のカスタム入力ウィジェットが編集ライフサイクルを終了するまで、編集テキストにソフト入力を非表示にすることでした。

@Bruceの回答をインスピレーションに使用し、最後に添付する関連記事もいくつか見ました。私がうまくいった解決策は次のとおりです。

fun setInputType(inputType: Int) {
        getEditText().setRawInputType(inputType)
        if (inputType == InputType.TYPE_NULL) {
            getEditText().setTextIsSelectable(true)
            getEditText().isCursorVisible = true
        }
    }

に戻るsetRawInputType()ときに設定するときに複数行のテキスト入力が尊重されなかったため、代わりに使用する必要がありました。InputType.TYPE_NULLInputType.TYPE_TEXT_FLAG_MULTI_LINE

の呼び出しに関連する問題を報告しているユーザーがいるようsetInputType(InputType.TYPE_NULL)です。参照: https ://issuetracker.google.com/issues/36907992

その他の役立つ関連記事:

EditTextをAndroidのXMLで編集できないようにするにはどうすればよいですか?

EditText編集不可

于 2019-11-13T17:18:28.743 に答える