具体方法如下:
首先,在清单文件Manifest.xml中的对应的Activity标签内设置
android:windowSoftInputMode=”adjustResize”
作用是当软键盘显示或隐藏时,该Activity主窗口总是会被调整大小以便留出软键盘的空间。唯有这样才能保证布局触发onSizeChanged()方法。
然后,自定义一个布局,具体是RelativeLayout、LinearLayout或是其它的,根据实际情况而定,自定义的目的是在其onSizeChanged()方法中增加一个监听接口。这里给出一个自定义RelativeLayout布局代码:
public class CustomRelativeLayout extends RelativeLayout {
private OnSizeChangedListener listener
public CustomRelativeLayout(Context context) {
super(context)
}
public CustomRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs)
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b)
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
Log.d(TAG.CUSTOM_VIEW, “onSizeChanged”)
super.onSizeChanged(w, h, oldw, oldh)
if (listener != null) {
listener.onSizeChanged(w, h, oldw, oldh)
}
}
public void setOnSizeChangedListener(OnSizeChangedListener listener) {
this.listener = listener
}
/** * Activity主窗口大小改变时的回调灶渣接口(本示例中,等价于软键盘显示隐藏时的回调接口) */
public interface OnSizeChangedListener {
public void onSizeChanged(int w, int h, int oldw, int oldh)
}
}
最后,在程序中使用此接口(xxx.setOnSizeChangedListener(…))即可段辩纯实现监听键盘隐藏或显示事件。
Android自定义键盘的使用
1、新建一个xml文件夹放在res目录下面,然后新建xml文件:money_keyboard.xml
2、然后在XML文件中添加按钮布局,这个布局就是键盘的样子了
3 属性介绍:
Keyboard:
存储键盘以及按键相关信息。
android:horizontalGap
按键之间默认的水平间距。
android:verticalGap
按键之间默认的垂直间距。
android:keyHeight
按键的默认高度,以像素或显示高度的百分比表示。
android:keyWidth:
按键的默认宽度,以像素或显示宽度的百分比表示。
Row:
为包含按键的容器。
Key:
用于描述键盘中单个键的位置和特性。
android:codes
该键输出的unicode值。
android:codes 官网介绍是说这个是该键的unicode 值或者逗号分隔值,当然我们也可以设置成我们逗袜想要的值,在源码中提供了几个特定的值
对照表:
android:isRepeatable
这个属性如果设置为true,那么当长按该键时就会重复接受到该键上的动作,在 删除键键 和 空格键 上通常设为true。
android:keyLabel
显示在按键上的文字。
android:keyIcon 与 keyLabel
是二选一关系,它会代替文字以图标的形式显示在键上。
android:keyWidth="33.33333%p"
每一个按钮的宽度,可以设置百分比
android:keyHeight="10%p"
每一个按钮高度,可以设置百分比
KeyboardView是一个渲染虚拟键盘的View。 它处理键的渲染和检测按键和触摸动作。
显然我们需要KeyboardView来对Keyboard里的数据进行渲染并呈现给我们以及相关的点击事件做处理。 1)//设置keyboard与KeyboardView相关联的方法。
public void setKeyboard(Keyboard keyboard)
2)//设置虚拟键盘事件的监听,此方法必须设置,不然会报错。
public void setOnKeyboardActionListener(OnKeyboardActionListener listener) 步骤上呢,做完第一步的关联,并设置第二步的事件,调用KeyboardView.setVisible(true)键盘就可以显示出来了, 是不是很简单。不过到这里还没有结束哦祥前,接下来我们为了使用上的便利要进行相应的封装。 封装 这里我们通过继承EditText来对Keyboard与KeyboardView进行封装。
attr.xml文件,这里我们需要通过一个xml类型的自定义属性引入我们的键盘描述文件。
1、新建一个类,我谨指清取名叫KeyUtils然后在里面新建三个属性。KeyBoard用处可大了,他才是本体,可以通过设置他来切换键盘。
2、构造函数,初始下三个参数。
3、先说下预览图吧,就是效果图上的预览图,需要预览图的话的将setPreviewEnabled设置为true,不过还得在布局文件中的android.inputmethodservice.KeyboardView标签对立面设置预览布局。否则,不会有字。至于设置的布局,一个TextView就好了~
onPress: 按下触发。
onRelease:松开触发。
onKey : 松开触发,在OnRelease之前触发。
swipeLeft : 左滑动,其他同理。哈哈~就这么懒。
onText :需要在 键盘xml,也就是我此时的number.xml里面中key标签对里添加一个
在很多Android App 开发的过程中,需要对Activity 中 软键盘的d起和关闭进项监听,但是Andoid中并没有提供相对应的api进行监听, 我有一个简单的方法猜迟掘。首先需要知道一些基础知识
在manifest文件中可以设置Activity的android:windowSoftInputMode属性,这个属性值常见旦含的设置如下:android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
那么这里值的含义列表如下:
1、stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
2、stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
3、stateHidden:用户选择activity时,软键盘总是被隐藏
4、stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
5、stateVisible:软键盘通常是可见的
6、stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
7、adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
8、adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
9、adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分
案例:
1.我们需要将监听所在的Activity在Manifest文件中的设置为如下形式:
<activity
android:name="com.zy.project.MainActivity"
android:label="@string/app_name"
android:windowSoftInputMode="stateAlwaysHidden|adjustResize" >
<intent-filter>
<action android:name="android.intent.action.MAIN/>
<category android:name="android.intent.category.LAUNCHER/>
</intent-filter>
</activity>
当有软键盘d起时,Activity的布局大小会被滚动上去,但是你仍然可以通过滑动浏览所有。
2 需要在外层布局文件设置一个id,并在activity 中设置监穗核听
import android.app.Activity
import android.os.Bundle
import android.view.View
import android.view.View.OnLayoutChangeListener
import android.widget.Toast
public class MainActivity extends Activity implements OnLayoutChangeListener{
//Activity最外层的Layout视图
private View rootView
//屏幕高度
private int screenHeight = 0
//软件盘d起后所占高度阀值 一般是占用屏幕的1/3
private int keyHeight = 0
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
rootView = findViewById(R.id.root_layout)
//获取屏幕高度
screenHeight = this.getWindowManager().getDefaultDisplay().getHeight()
//阀值设置为屏幕高度的1/3
keyHeight = screenHeight/3
}
@Override
protected void onResume() {
super.onResume()
//添加layout大小发生改变监听器
rootView.addOnLayoutChangeListener(this)
}
@Override
public void onLayoutChange(View v, int left, int top, int right,int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
//old是改变前的左上右下坐标点值,没有old的是改变后的左上右下坐标点值
// System.out.println(oldLeft + " " + oldTop +" " + oldRight + " " + oldBottom)
// System.out.println(left + " " + top +" " + right + " " + bottom)
//现在认为只要控件将Activity向上推的高度超过了1/3屏幕高,就认为软键盘d起
if(oldBottom != 0 &&bottom != 0 &&(oldBottom - bottom >keyHeight)){
Toast.makeText(MainActivity.this, "监听到软键盘d起...", Toast.LENGTH_SHORT).show()
}else if(oldBottom != 0 &&bottom != 0 &&(bottom - oldBottom >keyHeight)){
Toast.makeText(MainActivity.this, "监听到软件盘关闭...", Toast.LENGTH_SHORT).show()
}
}
本文来自:http://m.blog.csdn.net/bear_huangzhen/article/details/45896333
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)