4

EditText にテキストを貼り付けると、空白/スペースが自動的に挿入されることがあります。たとえば、テキスト フィールドに既に含まれているテキストの途中または最後にテキストが貼り付けられた場合に、これが発生します。EditText オブジェクトまたは ClipboardManager に、先頭と末尾の空白を自動的に挿入しないように指示する方法はありますか?

4

4 に答える 4

0

InputFilter を使用する前に「スペース」を防ぐ必要があったので、それを使用します。

    mSearchText.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View view, int i, KeyEvent keyEvent) {
            MyLog.d(this, keyEvent);
            if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_SPACE) {
                switch (keyEvent.getAction()) {
                    case KeyEvent.ACTION_DOWN:
                        mSpacePressed = true;
                        break;
                    case KeyEvent.ACTION_UP:
                        mSpacePressed = false;
                }
            }
            return false;
        }
    });

    InputFilter mSearchFilter = new InputFilter() {
        @Override
        public CharSequence filter(CharSequence arg0, int arg1, int arg2, Spanned arg3, int arg4, int arg5)
        {
            //Prevent adding spaces on Paste
            //Remember: if you want paste " " it will be prevented
            if (arg0.toString().equals(" ")){
                if (!mSpacePressed){
                    return "";
                }
            }

            //do work with filter

            return null;
        }
    };
    mSearchText.setFilters(new InputFilter[]{mSearchFilter});
于 2015-09-09T08:55:51.363 に答える
0

遅くなりましたが、私の古いタブレットでは、EditText もあなたが言ったように機能します。

ということで、以下のように修正しました。

1.開始インデックスと挿入文字列の長さに関する情報を格納するクラスを作成します。

public class PasteUnit {
    int start = 0;
    int length = 0;

    public PasteUnit(int start, int length) {
        this.start = start;
        this.length = length;
    }
}

2.EditText を拡張するクラスを作成します。

public class MyEditText extends EditText
{
    boolean pasteStarted = false;
    ArrayList<PasteUnit> pasteUnits = new ArrayList<>();

    public MyEditText(Context context)
    {
        super(context);
    }

    public MyEditText(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public MyEditText(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean onTextContextMenuItem(int id) {
        if(id==android.R.id.paste) {//This is called when the paste is triggered
            pasteStarted = true;
        }

        boolean consumed = super.onTextContextMenuItem(id);
        //the super.onTextContextMenuItem(id) processes the pasted string.
        //This is where EditText acts weird.
        //And we can watch what is happening in our TextWatcher to be added below

        switch (id){
            case android.R.id.paste://This is called after we collected all the information

                if(pasteUnits.size()>1) {//When a space or spaces are inserted
                    int startIndex = pasteUnits.get(0).start;
                    int totalLength = 0;
                    for(int i=0;i<pasteUnits.size();i++) {
                        PasteUnit pasteUnit = pasteUnits.get(i);
                        totalLength = totalLength + pasteUnit.length;
                    }
                    int endIndex = startIndex + totalLength;

                    String string = this.getText().toString();
                    String before = string.substring(0, startIndex);
                    String after = string.substring(endIndex);

                    PasteUnit lastPasteUnit = pasteUnits.get(pasteUnits.size()-1);
                    String lastString = string.substring(lastPasteUnit.start, lastPasteUnit.start + lastPasteUnit.length);

                    String result = before + lastString + after;
                    this.setText(result);
                    this.setSelection(startIndex + lastString.length());
                }
                pasteUnits.clear();
                pasteStarted = false;
                break;
            case android.R.id.copy:
                break;
            case android.R.id.cut:
                break;
        }
        return consumed;
    }
}

3. EditText に TextWatcher を追加します。

古い EditText は、TextWatcher を見ると非常に奇妙な動作をします。文字列 A を文字列 B に貼り付けると、最初に文字列 B にスペースが挿入され、文字列 B に別のスペースが挿入され、最後に 2 つのスペースの間に文字列 A が挿入されます。

また、文字列 B の後に文字列 A を貼り付けるような他の状況では、最初に文字列 B の後にスペースを追加し、その後に文字列 A を追加します。

とにかく、最後のステップで元の文字列を挿入するようです。

   MyEditText edit = (MyEditText) findViewById(R.id.mainEditText1);

   edit.addTextChangedListener(new TextWatcher() {

            public void afterTextChanged(Editable s) {
            }

            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            public void onTextChanged(CharSequence s, int start, int before, int count) {

                if(edit.pasteStarted) {//when it is processing what we pasted
                    edit.pasteUnits.add(new PasteUnit(start, count));
                   //store the information about the inserted spaces and the original pasted string
                }
            }
        });
于 2017-12-05T06:02:47.270 に答える
0

これは Android のバグです。このイシュー レポートを確認してください

5で直りました。

于 2015-02-21T05:57:57.313 に答える