Android 仿小红书话题功能

        最近公司开始做社区功能,需要输入#号后,服务器模糊查询话题,查看网上代码,始终跟预想中的有些出入,好久没有写自定义控件了,这里边写边记录,方便给需要使用的人,提供一个记录。难点就是EditText中操作话题的逻辑了

参考链接       

        先看目前暂时实现的效果,已经完成90%的功能了

        

功能如下:

        1.输入#号后,我这里底部隐藏了一个布局(里面展示服务器返回模糊搜索结果),通过删除和输入#来控制隐藏

        2.输入后,话题字体变色

        3.支持多个话题,当移动到话题部分, 自动弹框服务器返回模糊搜索结果

目前论坛上提供的思路,差不多,这里主要是细节分享

        1.android 键盘有中英文#。正则需要修改[\#|#]

        2.有一个功能,是选中全部删除,如果业务需要实时更新模糊输入结果,这里可不需要

        3.滑动到某一个话题时,重新弹框展示服务器返回结果

      

思路代码

一、找到话题

private final String inputReg = "([\\#|#][\u4e00-\u9fa5a-zA-Z]+\\d{0,100})";

  封装一个实体类保存     

public class TopicBean {

    private String topicRule = "#";// 匹配规则
    private String topicText;// 高亮文本

    public int start;
    public int end;

}

   如果使用,来匹配满足条件即为一个话题。监听addTextChangedListener事件:

   this.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            }

            @Override
            public void afterTextChanged(Editable editablede) {
                Editable editable = getText();
                int length = editablede.toString().length();

                //赋值话题列表数据
                Matcher matcher = pattern.matcher(editable);

                mTopicList.clear();

                while (matcher.find()) {
                    TopicBean tObject = new TopicBean();
                    tObject.setTopicText(editable.toString().substring(matcher.start(), matcher.end()).trim());
                    tObject.start = matcher.start();
                    tObject.end = matcher.end();
                    mTopicList.add(tObject);
                }

                //记录上一次的长度
                preTextLength = length;

                //刷新页面
                refreshEditTextUI(editable.toString());
            }
        });

这里的逻辑,其实还比较简单,while循环,找出所有文本中,符合话题#号后的字,存放在List集合中

二、话题变色

        通过刷新方法refreshEditTextUI()我们来改变颜色

        

private void refreshEditTextUI(String content) {

        /*
         * 重新设置span
         */
        Editable editable = getText();
        int textLength = editable.length();

        int findPosition = 0;
        if (mTopicList != null && mTopicList.size() > 0) {
            for (int i = 0; i < mTopicList.size(); i++) {
                final TopicBean object = mTopicList.get(i);
                // 文本
                String objectText = object.getTopicText();
                while (findPosition <= textLength) {
                    // 获取文本开始下标
                    findPosition = content.indexOf(objectText, findPosition);
                    if (findPosition != -1) {
                        // 设置话题内容前景色高亮
                        ForegroundColorSpan colorSpan = new ForegroundColorSpan(mForegroundColor);
                        editable.setSpan(colorSpan, findPosition, findPosition + objectText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                        findPosition += objectText.length();
                    } else {
                        break;
                    }
                }

            }
        }

    }

这块代码我就直接引用原作者代码片段了,这里ForegroundColorSpan就是改变颜色的

三、如果找到#标识

        EditText中可以选择当前的光标位置,所以我们要重写onSelectionChanged这个方法,这个是当前光标移动的方法

        1.如何知道用户输入了什么

char charAt = getText().toString().charAt(selEnd - 1);

        所以通过以上可以确定2个事件,一个是#开始,一个结束(结束可以已除中文数字外,其余都算结束)

        这里我临时测试写了一份,可以替换成正则实现:

        

 if (value.equals("#") || value.equals("#")) {
                Log.e("测试代码","onSelectionChanged 检查到光标前一位是 # 或者# 当前位置是" + selEnd);
                mStartSymbolPosition = selEnd - 1;
                if (mListener != null) {
                    mListener.onUserInputStart(selEnd);
                }
                return;
            } else if (value.equals(" ") || value.equals("\n")) {
                Log.e("测试代码","onSelectionChanged 最后一位状态");
                mLastSymbolPosition = selEnd;
                if (mListener != null) {
                    mListener.onUserInputEnd(selEnd);
                }
                mStartSymbolPosition = 0;
                mLastSymbolPosition = 0;
            } else if (mStartSymbolPosition >= selEnd) {
                Log.e("测试代码","onSelectionChanged 用户做了删除动作并且删除到#号了 ");
                if (mListener != null) {
                    mListener.onUserInputEnd(selEnd);
                }
            }

  四、支持多个话题监听

            这里还有一个场景,如果一个文章里有3个话题,那么如何做到,滑动到话题,我们就弹出话题模糊搜索呢,这里就需要在光标移动的时候做处理了。判定坐标,在某一个话题位置范围内。代码如下:

 if (mTopicList != null) {
            for (int i = 0; i < mTopicList.size(); i++) {
                Log.e(TAG, "onSelectionChanged  = " + mTopicList.get(i));
                if (selEnd  == mTopicList.get(i).getEnd()) {
                    //表示用户回到了话题最后的位置,我们又要进入输入模式
                    if (mListener != null) {
                        mListener.onUserInputStart(mTopicList.get(i).getStart());
                    }
                    mStartSymbolPosition =  mTopicList.get(i).getStart();
                    mLastSymbolPosition = mTopicList.get(i).getEnd();
                }
                if (selEnd  > mTopicList.get(i).getEnd()) {
                    if (mListener != null) {
                        mListener.onUserInputEnd(mTopicList.get(i).getEnd());
                    }
                }
            }
        }

逻辑也比较简单,光标等于其中一个光标时,我就展示弹框,表示用户正在输入。反之隐藏

到这里,就可以完成小红书功能啦~细节部分需要修改。

       

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
<h3>回答1:</h3><br/>要使用Android Studio仿小红书应用程序,您需要具备以下技能和知识: 1. Java编程语言:Java是Android应用程序的主要编程语言,您需要掌握Java语言的基础知识和高级特性。 2. Android SDK:Android SDK是开发Android应用程序所需的工具和库。您需要掌握使用Android SDK构建应用程序的技能,包括使用XML和Java编写应用程序布局、编写代码逻辑和处理用户输入。 3. Android Studio:Android Studio是用于开发Android应用程序的IDE。您需要了解如何使用Android Studio创建新项目、编写代码、调试应用程序并生成APK文件。 4. 数据库设计:小红书应用程序涉及到大量的用户生成内容,因此您需要掌握基本的数据库设计知识,如使用SQLite或其他数据库管理系统来存储和管理数据。 5. 用户界面设计:小红书应用程序具有独特的用户界面设计,包括动画效果、卡片式布局和精美的图像设计。您需要了解如何使用XML和Java实现这些界面元素。 6. 前端技术小红书应用程序的前端技术包括HTML、CSS和JavaScript。您需要了解这些技术以便构建小红书应用程序的Web视图。 7. 后端技术小红书应用程序还涉及到后端技术,如REST API和服务器端编程。您需要了解如何使用这些技术来实现小红书应用程序的服务器端功能。 以上是开发仿小红书应用程序所需的技能和知识。需要不断学习和实践,才能成为一个优秀的Android开发者。 <h3>回答2:</h3><br/>说到仿小红书,我们首先想到的是什么?模仿小红书APP的UI设计、数据存储方式以及交互方式,那么我们应该如何在Android Studio中实现仿小红书的APP呢? 1.设计界面 首先你需要了解到小红书的UI设计,然后在Android Studio中根据设计稿使用XML实现iOS版小红书的UI界面。也可以使用一些实现富文本、瀑布流等效果的第三方库,它们会更方便你的实现。 2.数据存储 小红书的数据量非常大,它的数据存储一定非常复杂。你可以使用SQLite数据库来实现文本存储,使用媒体数据库来实现图片和视频的存储。这些数据库比较常用,使用它们可以更方便的将数据存储到本地。 3.交互 小红书的交互特征主要是采用物理滑动的方式来实现浏览偏好的美妆范围的功能。所以如何对用户输入进行操作也是本APP的一个非常重要的特征。我们可以使用通用的手势库来实现诸如下滑刷新、上滑查看更多、详情页面下拉放大等常用的交互特征。 总之,仿小红书APP并不容易,但是在Android Studio里,我们可以通过界面美观、数据存储、交互方式来实现。当然,这需要花费大量的时间和精力,你也可以选择一些优秀的开源APP进行学习借鉴。 <h3>回答3:</h3><br/>Android Studio是一个非常流行的Android应用程序开发工具,能够帮助程序员快速开发各种类型的Android应用程序。而仿小红书的应用程序,则需要充分利用Android Studio提供的各种工具和功能,以便实现类似小红书功能和用户体验。 首先,开发人员需要确保应用程序实现了类似小红书的基本功能,例如用户注册、登录、创建账号和发布信息等功能。此外,用户可以通过浏览、点赞、收藏、评论和分享等交互方式来与其他用户互动。 其次,Android Studio提供了许多有用的布局和UI控件,例如RecyclerView、CardView、BottomNavigationView和Material Design组件等。这些布局和控件可用于构建美观、易于使用和响应性强的用户界面。 第三,数据存储和管理是构建类似小红书的应用程序的另一个关键方面。 Android Studio支持使用SQLite、Room和Firebase等数据存储方案,这些方案可以使开发人员轻松地管理和存储应用程序的数据。 最后,开发人员还需要考虑应用程序的性能和安全性。在构建应用程序时,必须考虑到内存使用率、CPU利用率和网络通信速度等因素。此外,应用程序还需要采取必要的安全措施,例如数据加密和用户身份验证,以保护用户和应用程序的敏感信息。 总之,使用Android Studio仿小红书需要开发人员充分利用该工具的各种功能和工具,并在数据管理、用户体验、性能和安全性方面进行适当的考虑。通过正确地使用这些工具和技术,开发人员可以构建出功能完善的类似小红书的应用程序。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值