Android Linkify.addLinks()适用于一个textview,不适用于另一种

阿隆·史莱德

我有一个聊天实现,类似于我的应用程序中的whatsapp。

在聊天中,我具有接收者状态和发送者状态。

我面临的问题是,处于发件人状态时,我发送的链接完全不可单击,尽管我为两者都执行了完全相同的代码。

这是我如何对待发件人视图持有人的方法-

private void handleMessageForSender(Message item, TxtViewHolder txtViewHolder, String time, String msg) {
        txtViewHolder.getViewSender().setVisibility(View.VISIBLE);
        txtViewHolder.getTxtChatTime().setText(time);
        txtViewHolder.getTxtChatTime().setTextColor(context.getResources()
                .getColor(R.color.color_black));
        txtViewHolder.getTxtChatTime().setVisibility(View.VISIBLE);
        txtViewHolder.getTxtChatSender().setTextColor(context.getResources()
                .getColor(R.color.color_black));

        boolean oneRowWithLink = false;

        Matcher matcher = android.util.Patterns.WEB_URL.matcher(messageDetail.getMessage() != null && (item.getRecall() == null || !item.getRecall()) && messageDetail.getMessage().contains("http") ? messageDetail.getMessage() : "");
        if (matcher.find()) {
            oneRowWithLink = true;
            String urlMessage = matcher.group(1);
            LinkPreviewModel linkPreviewModel = linkPreviewModelHashMap.get(urlMessage);
            if (linkPreviewModel != null) {
                txtViewHolder.getViewSender().setPadding(0, 0, 0, 4);
                txtViewHolder.getLinkSentLayout().setVisibility(View.VISIBLE);
                txtViewHolder.getLinkTitle().setText(linkPreviewModel.getTitle());
                txtViewHolder.getLinkTitle().setTypeface(null, Typeface.BOLD);
                txtViewHolder.getLinkMainUrl().setText(linkPreviewModel.getLinkMainUrl());

                if (linkPreviewModel.getImageUrl() != null && linkPreviewModel.getImageUrl().length() > 0) {
                    linkPreviewModelPositionsMap.put(item.getMid(), linkPreviewModel.getImageUrl());
                    MediaUtils.loadImageWithGlide(context, linkPreviewModel.getImageUrl(),
                            txtViewHolder.getLinkImageUrl(), R.drawable.ic_image_placeholder);
                } else {
                    txtViewHolder.getLinkImageUrl().setVisibility(View.GONE);
                }

                if (linkPreviewModel.getDescription() != null && linkPreviewModel.getDescription().length() > 0) {
                    txtViewHolder.getLinkDescription().setVisibility(View.VISIBLE);
                    txtViewHolder.getLinkDescription().setText(linkPreviewModel.getDescription());
                } else {
                    txtViewHolder.getLinkDescription().setVisibility(View.GONE);
                }

            } else {
                txtViewHolder.getLinkSentLayout().setVisibility(View.GONE);
                parseLink(urlMessage);
            }
        } else {
            txtViewHolder.getLinkSentLayout().setVisibility(View.GONE);
            txtViewHolder.getViewSender().setPadding(4, 4, 4, 4);
        }

        if (item.getRecall() != null && item.getRecall()) {
            displayRecallInfo(item, txtViewHolder);
        } else {
            txtViewHolder.getImgChatStatus().setVisibility(View.VISIBLE);
            txtViewHolder.getSentRecallImage().setVisibility(View.GONE);
            txtViewHolder.getTxtChatSender().setTypeface(Typeface.DEFAULT, Typeface.NORMAL);
            txtViewHolder.getTxtChatSender().setTextKeepState(getHtmlChatMessageText(msg));
            Linkify.addLinks(txtViewHolder.getTxtChatReceiver(), Linkify.WEB_URLS | Linkify.EMAIL_ADDRESSES | Linkify.PHONE_NUMBERS);
            chatMessageUtils.setRecentChatStatus(txtViewHolder.getImgChatStatus(), item.getStatus());
            new TextReplyViewUtils().showSenderReplyWindow(txtViewHolder, item, context);

            txtViewHolder.getTxtChatSender().measure(0, 0);
            if (!oneRowWithLink && txtViewHolder.getTxtChatSender().getMeasuredWidth() < (SCREEN_WIDTH * 70) / 100 && txtViewHolder.getTxtChatSender().getLineCount() == 1 && TextUtils.isEmpty(item.getReplyTo())) {
                //set time layout new parameters
                txtViewHolder.getSenderTimeLayout().measure(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);
                txtViewHolder.getImageStar().measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);

                if (defaultViewSendTimeWidth == -1) {
                    defaultViewSendTimeWidth = txtViewHolder.getSenderTimeLayout().getMeasuredWidth();
                }

                FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);
                params.gravity = Gravity.BOTTOM | Gravity.END;
                params.topMargin = isHighResolutionHeight ? 25 : 15;
                txtViewHolder.getSenderTimeLayout().setLayoutParams(params);

                int fixedWidth = (item.getFavourite() != null && item.getFavourite()) ? txtViewHolder.getSenderTimeLayout().getMeasuredWidth() : defaultViewSendTimeWidth - 20;
                LinearLayout.LayoutParams params1 = new LinearLayout.LayoutParams(txtViewHolder.getTxtChatSender().getMeasuredWidth() + fixedWidth,
                        LinearLayout.LayoutParams.WRAP_CONTENT);
                txtViewHolder.getTxtChatSender().setLayoutParams(params1);

                // if one row, set always in left
                txtViewHolder.getTxtChatSender().setGravity(Gravity.LEFT);


                //reduce margin bottom to txt view(because space..)
                FrameLayout.LayoutParams params2 = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT,
                        FrameLayout.LayoutParams.WRAP_CONTENT);
                params2.bottomMargin = isHighResolutionHeight ? -60 : -30;
                txtViewHolder.getViewSendLayout().setLayoutParams(params2);
            } else {
            // need this code because it is view holder that reuse layouts

                //return time layout to basic parameters
                FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);
                params.gravity = Gravity.BOTTOM | Gravity.END;
                txtViewHolder.getSenderTimeLayout().setLayoutParams(params);

                //return chat text view to basic parameters
                LinearLayout.LayoutParams params1 = new LinearLayout.LayoutParams(TextUtils.isEmpty(item.getReplyTo()) ? LinearLayout.LayoutParams.WRAP_CONTENT :
                        LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
                txtViewHolder.getTxtChatSender().setLayoutParams(params1);

                if (checkRtl(txtViewHolder.getTxtChatSender().getText().toString())) {
                    txtViewHolder.getTxtChatSender().setGravity(Gravity.RIGHT);
                } else {
                    txtViewHolder.getTxtChatSender().setGravity(Gravity.LEFT);
                }


                //return view receive to basic parameters
                FrameLayout.LayoutParams params2 = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT,
                        FrameLayout.LayoutParams.WRAP_CONTENT);
                txtViewHolder.getViewSendLayout().setLayoutParams(params2);

            }

            if (forwardUtils.isSendForwardUtils(userJID, messageDetail.getCreatedBy(), item.getGroupChatSender() != null && item.getGroupChatSender().length() > 0
                    ? item.getGroupChatSender() : item.getChatUser()))
                txtViewHolder.getForwardSendLayout().setVisibility(View.VISIBLE);
            else
                txtViewHolder.getForwardSendLayout().setVisibility(View.GONE);
        }
    }

这是我如何处理接收器状态-

private void handleMessageForReceiver(Message item, TxtViewHolder txtViewHolder, String time, String msg) {
        txtViewHolder.getViewReceiver().setVisibility(View.VISIBLE);
        txtViewHolder.getTxtChatRevTime().setText(time);
        txtViewHolder.getTxtChatRevTime().setVisibility(View.VISIBLE);
        txtViewHolder.getTxtChatReceiver().setTextColor(context.getResources()
                .getColor(R.color.color_black));

        boolean oneRowWithLink = false;

        if (forwardUtils.isReceiveForwardUtils(userJID, messageDetail.getCreatedBy(), item.getGroupChatSender() != null && item.getGroupChatSender().length() > 0
                ? item.getGroupChatSender() : item.getChatUser()))
            txtViewHolder.getForwardReceiveLayout().setVisibility(View.VISIBLE);
        else
            txtViewHolder.getForwardReceiveLayout().setVisibility(View.GONE);


        Matcher matcher1 = android.util.Patterns.WEB_URL.matcher(messageDetail.getMessage() != null && (item.getRecall() == null || !item.getRecall()) && messageDetail.getMessage().contains("http") ? messageDetail.getMessage() : "");
        if (matcher1.find()) {
            oneRowWithLink = true;
            String urlMessage = matcher1.group(1);

            LinkPreviewModel linkPreviewModel = linkPreviewModelHashMap.get(urlMessage);
            if (linkPreviewModel != null) {
                //         txtViewHolder.getFullReceiveLayout().setPadding(0,0,0,4);
                txtViewHolder.getLinkRecLayout().setVisibility(View.VISIBLE);
                txtViewHolder.getLinkTitleReceive().setText(linkPreviewModel.getTitle());
                txtViewHolder.getLinkTitleReceive().setTypeface(null, Typeface.BOLD);
                txtViewHolder.getLinkMainUrlReceive().setText(linkPreviewModel.getLinkMainUrl());

                if (linkPreviewModel.getImageUrl() != null && linkPreviewModel.getImageUrl().length() > 0) {
                    linkPreviewModelPositionsMap.put(item.getMid(), linkPreviewModel.getImageUrl());
                    MediaUtils.loadImageWithGlide(context, linkPreviewModel.getImageUrl(),
                            txtViewHolder.getLinkImageUrlReceive(), R.drawable.ic_image_placeholder);
                } else {
                    txtViewHolder.getLinkImageUrlReceive().setVisibility(View.GONE);
                }

                if (linkPreviewModel.getDescription() != null && linkPreviewModel.getDescription().length() > 0) {
                    txtViewHolder.getLinkDescriptionReceive().setVisibility(View.VISIBLE);
                    txtViewHolder.getLinkDescriptionReceive().setText(linkPreviewModel.getDescription());
                } else {
                    txtViewHolder.getLinkDescriptionReceive().setVisibility(View.GONE);
                }
            } else {
                txtViewHolder.getLinkRecLayout().setVisibility(View.GONE);
                parseLink(urlMessage);
            }
        } else {
            txtViewHolder.getLinkRecLayout().setVisibility(View.GONE);
            //   txtViewHolder.getFullReceiveLayout().setPadding(6,6,6,6);
        }

        if (item.getRecall() != null && item.getRecall()) {
            displayRecallInfo(item, txtViewHolder);
        } else {
            txtViewHolder.getReceivedRecallImage().setVisibility(View.GONE);
            txtViewHolder.getTxtChatReceiver().setTypeface(Typeface.DEFAULT,
                    Typeface.NORMAL);
            txtViewHolder.getTxtChatReceiver().setTextKeepState(getHtmlChatMessageText
                    (msg));

            Linkify.addLinks(txtViewHolder.getTxtChatReceiver(), Linkify.WEB_URLS | Linkify.EMAIL_ADDRESSES | Linkify.PHONE_NUMBERS);
            chatMessageUtils.setRecentChatStatus(txtViewHolder.getImgChatStatus(),
                    item.getStatus());
            new TextReplyViewUtils().showReceiverReplyWindow(txtViewHolder, item, context);
        }

        txtViewHolder.getTxtChatReceiver().measure(0, 0);
        if (!oneRowWithLink && txtViewHolder.getTxtChatReceiver().getMeasuredWidth() < (SCREEN_WIDTH * 70) / 100 && txtViewHolder.getTxtChatReceiver().getLineCount() == 1 && TextUtils.isEmpty(item.getReplyTo())) {
            txtViewHolder.getReceiverTimeLayout().measure(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);
            txtViewHolder.getImgReceivedStar().measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);

            if (defaultViewRecTimeWidth == -1) {
                defaultViewRecTimeWidth = txtViewHolder.getReceiverTimeLayout().getMeasuredWidth();
            }

            //set time layout new parameters
            FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);
            params.gravity = Gravity.BOTTOM | Gravity.END;
            params.topMargin = isHighResolutionHeight ? 40 : 25;
            txtViewHolder.getReceiverTimeLayout().setLayoutParams(params);

            //set new width to txt view(because time layout go up..)
            int fixedWidth = (item.getFavourite() != null && item.getFavourite()) ? txtViewHolder.getReceiverTimeLayout().getMeasuredWidth() : defaultViewRecTimeWidth - 10;

            LinearLayout.LayoutParams params1 = new LinearLayout.LayoutParams(txtViewHolder.getTxtChatReceiver().getMeasuredWidth() + fixedWidth,
                    LinearLayout.LayoutParams.WRAP_CONTENT);
            txtViewHolder.getTxtChatReceiver().setLayoutParams(params1);

            // if one row, set always in left
            txtViewHolder.getTxtChatReceiver().setGravity(Gravity.LEFT);

            //reduce margin bottom to txt view(because space..)
            FrameLayout.LayoutParams params2 = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT,
                    FrameLayout.LayoutParams.WRAP_CONTENT);
            params2.bottomMargin = isHighResolutionHeight ? -60 : -30;
            txtViewHolder.getViewReceiveLayout().setLayoutParams(params2);

        }
        // need this code because it is view holder that reuse layouts
        else {
            //return time layout to basic parameters
            FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);
            params.gravity = Gravity.BOTTOM | Gravity.END;
            txtViewHolder.getReceiverTimeLayout().setLayoutParams(params);

            //return chat text view to basic parameters
            LinearLayout.LayoutParams params1 = new LinearLayout.LayoutParams(TextUtils.isEmpty(item.getReplyTo()) ? LinearLayout.LayoutParams.WRAP_CONTENT :
                    LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
            txtViewHolder.getTxtChatReceiver().setLayoutParams(params1);

            // check if is trl language
            if (checkRtl(txtViewHolder.getTxtChatReceiver().getText().toString())) {
                txtViewHolder.getTxtChatReceiver().setGravity(Gravity.RIGHT);
            } else {
                txtViewHolder.getTxtChatReceiver().setGravity(Gravity.LEFT);
            }

            //return view receive to basic parameters
            FrameLayout.LayoutParams params2 = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT,
                    FrameLayout.LayoutParams.WRAP_CONTENT);
            txtViewHolder.getViewReceiveLayout().setLayoutParams(params2);
        }
    }

我发现的线索可能会帮助我找到解决方案,它是以下几行-

Linkify.addLinks(txtViewHolder.getTxtChatReceiver(), Linkify.WEB_URLS | Linkify.EMAIL_ADDRESSES | Linkify.PHONE_NUMBERS);

作为接收者,我在此行上为true,而作为发送者,我为false-这意味着它不能将我的字符串作为URL。

我在这里想念什么吗?

阿隆·史莱德

固定-我getTxtChatReceiver以发送方和接收方的身份两次致电

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Open Activity with Linkify Android

来自分类Dev

Android Espresso和Linkify

来自分类Dev

Android Espresso和Linkify

来自分类Dev

Android版式-适用于所有屏幕尺寸的一种版式吗?

来自分类Dev

Android版式-适用于所有屏幕尺寸的一种版式吗?

来自分类Dev

PHP / XML路由适用于一种路由,不适用于另一种路由

来自分类Dev

case_when 适用于一种情况,而不适用于另一种情况

来自分类Dev

getLeft()在Android中不适用于TextView

来自分类Dev

使用android:textIsSelectable =“ true”复制文本不适用于android中同一textview上的onClicklistner

来自分类常见问题

适用于一个项目的Android Studio多Windows

来自分类Dev

Android 上的 Google Sign In 仅适用于我的一个帐户

来自分类Dev

onCheckedChangeListener不适用于Android Studio

来自分类Dev

UtteranceProgressListener不适用于Android TTS

来自分类Dev

ListView onItemClickListener不适用于Android

来自分类Dev

setOnTouchListener不适用于android Fragment

来自分类Dev

findFirstVisibleItemPositions不适用于recycleview android

来自分类Dev

Xamarin部署不适用于Android

来自分类Dev

Android <include>不适用于ViewBinding

来自分类Dev

Android主题不适用于活动

来自分类Dev

Android SImpleDateFormat不适用于“ yyyy -...”

来自分类Dev

Android setText不适用于scrollview

来自分类Dev

Android Clickable不适用于ListView

来自分类Dev

setOnTouchListener不适用于android Fragment

来自分类Dev

onClick事件不适用于Android

来自分类Dev

setOnEditorActionListener不适用于android kitkat

来自分类Dev

Android:if语句不适用于.isPlaying()

来自分类Dev

唤醒锁不适用于 Android

来自分类Dev

FreshMvvm - PopPageModel 不适用于 Android

来自分类Dev

通知不适用于变量 (Android)

Related 相关文章

热门标签

归档