【问题标题】:EditText giving error : TextView does not support text selection. Selection cancelledEditText 给出错误:TextView 不支持文本选择。选择已取消
【发布时间】:2017-01-14 18:41:35
【问题描述】:

我有 RecyclerView。位置为 0 的元素是 EditText 的标题,然后所有其他元素都是图像。长按 EditText 它会提供选项粘贴。这工作正常。 但是,当我将回收站视图滚动到底部并再次回到顶部并长按时,它不会显示粘贴选项并给出错误。 在滚动到底部并再次到达顶部传递调用onBindViewHolder

TextView: TextView 不支持文本选择。选择已取消。

public class Someclass extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements View.OnClickListener {


    private static final int TYPE_EDIT = 0;
    private static final int TYPE_IMAGE = 1;
    List<String> msomelist = new ArrayList<String>();

    public void someMethod(List<String> somelist) {

        msomelist.clear();
        msomelist.addAll(somelist);
        notifyDataSetChanged();

    }




    public Someclass(Activity activity, List<String> somelist) {
        this.activity = activity;
        this.msomelist.clear();
        this.msomelist.addAll(somelist);
        mContext = activity;
    }

    @Override
    public int getItemViewType(int position) {

        if (position == 0)
            return TYPE_EDIT;

        return TYPE_IMAGE;
    }

    @Override
    public void onClick(View view) {
        int postition = (int) view.getTag();
        msomelist.remove(postition);
        notifyDataSetChanged();

    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
       ImageView img;

        public ViewHolder(View itemView) {
            super(itemView);

            img = (ImageView) itemView.findViewById(R.id.image);
        }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == TYPE_IMAGE) {
            View view = LayoutInflater.from(mContext)
                    .inflate(somelayout, false);
            ViewHolder holder = new ViewHolder(view);
            return holder;
        } else {
            View view = LayoutInflater.from(mContext)
                    .inflate(someotherlayout, false);


            return new OtherHolder(view);
        }
    }

    class OtherHolder extends RecyclerView.ViewHolder {
        EditText editText;

        public OtherHolder(View itemView) {
            super(itemView);
            editText = (EditText) itemView.findViewById(R.id.ediItext);
            editText.requestFocus();
        }
    }

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {

        if (holder instanceof ViewHolder) {
            some function.....
        } else if (holder instanceof OtherHolder) {
            some function
        }
    }
}

【问题讨论】:

  • 请发布您的代码!
  • 也加入您的适配器和行的布局代码和标题。判断错误
  • 完成..我可以找到针对相同但没有解决方案提出的各种问题。

标签: android


【解决方案1】:

这是a known bug in the Android platform。起初我不相信,但发布的代码@user2246055 是一种有效的解决方法!

我更喜欢在我的适配器中添加它而不是继承 TextView:

        @Override
        public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) {
            super.onViewAttachedToWindow(holder);

            // Bug workaround for losing text selection ability, see:
            // https://code.google.com/p/android/issues/detail?id=208169
            holder.textView.setEnabled(false);
            holder.textView.setEnabled(true);
        }

【讨论】:

  • 非常感谢!我遇到了同样的问题,您的解决方案帮助了我。 (顺便说一句,在 Android 7.1 上)
  • 您能详细说明一下吗?你在哪里添加它?你覆盖什么类?以及如何在代码中使用该类?
【解决方案2】:

使用以下MyEditText.java 可以解决您的问题:

public class MyEditText extends EditText {
private boolean mEnabled; // is this edittext enabled

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
protected void onAttachedToWindow() {
    super.onAttachedToWindow();
    try {
        if (!mEnabled) return;
        super.setEnabled(false);
        super.setEnabled(mEnabled);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

@Override
public void setEnabled(boolean enabled) {
    this.mEnabled = enabled;
    super.setEnabled(enabled);
}}

【讨论】:

  • 实际上,我花了 3 个小时来尝试这个,因为它看起来与问题完全无关。但它确实有效!
  • 长按EditText会调用Editor.performLongClick()来显示选择弹窗。
【解决方案3】:

长按EditText会调用Editor.performLongClick()显示选择弹出窗口。

getInsertionController().show();之前

它会检查mInsertionControllerEnabled,当你使用setText()时,TextView会调用Editor.prepareCursorControllers()来重置mInsertionControllerEnabled,如下所示:

boolean windowSupportsHandles = false;

ViewGroup.LayoutParams params = mTextView.getRootView().getLayoutParams();
if (params instanceof WindowManager.LayoutParams) {
    WindowManager.LayoutParams windowParams = (WindowManager.LayoutParams) params;
    windowSupportsHandles = windowParams.type < WindowManager.LayoutParams.FIRST_SUB_WINDOW
            || windowParams.type > WindowManager.LayoutParams.LAST_SUB_WINDOW;
}

boolean enabled = windowSupportsHandles && mTextView.getLayout() != null;
mInsertionControllerEnabled = enabled && isCursorVisible();

如您所见,rootView 必须是窗口类型,否则 mInsertionControllerEnabled 将是 false

但是当你setText()onBindViewHolder()时,EditText还不是attachToWindow,所以我们应该在EditTextattachToWindow之后setEnable()强制编辑器重置mInsertionControllerEnabled值.然后选择现在可以工作了。

【讨论】:

  • mInsertionControllerEnabledisCursorVisible() 来自哪里?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
  • 2012-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多