自定义键盘(一)
来源:互联网 发布:python 字符 编辑:程序博客网 时间:2024/05/16 11:52
android的键盘各式各样,但未必能够满足我们充满创意的产品。为了让我们很好的配合产品,做个不与产品撕13的技术,在合理打造一款自定义的键盘。
先上代码吧,工具类代码如下
package com.binaryknight.customkeyboard;import android.app.Activity;import android.content.Context;import android.inputmethodservice.Keyboard;import android.inputmethodservice.KeyboardView;import android.text.Editable;import android.view.View;import android.widget.EditText;/** * Created by ${BinaryKnight} on 2017/8/31. */public class KeyboardUtil { private Context ctx; private Activity act; private KeyboardView keyboardView; private Keyboard keyboard;// 字母键盘 private boolean isShowing = false;//键盘是否显示 private EditText ed; public KeyboardUtil(Activity act, Context ctx, EditText edit) { this.act = act; this.ctx = ctx; this.ed = edit; keyboard = new Keyboard(ctx, R.xml.keyboard); keyboardView = (KeyboardView) act.findViewById(R.id.keyboard_view); keyboardView.setKeyboard(keyboard); keyboardView.setEnabled(true); keyboardView.setPreviewEnabled(true); keyboardView.setOnKeyboardActionListener(listener); } private KeyboardView.OnKeyboardActionListener listener = new KeyboardView.OnKeyboardActionListener() { @Override public void swipeUp() { } @Override public void swipeRight() { } @Override public void swipeLeft() { } @Override public void swipeDown() { } @Override public void onText(CharSequence text) { } @Override public void onRelease(int primaryCode) { } @Override public void onPress(int primaryCode) { } @Override public void onKey(int primaryCode, int[] keyCodes) { Editable editable = ed.getText(); int start = ed.getSelectionStart(); if (primaryCode == Keyboard.KEYCODE_DONE) {// 完成 hideKeyboard(); } else if (primaryCode == Keyboard.KEYCODE_DELETE) {// 回退 if (editable != null && editable.length() > 0) { if (start > 0) { editable.delete(start - 1, start); } } } else if (primaryCode == 57419) { // go left if (start > 0) { ed.setSelection(start - 1); } } else if (primaryCode == 57421) { // go right if (start < ed.length()) { ed.setSelection(start + 1); } } else { editable.insert(start, Character.toString((char) primaryCode)); } } }; public void showKeyboard() { int visibility = keyboardView.getVisibility(); if (visibility == View.GONE || visibility == View.INVISIBLE) { keyboardView.setVisibility(View.VISIBLE); isShowing = true; } } public void hideKeyboard() { int visibility = keyboardView.getVisibility(); if (visibility == View.VISIBLE) { keyboardView.setVisibility(View.INVISIBLE); isShowing = false; } } public boolean isShowing() { if (keyboardView.getVisibility() == View.VISIBLE) { return true; } else if (keyboardView.getVisibility() == View.GONE || keyboardView.getVisibility() == View.INVISIBLE) { return false; } return false; }}以上代码不难理解,就是创建一个构造函数,传入上下文,还有该activity实体,以及KeyboardView类的监听,当然还得准备配置我们的xml键盘实体展示。接下来是如何调用了,现在在activity如何调用它呢,方法也很简单:
第一步:我们的布局
<?xml version="1.0" encoding="utf-8"?><RelativeLayout android:id="@+id/rv_all" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="com.binaryknight.customkeyboard.MainActivity" tools:showIn="@layout/activity_main"> <EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content"/> <FrameLayout android:layout_width="match_parent" android:id="@+id/frame_layout" android:layout_height="match_parent"/> <android.inputmethodservice.KeyboardView android:id="@+id/keyboard_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:background="@color/keyboard_bg" android:focusable="true" android:focusableInTouchMode="true" android:keyBackground="@color/keyboard_bg" android:keyPreviewLayout="@layout/keyboard_preview" android:keyTextColor="@color/keyboard_text_color" android:shadowColor="@color/keyboard_bg" android:shadowRadius="0.0" android:visibility="visible"/></RelativeLayout>
第二步:
package com.binaryknight.customkeyboard;import android.os.Build;import android.os.Bundle;import android.support.design.widget.FloatingActionButton;import android.support.design.widget.Snackbar;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.view.Menu;import android.view.MenuItem;import android.view.ViewGroup;import android.widget.EditText;import java.lang.reflect.Method;public class MainActivity extends AppCompatActivity { private EditText editText; private KeyboardUtil keyboardUtil; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } }); initView(); editListener(); } private void initView() { editText = (EditText) findViewById(R.id.editText); setupUI(findViewById(R.id.frame_layout));//判断点击外部键盘消失 } private void editListener() { //Android.EditText点击时,隐藏系统弹出的键盘,显示出光标 (系统版本>5.0) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { editText.setShowSoftInputOnFocus(false); } else { try { final Method method = EditText.class.getMethod( "setShowSoftInputOnFocus" , new Class[]{boolean.class}); method.setAccessible(true); method.invoke(editText, false); } catch (Exception e) { // ignore } } editText.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { int inputback = editText.getInputType(); Log.d("inputback", "inputback" + inputback); // editVin.setInputType(InputType.TYPE_NULL); keyboardUtil = new KeyboardUtil(MainActivity.this, getApplicationContext(), editText); keyboardUtil.showKeyboard(); // inputFilterSpace(editText); editText.setInputType(inputback); return false; } }); } //手机键盘显示 public void setupUI(View view) { //Set up touch listener for non-text box views to hide keyboard. if (!(view instanceof EditText)) { view.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if (isKeyboardShowing()) { closeKeyboard(); } return false; } }); } //If a layout container, iterate over children and seed recursion. if (view instanceof ViewGroup) { for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { View innerView = ((ViewGroup) view).getChildAt(i); setupUI(innerView); } } } public boolean isKeyboardShowing() { if (keyboardUtil != null) { return keyboardUtil.isShowing(); } return false; }//键盘的收起 public void closeKeyboard() { if (keyboardUtil != null) { keyboardUtil.hideKeyboard(); } }}
相信聪明的你,一定很简单的就能看懂怎么操作了,我们已经完成了一次伟大的键盘定义了,让我们看看效果图吧:
不知道是不是你喜欢符合你的自定义键盘呢,下一节我们将写一个用dialog伪装的自定义键盘吧
源码下载
阅读全文
2 0
- 自定义键盘(一)
- iOS开发之自定义键盘(一)
- 自定义键盘
- 自定义键盘
- 自定义键盘
- 键盘自定义
- 自定义键盘
- 自定义键盘
- 自定义键盘
- 自定义键盘
- 自定义键盘
- 自定义键盘
- 自定义键盘
- 自定义键盘
- 自定义键盘
- LatinIME键盘绘制(一)
- 自定义数字密码键盘(6位)
- (三十二)DatePicker和自定义键盘
- 网络随笔(四)------session和cookie的区别
- 发布本地项目到Lunix测试服务器
- css浮动及清除浮动
- https 请求的url含中文参数 配置server.xml解决
- 小白成长记——Android基础之Activity四种启动模式
- 自定义键盘(一)
- MyEclipse 2014破解补丁+教程
- TF-IDF及其算法
- 什么是数据库管理系统?
- scala提取器详解
- 【opencv】基于opencv实现运动目标检测之帧差法
- 我自己的云主机的服务启动(每次重启)
- 数据库SQLite 数据大量存储 和快速读取 链表查询的优化 使用gosn
- linux一些基础命令