安卓TextView 拖动命名

需求:该布局文件使用线性布局来排列三个文本视图和一个按钮,分别用于显示两个动物名称以及占位文本视图。在占位文本视图中,我们为其设置了背景和居中显示样式,并用其作为接收拖放操作的目标

效果图;

实现代码

第一布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/animalName1"
        android:text="狮子"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/animalName2"
        android:text="老虎"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/namePlaceholder"
        android:text="请将动物名字拖到这里"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@android:drawable/editbox_background_normal"
        android:gravity="center"/>

    <Button
        android:id="@+id/btnGetTexts"
        android:text="获取文本"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

实现代码

public class AttentionQuestionsActivity extends AppCompatActivity {

    // 用于存储动物名称视图和其对应的名称字符串
    private Map<View, String> nameMap = new HashMap<>();
    // 存储被拖放的文本字符串
    private ArrayList<String> draggedTexts = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_attention_questions);

        // 获取 UI 控件
        TextView animalName1 = findViewById(R.id.animalName1);
        TextView animalName2 = findViewById(R.id.animalName2);
        TextView namePlaceholder = findViewById(R.id.namePlaceholder);
        Button btnGetTexts = findViewById(R.id.btnGetTexts);

        // 将动物名称视图和其对应的字符串存储到 nameMap 中
        nameMap.put(animalName1, "狮子");
        nameMap.put(animalName2, "老虎");

        // 为每个动物名称视图设置长按监听器
        for (View view : nameMap.keySet()) {
            // 将名称字符串存储到视图的 tag 中
            view.setTag(nameMap.get(view));
            view.setOnLongClickListener(v -> {
                // 创建 ClipData 对象并启动拖放操作
                ClipData.Item item = new ClipData.Item((CharSequence) v.getTag());
                String[] mimeTypes = {ClipDescription.MIMETYPE_TEXT_PLAIN};
                ClipData data = new ClipData(v.getTag().toString(), mimeTypes, item);

                View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v);
                v.startDragAndDrop(data, shadowBuilder, null, 0);
                return true;
            });
        }

        // 设置占位文本视图的拖放监听器
        namePlaceholder.setOnDragListener((v, event) -> {
            switch (event.getAction()) {
                case DragEvent.ACTION_DROP:
                    // 获取被拖放的文本并设置到占位文本视图中
                    ClipData.Item item = event.getClipData().getItemAt(0);
                    CharSequence name = item.getText();
                    ((TextView) v).setText(name);
                    draggedTexts.add(name.toString());
                    break;
            }
            return true;
        });

        // 设置获取文本按钮的点击监听器
        btnGetTexts.setOnClickListener(v -> {
            // 将被拖放的文本字符串拼接成一个长字符串并显示到 Toast 中
            StringBuilder sb = new StringBuilder();
            for (String text : draggedTexts) {
                sb.append(text).append("\n");
            }
            Toast.makeText(AttentionQuestionsActivity.this, sb.toString(), Toast.LENGTH_LONG).show();
        });
    }
}

注意

 在这个类中,我们为每个动物名称视图设置了长按监听器,并在其中启动了拖放操作。同时,我们还为占位文本视图设置了拖放监听器,并在其中将被拖放的文本设置到该视图中。最后,当用户点击获取文本按钮时,我们将被拖放的文本字符串拼接成一个长字符串并显示到 Toast 中。以上只是简单功能实现,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/390928.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据02-数据仓库

零、文章目录 大数据02-数据仓库 1、数据仓库介绍 &#xff08;1&#xff09;基本概念 数据仓库&#xff0c;英文名称为Data Warehouse&#xff0c;可简写为DW或DWH。数据仓库的目的是构建面向分析的集成化数据环境&#xff0c;为企业提供决策支持&#xff08;Decision Sup…

牛客网SQL进阶123:高难度试卷的得分的截断平均值

官网链接&#xff1a; SQL类别高难度试卷得分的截断平均值_牛客题霸_牛客网牛客的运营同学想要查看大家在SQL类别中高难度试卷的得分情况。 请你帮她从exam_。题目来自【牛客题霸】https://www.nowcoder.com/practice/a690f76a718242fd80757115d305be45?tpId240&tqId2180…

[Android]Frida-hook环境配置

准备阶段 反编译工具:Jadx能够理解Java语言能编写小型的JavaScript代码连接工具:adb设备:Root的安卓机器&#xff0c;或者模拟器 Frida&#xff08;https://frida.re/&#xff09; 就像是你计算机或移动设备的妙妙工具。它帮助你查看其他程序或应用内部发生的事情&#xff0…

OpenAI发布文生视频大模型Sora

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 一觉醒来发现自己快失业了&#xff0c;Open AI又放大招了。没有任何消息&#xff0c;没有任何预热&#xff0c;直接王炸。 OpenAI突然发布文生视频大模型Sora&#xff0c;生成一段长达1分钟的高清流畅视频。它能模…

机器学习8-决策树

决策树&#xff08;Decision Tree&#xff09;是一种强大且灵活的机器学习算法&#xff0c;可用于分类和回归问题。它通过从数据中学习一系列规则来建立模型&#xff0c;这些规则对输入数据进行递归的分割&#xff0c;直到达到某个终止条件。 决策树的构建过程&#xff1a; 1.…

selenium定位元素报错:‘WebDriver‘ object has no attribute ‘find_element_by_id‘

Selenium更新到 4.x版本后&#xff0c;以前的一些常用的代码的语法发生了改变 from selenium import webdriver browser webdriver.Chrome() browser.get(https://www.baidu.com) input browser.find_element_by_id(By.ID,kw) input.send_keys(Python)目标&#xff1a;希望通…

Python静态方法和类方法的区别和应用

实际上&#xff0c;Python 完全支持定义类方法&#xff0c;甚至支持定义静态方法。Python 的类方法和静态方法很相似&#xff0c;它们都推荐使用类来调用&#xff08;其实也可使用对象来调用&#xff09;。 类方法和静态方法的区别在于&#xff0c;Python会自动绑定类方法的第…

第三节:基于 InternLM 和 LangChain 搭建你的知识库(课程笔记)

视频链接&#xff1a;https://www.bilibili.com/video/BV1sT4y1p71V/?vd_source3bbd0d74033e31cbca9ee35e111ed3d1 文档地址&#xff1a; https://github.com/InternLM/tutorial/tree/main/langchain 课程笔记&#xff1a; 1.仅仅包含训练时间点之前的数据&#xff0c;无法…

Redis篇----第一篇

系列文章目录 文章目录 系列文章目录前言一、什么是 Redis?二、Redis 与其他 key-value 存储有什么不同?三、Redis 的数据类型?四、使用 Redis 有哪些好处?五、Redis 相比 Memcached 有哪些优势?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住…

wordpress外贸成品网站模板

首页大图slider轮播&#xff0c;橙色风格的wordpress外贸网站模板 https://www.zhanyes.com/waimao/6250.html 蓝色经典风格的wordpress外贸建站模板 https://www.zhanyes.com/waimao/6263.html

智能汽车专题:智能驾驶2023年度报告

今天分享的是智能汽车系列深度研究报告&#xff1a;《智能汽车专题&#xff1a;智能驾驶2023年度报告》。 &#xff08;报告出品方&#xff1a;量子位智库&#xff09; 报告共计&#xff1a;30页 来源&#xff1a;人工智能学派 顶天立地&#xff1a;技术进阶路线明晰 根据…

P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G题解

题目 在一个果园里&#xff0c;多多已经将所有的果子打了下来&#xff0c;而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 每一次合并&#xff0c;多多可以把两堆果子合并到一起&#xff0c;消耗的体力等于两堆果子的重量之和。可以看出&#xff0c;所…

物联网技术的崛起:驱动智慧景区的新篇章

随着科技的飞速发展&#xff0c;物联网技术逐渐成为推动各行各业创新的重要力量。在旅游业中&#xff0c;物联网的应用为智慧景区的建设提供了有力支持&#xff0c;为游客带来了更加便捷、智能的旅游体验。本文将探讨物联网技术在智慧景区中的应用及其对旅游业的影响&#xff0…

vue3-深入响应式系统

Vue 最标志性的功能就是其低侵入性的响应式系统。组件状态都是由响应式的 JavaScript 对象组成的。当更改它们时&#xff0c;视图会随即自动更新。这让状态管理更加简单直观&#xff0c;但理解它是如何工作的也是很重要的&#xff0c;这可以帮助我们避免一些常见的陷阱。在本节…

DDD爱好者通病-《软件方法》自测题解析37

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 《软件方法》第5章自测题2 5 [ 单选题 ] 我们经常会听到有人说“系统分为几个功能模块”。针对“功能模块”&#xff0c;以下说法正确的是&#xff1a;  A) 它把外部和内部混在一…

蓝桥杯:C++二分算法

在基本算法中&#xff0c;二分法的应用非常广泛&#xff0c;它是一种思路简单、编程容易、效率极高的算法。蓝桥杯软件类大赛中需要应用二分法的题目很常见。 二分法有整数二分和实数二分两种应用场景 二分法的概念 二分法的概念很简单&#xff0c;每次把搜索范围缩小为上一…

Linux POSIX信号量 线程池

Linux POSIX信号量 线程池 一. 什么是POSIX信号量&#xff1f;二. POSIX信号量实现原理三. POSIX信号量接口函数四. 基于环形队列的生产消费模型五. 线程池 一. 什么是POSIX信号量&#xff1f; POSIX信号量是一种用于同步和互斥操作的机制&#xff0c;属于POSIX&#xff08;Po…

WINCC如何新增下单菜单,切换显示页面

杭州工控赖工 首先我们先看一下&#xff0c;显示的效果&#xff0c;通过下拉菜单&#xff0c;切换主显示页面。如图一&#xff1a; 图1 显示效果 第一步&#xff1a; 通过元件新增一个组合框&#xff0c;见图2&#xff1b; 组合框的设置&#xff0c;设置下拉框的长宽及组合数…

[java基础揉碎]数组 值拷贝和引用拷贝的赋值方式

目录 数组的介绍 为什么有数组 数组的三种使用方式 动态初始化: 静态初始化: 数组使用注意事项和细节 值拷贝和引用拷贝的赋值方式 数组反转: 数组拷贝: 数组的介绍 数组可以存放多个同一类型的数据。数组也是一种数据类型&#xff0c;是引用类型。 即&#xff1a;数组…

解决ubuntu登录密码问题

解决ubuntu登录密码问题 不要随便删除密码&#xff0c;不要随便改密码&#xff0c;很容导致密码过期&#xff0c;或者密码无效。参考了很多人的做法&#xff0c;都没有得到解决。下面的过程&#xff0c;够详细了&#xff0c;我就是这么搞好的。 1、重启虚拟机&#xff0c;不停…