背景:
这几天做一个复制文本的需求,突然看到QQ上复制昵称跟QQ号的效果,觉得很不错,就想要模仿一波,办法比较简单粗暴,反编译QQ获取了那个.9图片,然后就是用PopWindow实现了。
解决办法:
自定义PopWindowpublic class CopyContentPopWindow extends PopupWindow {
private final View content;
TextView tvLabel;
TextView tvLabelFake;
Activity context; private OnCopyContentListener onCopyContentListener;
public CopyContentPopWindow(Activity context) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
content = inflater.inflate(R.layout.popwindow_copy_content, null);
tvLabel = content.findViewById(R.id.tv_label);
tvLabelFake = content.findViewById(R.id.tv_label_fake);
tvLabel.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) { if (onCopyContentListener != null) {
onCopyContentListener.copyContent();
}
CopyContentPopWindow.this.dismiss();
}
}); this.setContentView(content); this.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT); this.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); this.setFocusable(true); this.setOutsideTouchable(true); this.update();
ColorDrawable dw = new ColorDrawable(0000000000); this.setBackgroundDrawable(dw); this.context = context;
}
public void setTvLabel(String text) {
tvLabel.setText(text);
tvLabelFake.setText(text);
update();
}
public void setOnCopyContentListener(OnCopyContentListener onCopyContentListener) { this.onCopyContentListener = onCopyContentListener;
}
public void showPopupWindow(View parent) { if (!this.isShowing()) { int[] location = new int[2];
parent.getLocationOnScreen(location);// this.showAsDropDown(parent, 0, 0);
showAtLocation(parent, Gravity.NO_GRAVITY, location[0], location[1]);
} else { this.dismiss();
}
}
public interface OnCopyContentListener { void copyContent();
}
}
具体使用代码:public class MainActivity extends AppCompatActivity {
TextView tvNickName;
TextView tvQQNum;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvNickName = findViewById(R.id.tv_nick_name);
tvQQNum = findViewById(R.id.tv_qq_num);
tvNickName.setOnClickListener(v -> {
CopyContentPopWindow copyContentPopWindow = new CopyContentPopWindow(MainActivity.this);
copyContentPopWindow.setTvLabel("复制");
copyContentPopWindow.setOnCopyContentListener(() -> {
ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clipData = ClipData.newPlainText("Label", tvNickName.getText().toString());
cm.setPrimaryClip(clipData);
Toast.makeText(MainActivity.this, "复制成功", Toast.LENGTH_LONG).show();
});
copyContentPopWindow.showPopupWindow(tvNickName);
});
tvQQNum.setOnClickListener(v -> {
CopyContentPopWindow copyContentPopWindow = new CopyContentPopWindow(MainActivity.this);
copyContentPopWindow.setTvLabel("复制QQ号");
copyContentPopWindow.setOnCopyContentListener(() -> {
ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clipData = ClipData.newPlainText("Label", "100001");
cm.setPrimaryClip(clipData);
Toast.makeText(MainActivity.this, "复制成功", Toast.LENGTH_LONG).show();
});
copyContentPopWindow.showPopupWindow(tvQQNum);
});
}
}