【问题标题】:How to set clickablespan on a Textview in RecyclerView如何在 RecyclerView 中的 Textview 上设置 clickablespan
【发布时间】:2016-12-11 03:40:28
【问题描述】:

我有带有textvies的recyclerviwq,textview中的文本有urlss,我想在textview上设置clickablespan并捕获url。

我正在使用这个accepted answer,但它不起作用。

这是我的代码:

    public class LibAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private Context mContext;
    private List<LibItem> mLibItemList;

    private final int HEAD_VIEW = 0;
    private final int LIB_VIEW = 1;

    public LibAdapter(List<LibItem> libItems, Context context) {
        super();
        this.mLibItemList = libItems;
        this.mContext = context;
    }

    @Override
    public int getItemViewType(int position) {
        if (isPositionItem(position)) {
            return HEAD_VIEW;
        }
        return LIB_VIEW;
    }

    private boolean isPositionItem(int position) {
        return position == 0;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == LIB_VIEW) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.library_item, parent, false);
            return new LibHolder(view);
        } else  if (viewType == HEAD_VIEW) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.about_hedaer, parent, false);
            return  new HeadHolder(view);
        }
        return null;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof LibHolder) {
            final LibItem libItem = mLibItemList.get(position);
            ((LibHolder) holder).libName.setText(libItem.getLibName());
            ((LibHolder) holder).libCopy.setText(Html.fromHtml(libItem.getLibCopy()));
            ((LibHolder) holder).libLic.setText(mContext.getString(R.string.proj_license));

            setTextViewHTML(((LibHolder) holder).libWeb, mContext.getString(R.string.proj_code, libItem.getLibWebs()));
            ((LibHolder) holder).libLic.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.d("LibAdapter", "License of " + libItem.getLibName() + "clicked");
                }
            });
        } else if (holder instanceof HeadHolder){
            String versionCode = BuildConfig.VERSION_NAME;
            ((HeadHolder) holder).abtVersion.setText(mContext.getString(R.string.app_version, versionCode));
        }
    }

    protected void makeLinkClickable(SpannableStringBuilder strBuilder, final URLSpan span)
    {
        int start = strBuilder.getSpanStart(span);
        int end = strBuilder.getSpanEnd(span);
        int flags = strBuilder.getSpanFlags(span);
        ClickableSpan clickable = new ClickableSpan() {
            public void onClick(View view) {
                Log.d("LipAdapter", span.getURL());
            }
        };
        strBuilder.setSpan(clickable, start, end, flags);
        strBuilder.removeSpan(span);
    }

    protected void setTextViewHTML(TextView text, String html)
    {
        CharSequence sequence = Html.fromHtml(html);
        SpannableStringBuilder strBuilder = new SpannableStringBuilder(sequence);
        URLSpan[] urls = strBuilder.getSpans(0, sequence.length(), URLSpan.class);
        for(URLSpan span : urls) {
            makeLinkClickable(strBuilder, span);
        }
        text.setText(strBuilder);
        text.setMovementMethod(LinkMovementMethod.getInstance());
    }



    @Override
    public int getItemCount() {
        return mLibItemList.size();
    }

    public class LibHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.lib_name) TextView libName;
        @BindView(R.id.lib_website) TextView libWeb;
        @BindView(R.id.lib_copyright) TextView libCopy;
        @BindView(R.id.lib_license) TextView libLic;

        public LibHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }

    public class  HeadHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.abt_version) TextView abtVersion;

        public HeadHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }
}

文本设置得很好,但链接被拒绝点击。 请问你有解决办法吗?

【问题讨论】:

  • 你得到答案了吗?
  • 不,我没有得到答案

标签: android clickablespan


【解决方案1】:

你在尝试这个 ::

  protected void makeLinkClickable(SpannableStringBuilder strBuilder, final URLSpan span)
{
    int start = strBuilder.getSpanStart(span);
    int end = strBuilder.getSpanEnd(span);
    int flags = strBuilder.getSpanFlags(span);
    ClickableSpan clickable = new ClickableSpan() {
        public void onClick(View view) {
            Log.d("LipAdapter", span.getURL());
        }
    };
    strBuilder.setSpan(clickable, start, end, flags);
    strBuilder.removeSpan(span);
}

但是你需要做这样的事情::

protected void makeLinkClickable(SpannableStringBuilder strBuilder, final URLSpan span)
{
    int start = strBuilder.getSpanStart(span);
    int end = strBuilder.getSpanEnd(span);
    int flags = strBuilder.getSpanFlags(span);


    ClickableSpan clickable = new ClickableSpan() {
        @Override
        public void onClick(View widget) {
            Log.d("LipAdapter", span.getURL());
        }

        @Override
        public void updateDrawState(TextPaint ds) {
            super.updateDrawState(ds);
        }
    };

    strBuilder.setSpan(clickable, start, end, flags);
    strBuilder.removeSpan(span);
}

希望它对其他人有用

【讨论】:

  • 不错的答案(是)
  • 这条线对我有用。 strBuilder.removeSpan(span);
【解决方案2】:

我遇到了同样的问题,必须将 sequence 类型转换为 Spannable 才能使其正常工作。

只需替换

SpannableStringBuilder strBuilder = new SpannableStringBuilder(sequence);

与

Spannable strBuilder = (Spannable) sequence;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多