Android自定义剪切板及状态选择器

一、Android自定义剪切板

1.11 说明

API 11之前: android.text.ClipboardManager
API 11之后: android.content.ClipboardManager
我们可以一直使用API11之前的API来实现需求,同时也可以达到兼容的效果。不过既然谷歌工程师在API11之后提供了新的API,我们最好还是通过判断sdk版本的形式来达到兼容效果。

1.12 撸代码

/**
     * 剪切板的处理
     */
    private void clipAndCopy() {
        tvContent.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                String content = tvContent.getText().toString().trim();
                //当SDK版本大于11时
                if (Build.VERSION.SDK_INT > 11) {
                    //获取到剪切板管理类
                    ClipboardManager clipboard = (ClipboardManager) context
                            .getSystemService(Context.CLIPBOARD_SERVICE);
                    //将要赋值的内容添加至剪切数据对象中,此处指的是普通文本
                    //第一个参数就是一个标签的作用,基本没有什么用处,随便也可以
                    //第二个参数是真正要添加至剪切版的内容
                    ClipData clip = ClipData.newPlainText("Simple text", content);
                    //将剪切数据对象交给剪切板管理者,当用户触发可以复制的View的时候,
                    // 一旦用户点击复制,剪切板管理器将会从剪切板中拿出数据。
                    /**
                     * 注意:剪切板管理类中只会有最近一条保存至剪切板管理类的数据
                     */
                    clipboard.setPrimaryClip(clip);

                } else {
                    android.text.ClipboardManager clip = (android.text.ClipboardManager) context
                            .getSystemService(Context.CLIPBOARD_SERVICE);
                    //将需要复制的内容交给剪切板管理类
                    clip.setText(content);

                }
                Toast.makeText(MainActivity.this, "已复制", Toast.LENGTH_SHORT).show();
                return true;
            }
        });
        //设置EditText不能够复制
        etContent.setCustomSelectionActionModeCallback(new ActionMode.Callback() {

            @Override
            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                Log.e(TAG, "onCreateActionMode");
                Toast.makeText(MainActivity.this, "不可全选", Toast.LENGTH_SHORT).show();
                //返回fasle会让当前的EditText不支持全选,也不可以复制
                return false;
            }

            @Override
            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                Log.e(TAG, "onPrepareActionMode");
                return false;
            }

            @Override
            public void onDestroyActionMode(ActionMode mode) {

            }

            @Override
            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                Log.e(TAG, "onActionItemClicked");
                return false;
            }
        });
    }

参考资料

Android 剪贴板详解

Android自定义文本选中模式(全选、复制,剪切,粘帖)

android 复制、剪切、粘贴

Android EditText 取消复制粘贴剪贴功能

关于复制粘贴其他功能的推荐文章

android 改变TextView和EditText文字选中效果

Android EditText定制粘贴和定制输入


二、状态选择器

状态选择器中一旦状态匹配成功,那么后面的条目将不会匹配了,因此如果状态选择器中的条目是两个互斥的则就不用考虑顺序;如果状态选择器中的条目有多个,那么必须考虑状态选择器中条目执行的顺序了。有多个状态的时候,最好不要出现两个互斥的状态同时出现在状态选择器中的情况。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!--
        如果在此处我将控件不被选中的状态也加入进来,同时将控件不被激活状态放在这两个互斥
        状态之后,那么这个不被激活的状态将永远不会被匹配到
    -->

    <!--设置控件处于不被激活状态时候的背景图片-->
    <item android:drawable="@drawable/icon_cb_add_member" android:state_enabled="false"/>
    <!--设置控件处于选中状态时候的背景图片-->
    <item android:drawable="@drawable/icon_cb_checked" android:state_checked="true"/>
    <!--如果控件不处于上面的两种状态,那么控件的背景图片就是下面这一张-->
    <item android:drawable="@drawable/icon_cb_checked_un"/>
</selector>
效果图:

默认状态

CheckBox未被激活状态

CheckBox选中状态

Demo源码

猜你喜欢

转载自blog.csdn.net/Duckdan/article/details/79911721