一、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;
}
});
}
二、状态选择器
状态选择器中一旦状态匹配成功,那么后面的条目将不会匹配了,因此如果状态选择器中的条目是两个互斥的则就不用考虑顺序;如果状态选择器中的条目有多个,那么必须考虑状态选择器中条目执行的顺序了。有多个状态的时候,最好不要出现两个互斥的状态同时出现在状态选择器中的情况。
<?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源码