android edittext handler 刷新,android - EditText: Disable Paste/Replace menu pop-up on Text Selection ...

Solution: Override isSuggestionsEnabled and canPaste in EditText.

For the quick solution, copy the class below - this class overrides the EditText class, and blocks all events accordingly.

For the gritty details, keep reading.

The solution lies in preventing PASTE/REPLACE menu from appearing in the show() method of the (non-documented) android.widget.Editor class. Before the menu appears, a check is done to if (!canPaste && !canSuggest) return;. The two methods that are used as the basis to set these variables are both in the EditText class:

isSuggestionsEnabled() is public, and may thus be overridden.

canPaste() is not, and thus must be hidden by introducing a function of the same name in the derived class.

So incorporating these updates into a class that also has the setCustomSelectionActionModeCallback, and the disabled long-click, here is the full class to prevent all editing (but still display the text selection handler) for controlling the cursor:

package com.cjbs.widgets;

import android.content.Context;

import android.util.AttributeSet;

import android.view.ActionMode;

import android.view.Menu;

import android.view.MenuItem;

import android.widget.EditText;

/**

* This is a thin veneer over EditText, with copy/paste/spell-check removed.

*/

public class NoMenuEditText extends EditText

{

private final Context context;

/** This is a replacement method for the base TextView class' method of the same name. This

* method is used in hidden class android.widget.Editor to determine whether the PASTE/REPLACE popup

* appears when triggered from the text insertion handle. Returning false forces this window

* to never appear.

* @return false

*/

boolean canPaste()

{

return false;

}

/** This is a replacement method for the base TextView class' method of the same name. This method

* is used in hidden class android.widget.Editor to determine whether the PASTE/REPLACE popup

* appears when triggered from the text insertion handle. Returning false forces this window

* to never appear.

* @return false

*/

@Override

public boolean isSuggestionsEnabled()

{

return false;

}

public NoMenuEditText(Context context)

{

super(context);

this.context = context;

init();

}

public NoMenuEditText(Context context, AttributeSet attrs)

{

super(context, attrs);

this.context = context;

init();

}

public NoMenuEditText(Context context, AttributeSet attrs, int defStyle)

{

super(context, attrs, defStyle);

this.context = context;

init();

}

private void init()

{

this.setCustomSelectionActionModeCallback(new ActionModeCallbackInterceptor());

this.setLongClickable(false);

}

/**

* Prevents the action bar (top horizontal bar with cut, copy, paste, etc.) from appearing

* by intercepting the callback that would cause it to be created, and returning false.

*/

private class ActionModeCallbackInterceptor implements ActionMode.Callback

{

private final String TAG = NoMenuEditText.class.getSimpleName();

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

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

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

public void onDestroyActionMode(ActionMode mode) {}

}

}

I've tested this in Android v4.4.2 and v4.4.3.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值