• android自己定义TextView


    Android控件中的TextView控件仅仅有一个输入框。可是为了用于的操作方便我们应该实现一些功能:

    1. 能够直接将内容删除的功能button

    2. 可以记录用户曾经输入的数据,同一时候可以将数据通过下拉显示,点击的时候实现输入

    先上图:

    下拉的图片没有做。所以和删除的图片使用同一个了,同志们能够直接在xml文件里更换即可了


    分析:

    肯定要使用自己定义view来实现的。我们知道自己定义view大概能够分为三类:自绘控件,组合控件,继承控件,我们这里是要进行增强的textView的功能。所以我这里使用的

    是组合控件的方式来进行实现

    既然使用组合控件,那么我们就来看看究竟要使用什么控件来组合呢:

    1.  当中一个必须是textView了

    2. 下拉的那两个button是什么。当然是imageView了

    3. 另一个下拉列表,。

    。。。那就使用popwindow了

    思路:

    1. 怎样实现直接删除用户的输入

    使用addTextChangedListener监听textView内容的变化的时间依据内容的变化进行确定是否显示删除button,同一时候绑定删除button的点击事件

    2.怎样实现下拉显示用户输入过的数据,以及选中的时候实现输入

     我们通过下拉button的点击进行确定popwindow窗体的显示,在popwindow的界面有一个listview,在这个listview的adpater中进行绑定条目的点击事件

    那么我们在adapter中绑定的事件,怎样控制整个控件的功能输入呢,这里就是用handler了,在创建adapter的时候将handler传递过去,

    然后当点击事件发生的时候我们使用handler进行send消息即可了,当然我们在send消息的时候将当前点击的数据传递过来即可了

    上代码:

    1. 控件主体代码

    /**
     * 自己定义的控件,自带删除的button,下拉button
     * @author zcs
     * */
    public class EditTextClearSelect extends FrameLayout {
    	
    	private EditText editText;  //显示的editText输入框
        private ImageButton clearImageButton;  //显示的用于进行删除editText中内容的button
        private ImageButton selectImageButton;  //显示的用于下拉editText中内容的button
    	
        //PopupWindow对象  ,用于已下拉形式显示数据
        private PopupWindow selectPopupWindow= null;  
        //自己定义Adapter  
        private ECS_OptionsAdapter optionsAdapter = null;  
        //下拉框选项数据源  
        private ArrayList<String> datas = new ArrayList<String>();   
        //下拉框依附组件 
        private LinearLayout parent;  
        //展示全部下拉选项的ListView  
        private ListView listView = null;   
        //用来处理选中或者删除下拉项消息  
        private Handler handler;  
        
    	public EditTextClearSelect(Context context) {
    		super(context);
    	}
    	//用于对自己定义的控件进行初始化
    	public EditTextClearSelect(Context context, AttributeSet attrs){
    		super(context, attrs);
    		//调用初始化自己定义控件的方法
    		init(context,attrs);
    	}
    	
    	/**  
         * 初始化下拉功能使用的组件  
         */  
        private void initWedget(Context context){  
            //初始化Handler,用来处理消息  
            handler = new Handler(){
            	public void handleMessage(Message msg) {
            		//当adapter中传递过来消息以后依据选中的id,将相应的值填写到EditText组件中
            		Bundle data = msg.getData();  
                    //选中下拉项,下拉框消失  
                    int selIndex = data.getInt("selIndex");  
                    editText.setText(datas.get(selIndex));  
                    dismiss(); 
            	}  
            };
              
            //假设没有数据。则下拉菜单不显示
            if( !(datas.size() > 0) ){
            	selectImageButton.setVisibility(View.GONE);
            }
            
            //设置点击下拉箭头图片事件,点击弹出PopupWindow浮动下拉框  
            selectImageButton.setOnClickListener(new View.OnClickListener() {  
                @Override  
                public void onClick(View v) {  
                	 //获取下拉框依附的组件宽度,然后又一次设置popWindow的宽度
                	selectPopupWindow.setWidth(parent.getWidth());
                    //显示PopupWindow窗体  
                    popupWindwShowing();  
                }  
            });  
              
            //初始化PopupWindow  
            initPopuWindow(context);  
        }  
    	
        /**  
         * 初始化PopupWindow  
         */   
        private void initPopuWindow(Context context){   
              
            //PopupWindow浮动下拉框布局  
            View loginwindow = LayoutInflater.from(context).inflate(R.layout.wecs_options, null); 
            listView = (ListView) loginwindow.findViewById(R.id.list);   
              
            //设置自己定义Adapter  
            optionsAdapter = new ECS_OptionsAdapter(context,handler,datas);   
            listView.setAdapter(optionsAdapter);   
    
            selectPopupWindow = new PopupWindow(loginwindow, 0,LayoutParams.WRAP_CONTENT, true);   
            selectPopupWindow.setOutsideTouchable(true);   
            //实现当点击屏幕其它地方的时候将当前的pop关闭
            selectPopupWindow.setBackgroundDrawable(new BitmapDrawable());    
        }  
        
        /**  
         * 显示PopupWindow窗体  
         * @param popupwindow  
         */   
        public void popupWindwShowing() { 
           //将pop窗体在自己定义控件的底部显示
           selectPopupWindow.showAsDropDown(parent);   
        }   
           
        /**  
         * PopupWindow消失  
         */   
        public void dismiss(){   
            selectPopupWindow.dismiss();   
        }  
        
    	 /**
         * 初始化,包含添加删除button。下拉button
         */
        public void init(Context context,AttributeSet attrs){
        	//获取自己定义控件的界面,相当于当前的自己定义View就使用的View
            View view = LayoutInflater.from(context).inflate(R.layout.weight_edit_clear_select, this, true);
            
            parent =  (LinearLayout) view.findViewById(R.id.parent);  //当前的自己定义控件
            editText = (EditText) view.findViewById(R.id.et);  //输入框 
            clearImageButton = (ImageButton) view.findViewById(R.id.clear_ib); //删除button
            selectImageButton = (ImageButton) view.findViewById(R.id.select_id); //下拉button
            
            //当点击删除button的会后将输入框数据清空
            clearImageButton.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    editText.setText("");
                }
            });
            //依据输入框中的内容。决定是否显示删除button
            editText.addTextChangedListener(new TextWatcher(){
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    if (s.length() > 0) {
                    	//输入框有内容,显示button
                    	editText.setSelection(s.length());
                        clearImageButton.setVisibility(View.VISIBLE);
                    } else {
                        clearImageButton.setVisibility(View.GONE);
                    }
                }
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count,
                        int after) {
                }
                @Override
                public void afterTextChanged(Editable s) {
                }
    
            });
            
            //初始化pop组件,设置下拉button的功能
            initWedget(context);  
            
            //将属性值设置到控件中
            TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.EditTextClearSelect);
            //输入框的默认的显示文本
            CharSequence text = a.getText(R.styleable.EditTextClearSelect_textECS);
            CharSequence hint = a.getText(R.styleable.EditTextClearSelect_hintECS);
            CharSequence parent_width  = a.getText(R.styleable.EditTextClearSelect_layout_width);
            
            if (text!=null&&!"".equals(text.toString().trim())) {
                editText.setText(text);
                //设置光标位置
                editText.setSelection(text.length());
                this.clearImageButton.setVisibility(View.VISIBLE);
            }
            if (hint!=null&&!"".equals(hint.toString().trim())) {
                editText.setHint(hint);
            }
            if(parent_width!=null && !"".equals(parent_width.toString().trim()) ){
            	//设置当前控件的宽度,为屏幕的百度比有參数进行设置
            	LayoutParams parent_lp = (LayoutParams) parent.getLayoutParams();
            	parent_lp.width = (int) (AppUtil.getScreenDispaly(context)[0] * ( (Double)(Double.parseDouble(parent_width.toString()) / 100) ));
            	Log.i("控件宽度", parent_lp.width+"");
            	parent.setLayoutParams(parent_lp);
            }
            a.recycle();
        }
         
        /**
         * 获得输入的值
         * @return
         */
        public String getText(){
            return this.editText.getText().toString();
        }
         
        /**
         * 设置值
         * @param text
         */
        public void setText(String text){
            this.editText.setText(text);
        }
         
        /**
         * 设置默认值
         * @param hint
         */
        public void setHint(String hint){
            this.editText.setHint(hint);
        }
         
        /**
         * 获得输入框控件
         * @return
         */
        public EditText getEditText(){
            return this.editText;
        }
         
        /**
         * 获得消除button
         * @return
         */
        public ImageButton getClearImageButton(){
            return this.clearImageButton;
        }
    	
        //设置下拉列表中的选项值
        public void setOptionsValue(ArrayList<String> inDatas){
        	datas.clear();
        	if( (inDatas ==null) || !(inDatas.size() > 0) ){
        		selectImageButton.setVisibility(View.GONE);
        	}else{
        		selectImageButton.setVisibility(View.VISIBLE);
        		datas.addAll(inDatas);
        	}
        	optionsAdapter.notifyDataSetChanged();
        }

    2. popwindow里面listview的适配器

    public class ECS_OptionsAdapter extends BaseAdapter {
    
    	  	private ArrayList<String> list = new ArrayList<String>();   
    	    private Context context = null;   
    	    //传递过来的hanler,用于进行通知操作(这里是通知自己定义的view要继续改动editText中的数据)
    	    private Handler handler;
    	    
    	    public ECS_OptionsAdapter(Context context,Handler handler,ArrayList<String> list){  
    	        this.context = context;  
    	        this.handler = handler;  
    	        this.list = list;  
    	    }  
    	      
    	    @Override  
    	    public int getCount() {  
    	        return list.size();  
    	    }  
    	  
    	    @Override  
    	    public Object getItem(int position) {  
    	        return list.get(position);  
    	    }  
    	  
    	    @Override  
    	    public long getItemId(int position) {  
    	        return position;  
    	    }  
    	  
    	    @Override  
    	    public View getView(final int position, View convertView, ViewGroup parent) {  
    	          
    	    	ViewHolder holder = null;   
    	        if (convertView == null) {   
    	            holder = new ViewHolder();   
    	            //下拉项布局  
    	            convertView = LayoutInflater.from(context).inflate(R.layout.wecs_option_item, null);   
    	            holder.textView = (TextView) convertView.findViewById(R.id.item_text);   
    	            convertView.setTag(holder);   
    	        } else {   
    	            holder = (ViewHolder) convertView.getTag();   
    	        }   
    	        holder.textView.setText(list.get(position));  
    	        //为下拉框选项文字部分设置事件。终于效果是点击将其文字填充到文本框  
    	        holder.textView.setOnClickListener(new View.OnClickListener() {  
    	            @Override  
    	            public void onClick(View v) {  
    	            	//当点击的时候进行发送消息。通知组件进行改动数据
    	                Message msg = new Message();  
    	                //设置要传递的数据
    	                Bundle data = new Bundle();  
    	                //设置选中索引  
    	                data.putInt("selIndex", position);  
    	                msg.setData(data); 
    	                //发出消息  
    	                handler.sendMessage(msg);
    	            }  
    	        });  
    	        return convertView;   
    	    }  
    	  
    	}  
    
    	class ViewHolder {   
    	    TextView textView;   
    	}   

    3. 使用

    	private EditTextClearSelect etcs;
    	
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		init();
    	}
    	
    	//初始化
    	private void init(){
    		String selectDatas = "admin,login,user";
    		etcs = (EditTextClearSelect) findViewById(R.id.username_edit);
    		//为控件设置下拉的数据
    		etcs.setOptionsValue( new ArrayList<String>(Arrays.asList(selectDatas.split(","))) );
    		
    	}

    ok搞定

    源代码下载


  • 相关阅读:
    [PHP] thinkphp5 单入口多个模块绑定和路由开关
    [高并发]幂等性、最终一致性
    [高并发]Beanstalkd消息中间件使用
    [高并发]Redis 集群搭建步骤
    [PHP] laravel5.5 搭建流程
    [PHP] 破Laravel白屏问题
    talk 64
    linux
    yum
    linux修改时区
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6848641.html
Copyright © 2020-2023  润新知