Android仿qq长按弹出复制粘贴

        废话不说,先看一下效果图:


        对于列表来说,如果想操作某个列表项,一般会采用长按弹出菜单的形式,默认的上下文菜单比较难看,而QQ的上下文菜单就人性化多了,整个菜单给用户一种气泡弹出的感觉,而且会显示在手指按下的位置,而技术实现我之前是使用popupWindow和RecyclerView实现的,上面一个RecyclerView,下面一个小箭头ImageView,但后来发现没有必要,而且可定制化也不高,还是使用多个TextView更好一点。

        我封装了一下,只需要一个PopupList.java文件。源码放在了git上,git地址:https://github.com/shangmingchao/PopupList

        使用方式,很简单:

        只需要一个PopupList.java文件和几行代码,你就可以为ListView,GridView,甚至任意View绑定一个长按弹出的水平气泡式菜单。
你可以这样使用:


 
 
  1. public class MainActivity extends AppCompatActivity {
  2. private Button btn_long_click;
  3. private ListView lv_main;
  4. private List<String> mDataList = new ArrayList<>();
  5. private ArrayAdapter<String> mDataAdapter;
  6. private List<String> popupMenuItemList = new ArrayList<>();
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_main);
  11. btn_long_click = (Button) findViewById(R.id.btn_long_click);
  12. lv_main = (ListView) findViewById(R.id.lv_main);
  13. mDataAdapter = new ArrayAdapter<>( this, android.R.layout.simple_expandable_list_item_1, mDataList);
  14. lv_main.setAdapter(mDataAdapter);
  15. popupMenuItemList.add(getString(R.string.copy));
  16. popupMenuItemList.add(getString(R.string.delete));
  17. popupMenuItemList.add(getString(R.string.share));
  18. popupMenuItemList.add(getString(R.string.more));
  19. PopupList popupList = new PopupList( this);
  20. popupList.bind(lv_main, popupMenuItemList, new PopupList.PopupListListener() {
  21. @Override
  22. public boolean showPopupList(View adapterView, View contextView, int contextPosition) {
  23. return true;
  24. }
  25. @Override
  26. public void onPopupListClick(View contextView, int contextPosition, int position) {
  27. Toast.makeText(MainActivity. this, contextPosition + "," + position, Toast.LENGTH_SHORT).show();
  28. }
  29. });
  30. PopupList normalViewPopupList = new PopupList( this);
  31. normalViewPopupList.bind(btn_long_click, popupMenuItemList, new PopupList.PopupListListener() {
  32. @Override
  33. public boolean showPopupList(View adapterView, View contextView, int contextPosition) {
  34. return true;
  35. }
  36. @Override
  37. public void onPopupListClick(View contextView, int contextPosition, int position) {
  38. Toast.makeText(MainActivity. this, contextPosition + "," + position, Toast.LENGTH_SHORT).show();
  39. }
  40. });
  41. lv_main.setOnItemClickListener( new AdapterView.OnItemClickListener() {
  42. @Override
  43. public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  44. Toast.makeText(MainActivity. this, "onItemClicked:" + position, Toast.LENGTH_SHORT).show();
  45. }
  46. });
  47. btn_long_click.setOnClickListener( new View.OnClickListener() {
  48. @Override
  49. public void onClick(View v) {
  50. startActivity( new Intent(MainActivity. this, SecondaryActivity.class));
  51. }
  52. });
  53. getData();
  54. }
  55. private void getData() {
  56. for ( int i = 0; i < 40; i++) {
  57. mDataList.add( "No." + i);
  58. }
  59. mDataAdapter.notifyDataSetChanged();
  60. }
  61. }
注意:`bind()`方法要求你的anchorView不能有touch和longClick/itemLongClick监听,因为`bind()`方法会主动给anchorView设置监听器:


 
 
  1. mAnchorView.setOnTouchListener( new View.OnTouchListener() {
  2. @Override
  3. public boolean onTouch(View v, MotionEvent event) {
  4. mRawX = event.getRawX();
  5. mRawY = event.getRawY();
  6. return false;
  7. }
  8. });
  9. if (mAnchorView instanceof AbsListView) {
  10. ((AbsListView) mAnchorView).setOnItemLongClickListener( new AdapterView.OnItemLongClickListener() {
  11. @Override
  12. public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
  13. if (mPopupListListener != null
  14. && !mPopupListListener.showPopupList(parent, view, position)) {
  15. return false;
  16. }
  17. mAdapterView = parent;
  18. mContextView = view;
  19. mContextPosition = position;
  20. showPopupListWindow();
  21. return true;
  22. }
  23. });
  24. } else {
  25. mAnchorView.setOnLongClickListener( new View.OnLongClickListener() {
  26. @Override
  27. public boolean onLongClick(View v) {
  28. if (mPopupListListener != null
  29. && !mPopupListListener.showPopupList(v, v, 0)) {
  30. return false;
  31. }
  32. mContextView = v;
  33. mContextPosition = 0;
  34. showPopupListWindow();
  35. return true;
  36. }
  37. });
  38. }
这就限制了anchorView不能再添加touch监听,不能添加longClick监听,如果你需要添加监听可以使用`showPopupListWindow`方法主动来显示弹出框,而不是使用`bind()`方法: 


 
 
  1. public class SecondaryActivity extends AppCompatActivity {
  2. private ListView lv_main;
  3. private List<String> mDataList = new ArrayList<>();
  4. private ArrayAdapter<String> mDataAdapter;
  5. private List<String> popupMenuItemList = new ArrayList<>();
  6. private float mRawX;
  7. private float mRawY;
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.activity_secondary);
  12. lv_main = (ListView) findViewById(R.id.lv_main);
  13. mDataAdapter = new ArrayAdapter<>( this, android.R.layout.simple_expandable_list_item_1, mDataList);
  14. lv_main.setAdapter(mDataAdapter);
  15. popupMenuItemList.add(getString(R.string.copy));
  16. popupMenuItemList.add(getString(R.string.delete));
  17. popupMenuItemList.add(getString(R.string.share));
  18. popupMenuItemList.add(getString(R.string.more));
  19. lv_main.setOnTouchListener( new View.OnTouchListener() {
  20. @Override
  21. public boolean onTouch(View v, MotionEvent event) {
  22. mRawX = event.getRawX();
  23. mRawY = event.getRawY();
  24. return false;
  25. }
  26. });
  27. lv_main.setOnItemClickListener( new AdapterView.OnItemClickListener() {
  28. @Override
  29. public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  30. Toast.makeText(SecondaryActivity. this, "onItemClicked:" + position, Toast.LENGTH_SHORT).show();
  31. }
  32. });
  33. lv_main.setOnItemLongClickListener( new AdapterView.OnItemLongClickListener() {
  34. @Override
  35. public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
  36. PopupList popupList = new PopupList(view.getContext());
  37. popupList.showPopupListWindow(view, position, mRawX, mRawY, popupMenuItemList, new PopupList.PopupListListener() {
  38. @Override
  39. public boolean showPopupList(View adapterView, View contextView, int contextPosition) {
  40. return true;
  41. }
  42. @Override
  43. public void onPopupListClick(View contextView, int contextPosition, int position) {
  44. Toast.makeText(contextView.getContext(), contextPosition + "," + position, Toast.LENGTH_SHORT).show();
  45. }
  46. });
  47. return true;
  48. }
  49. });
  50. getData();
  51. }
  52. private void getData() {
  53. for ( int i = 0; i < 40; i++) {
  54. mDataList.add( "No." + i);
  55. }
  56. mDataAdapter.notifyDataSetChanged();
  57. }
  58. }
更详细的配置:
  • popupList.setIndicatorView(View)
  • popupList.setIndicatorSize(int, int)
  • popupList.setNormalBackgroundColor(int)
  • popupList.setPressedBackgroundColor(int)
  • popupList.setNormalTextColor(int)
  • popupList.setPressedTextColor(int)
  • popupList.setDividerColor(int)
  • popupList.setTextSize(float)
  • popupList.setTextPadding(int, int, int, int)
  • popupList.setTextPaddingLeft(int)
  • popupList.setTextPaddingTop(int)
  • popupList.setTextPaddingRight(int)
  • popupList.setTextPaddingBottom(int)
  • popupList.setBackgroundCornerRadius(int)
  • popupList.setDividerWidth(int)
  • popupList.setDividerHeight(int)

转至https://blog.csdn.net/shangmingchao/article/details/50244161
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值