zoukankan      html  css  js  c++  java
  • pjsip视频通信开发(上层应用)之EditText重写

    我们经常使用手机的打电话功能,当我们按键盘的时候,有一个地方显示我们按键的内容,当我们的手点击那个地方的时候,并没有弹出软件盘,所以我们再有数字键盘的时候,要屏蔽系统的软件盘。

    我们分析一下,软件盘弹出的条件:

    1、焦点,当EditText处于焦点的时候,会自动弹出软件盘,所以我们要重写onFocusChanged函数

    2、触摸时间,当你点击EditText的时候,那它就会处于焦点,所以我们要重写onTouchEvent函数

    3、当布局改变的时候,EditText也会处于焦点,所以我们也应该重写一下layout函数

    package com.jwzhangjie.pjsip.ui.dialpad;
    
    import android.content.Context;
    import android.graphics.Rect;
    import android.text.InputType;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.accessibility.AccessibilityEvent;
    import android.view.inputmethod.InputMethodManager;
    import android.widget.EditText;
    
    /**
     * 数字输入,暂时不支持字母输入所以把软键盘全部屏蔽
     * 
     * @author jwzhangjie
     */
    public class DigitsEditText extends EditText {
    
    	public DigitsEditText(Context context) {
    		super(context);
    		init();
    	}
    
    	public DigitsEditText(Context context, AttributeSet attrs) {
    		super(context, attrs);
    		init();
    	}
    
    	public DigitsEditText(Context context, AttributeSet attrs, int defStyle) {
    		super(context, attrs, defStyle);
    		init();
    	}
    
    	private void init() {
    		//设置一行显示
    		this.setInputType(InputType.TYPE_NULL);
    
    	}
    
    	@Override
    	public boolean onTouchEvent(MotionEvent event) {
    		final boolean ret = super.onTouchEvent(event);
    		// Must be done after super.onTouchEvent()
    		applyKeyboardShowHide();
    		return ret;
    	}
    
    	@Override
    	public void sendAccessibilityEventUnchecked(AccessibilityEvent event) {
    		if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED) {
    			// Since we're replacing the text every time we add or remove a
    			// character, only read the difference. (issue 5337550)
    			final int added = event.getAddedCount();
    			final int removed = event.getRemovedCount();
    			final int length = event.getBeforeText().length();
    			if (added > removed) {
    				event.setRemovedCount(0);
    				event.setAddedCount(1);
    				event.setFromIndex(length);
    			} else if (removed > added) {
    				event.setRemovedCount(1);
    				event.setAddedCount(0);
    				event.setFromIndex(length - 1);
    			} else {
    				return;
    			}
    		} else if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_FOCUSED) {
    			// The parent EditText class lets tts read "edit box" when this View
    			// has a focus, which
    			// confuses users on app launch (issue 5275935).
    			return;
    		}
    		super.sendAccessibilityEventUnchecked(event);
    	}
    
    	@Override
    	protected void onLayout(boolean changed, int left, int top, int right,
    			int bottom) {
    		super.onLayout(changed, left, top, right, bottom);
    		// Here we ensure that we hide the keyboard
    		// Since this will be fired when virtual keyboard this will probably
    		// blink but for now no better way were found to hide keyboard for sure
    		applyKeyboardShowHide();
    	}
    
    	@Override
    	protected void onFocusChanged(boolean focused, int direction,
    			Rect previouslyFocusedRect) {
    		super.onFocusChanged(focused, direction, previouslyFocusedRect);
    		if (focused) {
    			applyKeyboardShowHide();
    		} else {
    			final InputMethodManager imm = ((InputMethodManager) getContext()
    					.getSystemService(Context.INPUT_METHOD_SERVICE));
    			if (imm != null && imm.isActive(this)) {
    				imm.hideSoftInputFromWindow(getApplicationWindowToken(), 0);
    			}
    		}
    	}
    
    	private void applyKeyboardShowHide() {
    		final InputMethodManager imm = ((InputMethodManager) getContext()
    				.getSystemService(Context.INPUT_METHOD_SERVICE));
    		if (imm != null) {
    			if (imm.isActive(this)) {
    				imm.hideSoftInputFromWindow(getApplicationWindowToken(), 0);
    			}
    		}
    	}
    
    }
  • 相关阅读:
    Dot Net WinForm 控件开发 (七) 为属性提下拉式属性编辑器
    WinForm 程序的界面多语言切换
    c#遍历HashTable
    Dot Net WinForm 控件开发 (三) 自定义类型的属性需要自定义类型转换器
    Dot Net WinForm 控件开发 (六) 为属性提供弹出式编辑对话框
    Dot Net WinForm 控件开发 (一) 写一个最简单的控件
    Dot Net WinForm 控件开发 (四) 设置属性的默认值
    Dot Net WinForm 控件开发 (二) 给控件来点描述信息
    Dot Net WinForm 控件开发 (八) 调试控件的设计时行为
    Dot Net WinForm 控件开发 (五) 复杂属性的子属性
  • 原文地址:https://www.cnblogs.com/pangblog/p/3395460.html
Copyright © 2011-2022 走看看