选择中控件后,单击软键盘删除控件

abc1

1。单击控件选中状态,弹出软键盘

2。再次单击,取消选中状态,收起软键盘

3 。单击软键盘中del键,删除选中的控件

代码:

package com.hysec.hami.widget;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.sinosoft.test.R;

public class ReceipientsView extends LinearLayout {

 private List<TextView> mReceipientsViews;
 private Context mContext;
 private static final int PADDING = 5;
 private static final int FONT_SIZE = 14;
 private static final int MARGIN = 5;
 private int mCurRowWidth;
 private int mWidth;
 private LinearLayout mCurRow;
 private Paint mPaint;
 private int mCurWidth;
 private boolean isFir = true;
 private View selectedView;
 private EditText edittext;
 private List<String> receipentNames;

 public void setmWidth(int width) {
  this.mWidth = width;
 }

 public int getmWidth() {
  return this.mWidth;
 }

 public ReceipientsView(Context context, AttributeSet attrs) {
  super(context, attrs);

  init(context);
 }

 public ReceipientsView(Context context) {
  super(context);
  init(context);
 }

 private void init(Context context) {
  this.mContext = context;
  receipentNames = new ArrayList<String>();
  setOrientation(VERTICAL);
  // 在oncreate时取不到父容器的宽度,这个回调可以得到其父容器的宽度
  ViewTreeObserver observer = getViewTreeObserver();
  observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
   
   @Override
   public void onGlobalLayout() {
    if(mWidth == 0) {
     mWidth = getMeasuredWidth();
     int count = receipentNames.size();
     for(int i = 0;i < count;++i) {
      addReceipent(receipentNames.get(i));
     }
    }
   }
  });
  edittext = new EditText(context);
  edittext.setBackgroundColor(Color.TRANSPARENT);
  edittext.setCursorVisible(false);
  // 这个要保证其有焦点,requestFocuse()请求焦点
  edittext.setOnKeyListener(new OnKeyListener() {
   
   @Override
   public boolean onKey(View v, int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_DEL) {
     if (selectedView != null) {
      mReceipientsViews.remove(selectedView);
      ((LinearLayout)selectedView.getParent()).removeView(selectedView);
      selectedView = null;
     }
    }
    return false;
   }
  });
  LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(1,1);
  addView(edittext,params);
  setGravity(Gravity.FILL);
  setBackgroundColor(Color.TRANSPARENT);
  setPadding(PADDING, PADDING, PADDING, PADDING);
  mReceipientsViews = new ArrayList<TextView>();
 }
 
 public void addName(String receipentName) {
  if(!receipentNames.contains(receipentName))
   receipentNames.add(receipentName);
 }

 private void addReceipent(String receipentName) {
  // 满行
  if (isNextLine(receipentName)) {
   mCurRowWidth = 0;
   isFir = false;
   mCurRow = new LinearLayout(mContext);
   mCurRow.setOrientation(HORIZONTAL);
   LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
     LinearLayout.LayoutParams.WRAP_CONTENT,
     LinearLayout.LayoutParams.WRAP_CONTENT);
   params.topMargin = MARGIN;
   addView(mCurRow, params);
  }
  TextView receipent = new TextView(mContext);
  receipent.setPadding(PADDING, PADDING, PADDING, PADDING);
  receipent.setBackgroundDrawable(mContext.getResources().getDrawable(
    R.drawable.unselreceipent));
  LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.WRAP_CONTENT,
    LinearLayout.LayoutParams.WRAP_CONTENT);
  params.leftMargin = MARGIN;
  receipent.setTextSize(FONT_SIZE);
  receipent.setText(receipentName);
  mCurRowWidth += mCurWidth;
  receipent.setOnClickListener(onClickListener);
  mCurRow.addView(receipent, params);

  mReceipientsViews.add(receipent);
 }

 private boolean isNextLine(String receipientName) {
  mPaint = new Paint();
  mPaint.setTextSize(FONT_SIZE);
  mCurWidth = (int) mPaint.measureText(receipientName) + 2 * PADDING
    + MARGIN;
  if (isFir)
   return true;
  return (mCurWidth + mCurRowWidth) > mWidth ? true : false;
 }

 private OnClickListener onClickListener = new OnClickListener() {

  @Override
  public void onClick(View v) {
   InputMethodManager imm = (InputMethodManager) mContext
     .getSystemService(Context.INPUT_METHOD_SERVICE);
   if (v == selectedView) {
    v.setBackgroundDrawable(getResources().getDrawable(
      R.drawable.unselreceipent));
    selectedView = null;
    // 这个是隐藏软键盘,不是切换(网上有些用imm.toggleSoftInput(showFlags, hideFlags),只是切换键盘的状态,不是单纯隐藏的效果)
    imm.hideSoftInputFromWindow(getApplicationWindowToken(),0);
   } else {
    if(selectedView != null) {
     selectedView.setBackgroundDrawable(mContext.getResources().getDrawable(R.drawable.unselreceipent));
    }
    selectedView = v;
    v.setBackgroundDrawable(getResources().getDrawable(
      R.drawable.selreceipent));
    edittext.requestFocus();
    // 只是进是显示键盘,不是切换
    imm.toggleSoftInput(0, InputMethodManager.SHOW_IMPLICIT);
   }
  }
 };
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值