139

私のアプリケーションには、ユーザーがEditTextフィールドにテキストをコピー/貼り付けできないようにする登録画面があります。コピー/貼り付け/入力方法とその他のオプションを示すコンテキスト メニューが表示されないように、onLongClickListenerそれぞれに を設定しました。EditTextそのため、ユーザーは編集フィールドにコピー/貼り付けできません。

 OnLongClickListener mOnLongClickListener = new OnLongClickListener() {

        @Override
        public boolean onLongClick(View v) {
            // prevent context menu from being popped up, so that user
            // cannot copy/paste from/into any EditText fields.
            return true;
        }
    };

ただし、ユーザーが Android のデフォルト以外のサードパーティ製キーボードを有効にしている場合に問題が発生します。Android のデフォルトには、コピー/貼り付けのボタンがあるか、同じコンテキスト メニューが表示される場合があります。では、そのシナリオでコピー/貼り付けを無効にするにはどうすればよいですか?

他にもコピー&ペーストする方法があれば教えてください。(そしておそらくそれらを無効にする方法)

どんな助けでも大歓迎です。

4

30 に答える 30

140

最良の方法は、次を使用することです。

etUsername.setLongClickable(false);
于 2012-12-11T13:15:47.780 に答える
119

API レベル 11 以上を使用している場合は、コピー、貼り付け、切り取り、カスタム コンテキスト メニューの表示を停止できます。

edittext.setCustomSelectionActionModeCallback(new ActionMode.Callback() {

            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                return false;
            }

            public void onDestroyActionMode(ActionMode mode) {                  
            }

            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                return false;
            }

            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                return false;
            }
        });

onCreateActionMode(ActionMode, Menu) から false を返すと、アクション モードが開始されなくなります (すべて選択、切り取り、コピー、および貼り付けアクション)。

于 2012-09-08T14:02:29.160 に答える
38

次の方法でコピーアンドペースト機能を無効にできます。

textField.setCustomSelectionActionModeCallback(new ActionMode.Callback() {

    public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
        return false;
    }

    public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
        return false;
    }

    public boolean onActionItemClicked(ActionMode actionMode, MenuItem item) {
        return false;
    }

    public void onDestroyActionMode(ActionMode actionMode) {
    }
});

textField.setLongClickable(false);
textField.setTextIsSelectable(false);

それがあなたのために働くことを願っています;-)

于 2012-09-06T05:56:01.257 に答える
12

これは、すべてのバージョンで editText 作業のカット コピー ペーストを無効にする最良の方法です。

if (android.os.Build.VERSION.SDK_INT < 11) {
        editText.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {

            @Override
            public void onCreateContextMenu(ContextMenu menu, View v,
                    ContextMenuInfo menuInfo) {
                // TODO Auto-generated method stub
                menu.clear();
            }
        });
    } else {
        editText.setCustomSelectionActionModeCallback(new ActionMode.Callback() {

            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                // TODO Auto-generated method stub
                return false;
            }

            public void onDestroyActionMode(ActionMode mode) {
                // TODO Auto-generated method stub

            }

            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                // TODO Auto-generated method stub
                return false;
            }

            public boolean onActionItemClicked(ActionMode mode,
                    MenuItem item) {
                // TODO Auto-generated method stub
                return false;
            }
        });
    }
于 2014-03-31T08:09:37.170 に答える
11

setCustomSelectionActionModeCallbackに加えて、無効化された長クリックソリューションでは、下の画像のように、テキスト選択ハンドルがクリックされたときにPASTE/REPLACE メニューが表示されないようにする必要があります。

貼り付けメニュー付きのテキスト選択ハンドル

show()解決策は、(文書化されていない)android.widget.Editorクラスのメソッドに PASTE/REPLACE メニューが表示されないようにすることです。メニューが表示される前に、チェックが行われif (!canPaste && !canSuggest) return;ます。これらの変数を設定するための基礎として使用される 2 つのメソッドは、両方ともEditTextクラスにあります。

より完全な回答はこちらにあります

于 2015-03-06T07:08:14.983 に答える
4

このソリューションをテストしましたが、これは機能します

    mSubdomainEditText.setLongClickable(false);
    mSubdomainEditText.setCustomSelectionActionModeCallback(new ActionMode.Callback() {

      public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        return false;
      }

      public void onDestroyActionMode(ActionMode mode) {
      }

      public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        return false;
      }

      public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        return false;
      }
    });
于 2019-08-03T23:00:06.490 に答える
3

https://github.com/neopixl/PixlUIEditTextwith a メソッドを提供します

myEditText.disableCopyAndPaste().

そして、それは古いAPIで動作します

于 2013-11-14T16:28:32.323 に答える
3

私はKotlin言語で拡張機能を追加しました:

fun EditText.disableTextSelection() {
    this.setCustomSelectionActionModeCallback(object : android.view.ActionMode.Callback {
        override fun onActionItemClicked(mode: android.view.ActionMode?, item: MenuItem?): Boolean {
            return false
        }
        override fun onCreateActionMode(mode: android.view.ActionMode?, menu: Menu?): Boolean {
            return false
        }
        override fun onPrepareActionMode(mode: android.view.ActionMode?, menu: Menu?): Boolean {
            return false
        }
        override fun onDestroyActionMode(mode: android.view.ActionMode?) {
        }
    })
}

次のように使用できます。

edit_text.disableTextSelection()

xml の行の下にも追加されました:

                android:longClickable="false"
                android:textIsSelectable="false"
于 2020-06-10T06:56:02.130 に答える
2

@Zain Ali、あなたの答えはAPI 11で機能します。API 10でも行う方法を提案したかっただけです。そのバージョンでプロジェクト API を維持する必要があったため、2.3.3 で利用可能な機能を常に試していて、それを実行できる可能性がありました。以下のスニペットを共有しています。コードをテストしたところ、うまくいきました。緊急にこのスニペットを作成しました。できる変更があれば、コードを自由に改善してください。

// A custom TouchListener is being implemented which will clear out the focus 
// and gain the focus for the EditText, in few milliseconds so the selection 
// will be cleared and hence the copy paste option wil not pop up.
// the respective EditText should be set with this listener 
// tmpEditText.setOnTouchListener(new MyTouchListener(tmpEditText, tmpImm));

public class MyTouchListener implements View.OnTouchListener {

    long click = 0;
    EditText mEtView;
    InputMethodManager imm;

    public MyTouchListener(EditText etView, InputMethodManager im) {
        mEtView = etView;
        imm = im;
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            long curr = System.currentTimeMillis();
            if (click !=0 && ( curr - click) < 30) {

                mEtView.setSelected(false);
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mEtView.setSelected(true);
                        mEtView.requestFocusFromTouch();
                        imm.showSoftInput(mEtView, InputMethodManager.RESULT_SHOWN);
                    }
                },25);

            return true;
            }
            else {
                if (click == 0)
                    click = curr;
                else
                    click = 0;
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mEtView.requestFocusFromTouch();
                        mEtView.requestFocusFromTouch();
                        imm.showSoftInput(mEtView, InputMethodManager.RESULT_SHOWN);
                    }
                },25);
            return true;
            }

        } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
            mEtView.setSelected(false);
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    mEtView.setSelected(true);
                    mEtView.requestFocusFromTouch();
                    mEtView.requestFocusFromTouch();
                    imm.showSoftInput(mEtView, InputMethodManager.RESULT_SHOWN);
                }
            },25);
            return true;
        }
        return false;
    }
于 2012-10-12T14:29:27.053 に答える
1

クリップボードを読み取り、入力と入力が「入力」された時間を確認します。クリップボードに同じテキストがあり、速度が速すぎる場合は、貼り付けた入力を削除します。

于 2011-11-14T08:33:38.050 に答える
0
 editText.apply {
        setOnTouchListener { v, event ->
               if (event.action == KeyEvent.ACTION_DOWN) {
                      requestFocus()
                      setSelection(text.toString().length)
                      showKeyboard()
                      return@setOnTouchListener true
               }
        }
 }

fun View.showKeyboard() {
        val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.showSoftInput(this, 0)
 }
于 2021-10-03T21:00:13.233 に答える
0

不要な文字の入力を避けるために入力フィルターを作成すると、そのような文字を編集テキストに貼り付けても効果がないことがわかりました。したがって、この種の私の問題も解決します。

于 2011-11-23T03:54:11.847 に答える
-1

GnrlKnowledgeと同様に、クリップボードをクリアできます

http://developer.android.com/reference/android/text/ClipboardManager.html

必要に応じて、クリップボードにテキストを保存し、onDestroyで再度設定できます。

于 2011-11-23T02:16:03.313 に答える