安卓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 中。以上只是简单功能实现,

相关推荐
alexhilton2 小时前
在Jetpack Compose中创建CRT屏幕效果
android·kotlin·android jetpack
2501_940094024 小时前
emu系列模拟器最新汉化版 安卓版 怀旧游戏模拟器全集附可运行游戏ROM
android·游戏·安卓·模拟器
下位子4 小时前
『OpenGL学习滤镜相机』- Day9: CameraX 基础集成
android·opengl
参宿四南河三6 小时前
Android Compose SideEffect(副作用)实例加倍详解
android·app
火柴就是我7 小时前
mmkv的 mmap 的理解
android
没有了遇见7 小时前
Android之直播宽高比和相机宽高比不支持后动态获取所支持的宽高比
android
shenshizhong7 小时前
揭开 kotlin 中协程的神秘面纱
android·kotlin
vivo高启强8 小时前
如何简单 hack agp 执行过程中的某个类
android
沐怡旸8 小时前
【底层机制】 Android ION内存分配器深度解析
android·面试
你听得到118 小时前
肝了半个月,我用 Flutter 写了个功能强大的图片编辑器,告别image_cropper
android·前端·flutter