大家好,又见面了,我是你们的朋友全栈君。
引子
android很多app都支持文本的选中,复制。根据观察,主要分为两类:
1)自由复制(弹出框里面支持全选)
2)仅支持全选复制
今天工作中遇到了全选的需求,现总结出来,方便以后查阅.
自由复制
这种方式很简单,只需要两行代码,(下面的红色)
android:layout_height=”wrap_content”
android:text=”长按自由复制”android:textColorHighlight=”#CCCCCC”android:textIsSelectable=”true” />
运行起来;
长按这个TextView,就会出现系统自带的弹出框。
自定义dialog全选复制
针对这个功能,我写了一个工具类,现在贴出主要代码:
3个java类:
packagecom.example.longpresscopy;importandroid.os.Bundle;importandroid.support.v7.app.AppCompatActivity;importandroid.view.Window;importandroid.view.WindowManager;importandroid.widget.TextView;public class MainActivity extendsAppCompatActivity {privateTextView tv_test, tv_test2;
@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏
setContentView(R.layout.activity_main);
tv_test=findViewById(R.id.tv_test);
tv_test2=findViewById(R.id.tv_test2);new CopyShowerUtil(this, tv_test);new CopyShowerUtil(this, tv_test2);
}
}
importandroid.app.Dialog;importandroid.content.Context;importandroid.graphics.Rect;importandroid.support.annotation.NonNull;importandroid.view.Gravity;importandroid.view.View;importandroid.view.Window;importandroid.view.WindowManager;importcom.gwtsz.gts2.hx.R;/*** 生成一个始终跟随 参数控件的窗口*/
public class CopyDialog extendsDialog {publicCopyDialog(@NonNull Context context, View layout, View tv_relative) {super(context, R.style.copyDialog);
setContentView(layout);
Window window=getWindow();
WindowManager.LayoutParams params=window.getAttributes();
params.gravity= Gravity.TOP | Gravity.LEFT;//dialog的初始位置为左上角
Rect r= newRect();
tv_relative.getGlobalVisibleRect(r);
params.x= r.left (r.right – r.left) / 2;//X轴上平移,直到X轴的值,在tv_relative的中心线
params.y = r.top (r.bottom – r.top) / 2;
window.setAttributes(params);
}
}
importandroid.annotation.SuppressLint;importandroid.content.ClipData;importandroid.content.ClipboardManager;importandroid.content.Context;importandroid.content.DialogInterface;importandroid.graphics.Color;importandroid.view.LayoutInflater;importandroid.view.View;importandroid.widget.TextView;public classCopyShowerUtil {privateContext mContext;privateTextView tv_test;private int originalColor = 0xFFFFFFFF;private int highLightColor = 0xFFCCCCCC;public void setOriginalColor(intoriginalColor) {this.originalColor =originalColor;
}public void setHighLightColor(inthighLightColor) {this.highLightColor =highLightColor;
}/*** 执行
*
*@paramcontext
*@paramtv_test_T*/
publicCopyShowerUtil(Context context, TextView tv_test_T) {
mContext=context;
tv_test=tv_test_T;
tv_test.setOnLongClickListener(newView.OnLongClickListener() {
@Overridepublic booleanonLongClick(View v) {
gotoCopyState();return false;
}
});
}private boolean ifCopyState = false;private voidgotoCopyState() {if (!ifCopyState) {
tv_test.setBackgroundColor(highLightColor);
View layout= LayoutInflater.from(mContext).inflate(R.layout.tv_corner_copy, null);final CopyDialog copyDialog = newCopyDialog(mContext, layout, tv_test);
layout.setOnClickListener(newView.OnClickListener() {
@SuppressLint(“NewApi”)
@Overridepublic voidonClick(View v) {
ClipboardManager manager=(ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);
manager.setPrimaryClip(ClipData.newHtmlText(null, tv_test.getText().toString(), null));
copyDialog.dismiss();
copyDialog.cancel();
}
});
copyDialog.setOnCancelListener(newDialogInterface.OnCancelListener() {
@Overridepublic voidonCancel(DialogInterface dialog) {
leaveCopyState();
}
});
copyDialog.show();
ifCopyState= true;
}
}private voidleaveCopyState() {if(ifCopyState) {
tv_test.setBackgroundColor(originalColor);
ifCopyState= false;
}
}
}
layout目录里的布局文件:
activity_main.xml
tv_corner_copy.xml
drawable目录里面的sharp.xml文件
要加入到styles.xml里面的 dialog风格
@null
true
false
true
@color/transparent
false
以及color
#FFFFFF
最终效果
可以点复制,然后在下面的EditText里面粘贴。
弹出框会始终跟随要复制的内容。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/187806.html原文链接:https://javaforall.cn