安卓TextView 拖动命名

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

效果图;

实现代码

第一布局文件

XML 复制代码
<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>

实现代码

java 复制代码
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 中。以上只是简单功能实现,

相关推荐
快乐觉主吖19 分钟前
Unity的日志管理类
android·unity·游戏引擎
明月看潮生26 分钟前
青少年编程与数学 01-011 系统软件简介 06 Android操作系统
android·青少年编程·操作系统·系统软件·编程与数学
snetlogon2029 分钟前
JDK17 Http Request 异步处理 源码刨析
android·网络协议·http
消失的旧时光-19431 小时前
Android USB 通信开发
android·java
吃汉堡吃到饱1 小时前
【Android】浅析View.post()
android
咕噜企业签名分发-淼淼1 小时前
开发源码搭建一码双端应用分发平台教程:逐步分析注意事项
android·ios
betazhou3 小时前
mariadb5.5.56在centos7.6环境安装
android·数据库·adb·mariadb·msyql
doublelixin8 小时前
AOSP (Android11) 集成Google GMS三件套
android
xzkyd outpaper11 小时前
onSaveInstanceState() 和 ViewModel 在数据保存能力差异
android·计算机八股
CYRUS STUDIO12 小时前
FART 脱壳某大厂 App + CodeItem 修复 dex + 反编译还原源码
android·安全·逆向·app加固·fart·脱壳