- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在我的 Android 应用程序中创建一个自定义键盘,如下所示:
https://www.dropbox.com/s/vwiz4o3pd8q4o81/2015-06-14%2014.53.02.jpg?dl=0
我尝试使用键盘 View ,但无法获得我想要的。我还查看了有关自定义键盘的在线教程,但似乎没有人给出有关如何制作我想要的键盘的提示。我试过将 png 图像作为键盘的背景,但这没有帮助。到目前为止,我已经做到了:
https://www.dropbox.com/s/xrm4v941ofecmut/2015-06-14%2014.54.10.jpg?dl=0
我能否获得有助于解决我的问题的帮助或指向教程和代码的链接。
这是我当前的代码:
<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
android:keyWidth="14.25%p"
android:hapticFeedbackEnabled="true"
android:keyHeight="8.5%p">
<!--
android:horizontalGap="0.50%p"
android:verticalGap="0.50%p"
NOTE When we add a horizontalGap in pixels, this interferes with keyWidth in percentages adding up to 100%
NOTE When we have a horizontalGap (on Keyboard level) of 0, this make the horizontalGap (on Key level) to move from after the key to before the key... (I consider this a bug)
-->
<Row>
<Key android:codes="-1" android:keyLabel="EVALUATE" android:keyWidth="42.75%p" android:keyEdgeFlags="left" />
<Key android:codes="-100" android:keyLabel="RESET" android:keyWidth="28.50%p" />
<Key android:codes="-1000" android:keyLabel="\u24D8" android:keyWidth="28.50%p" android:keyEdgeFlags="right" />
</Row>
<Row>
<Key android:codes="1" android:keyLabel="sin" android:keyEdgeFlags="left" />
<Key android:codes="2" android:keyLabel="cos" />
<Key android:codes="3" android:keyLabel="tan" />
<Key android:codes="36" android:keyLabel="sinh" />
<Key android:codes="37" android:keyLabel="cosh" />
<Key android:codes="38" android:keyLabel="tanh" />
<Key android:codes="-2" android:keyIcon="@drawable/delete_symbol" android:isRepeatable="true" android:keyEdgeFlags="right"/>
</Row>
<Row>
<Key android:codes="4" android:keyLabel="asin" android:keyEdgeFlags="left" />
<Key android:codes="5" android:keyLabel="acos" />
<Key android:codes="6" android:keyLabel="atan" />
<Key android:codes="42" android:keyLabel="asinh" />
<Key android:codes="43" android:keyLabel="acosh" />
<Key android:codes="44" android:keyLabel="atanh" />
<Key android:codes="21" android:keyLabel="\u00F7" android:keyEdgeFlags="right" />
</Row>
<Row>
<Key android:codes="7" android:keyLabel="cosec" android:keyEdgeFlags="left" />
<Key android:codes="8" android:keyLabel="sec" />
<Key android:codes="9" android:keyLabel="cot" />
<Key android:codes="33" android:keyLabel="7" />
<Key android:codes="34" android:keyLabel="8" />
<Key android:codes="35" android:keyLabel="9" />
<Key android:codes="20" android:keyLabel="\u00D7" android:keyEdgeFlags="right" />
</Row>
<Row>
<Key android:codes="11" android:keyLabel="e^(" />
<Key android:codes="12" android:keyLabel="ln(" />
<Key android:codes="22" android:keyLabel="x\u207F" />
<Key android:codes="30" android:keyLabel="4" />
<Key android:codes="31" android:keyLabel="5" />
<Key android:codes="32" android:keyLabel="6" />
<Key android:codes="19" android:keyLabel="\u2212" android:keyEdgeFlags="right" />
</Row>
<Row>
<Key android:codes="14" android:keyLabel="k" android:keyEdgeFlags="left" />
<Key android:codes="15" android:keyLabel="\u03C0" />
<Key android:codes="13" android:keyIcon="@drawable/italic_x" />
<Key android:codes="27" android:keyLabel="1" />
<Key android:codes="28" android:keyLabel="2" />
<Key android:codes="29" android:keyLabel="3" />
<Key android:codes="18" android:keyLabel="+" android:keyEdgeFlags="right" />
</Row>
<Row>
<Key android:codes="-3" android:keyIcon="@drawable/keyboard_done" android:keyWidth="28.5%p" android:keyEdgeFlags="left" />
<Key android:codes="10" android:keyLabel="\u221a" />
<Key android:codes="16" android:keyLabel="(" />
<Key android:codes="26" android:keyLabel="0" />
<Key android:codes="17" android:keyLabel=")" />
<Key android:codes="23" android:keyLabel="." android:keyEdgeFlags="right" />
</Row>
</Keyboard>
xml 文件的 java 处理程序代码是:
class CustomKeyboard {
private Activity mHostActivity;
private Button doneButton = null;
private Button clearButton = null;
private Button infoButton = null;
/** The key (code) handler. */
private OnKeyboardActionListener mOnKeyboardActionListener = new OnKeyboardActionListener() {
public final static int CodeEvaluate = -1;
public final static int CodeClear = -100;
public final static int CodeInfo = -1000;
public final static int CodeDelete = -2; // Keyboard.KEYCODE_DELETE
public final static int CodeHide = -3; // Keyboard.KEYCODE_CANCEL
public final static int CodeMINIMUM = 0;
public final static int CodeSin = 1;
public final static int CodeCos = 2;
public final static int CodeTan = 3;
public final static int CodeAsin = 4;
public final static int CodeAcos = 5;
public final static int CodeAtan = 6;
public final static int CodeCosec = 7;
public final static int CodeSec = 8;
public final static int CodeCot = 9;
public final static int CodeSqrt = 10;
public final static int CodeExp = 11;
public final static int CodeLn = 12;
public final static int CodeX = 13;
public final static int CodeK = 14;
public final static int CodePI = 15;
public final static int CodeOpenB = 16;
public final static int CodeCloseB = 17;
public final static int CodePlus = 18;
public final static int CodeMinus = 19;
public final static int CodeMultiply = 20;
public final static int CodeDivide = 21;
public final static int CodePower = 22;
public final static int CodePoint = 23;
public final static int CodeABC = 24;
public final static int CodeSpace = 25;
public final static int CodeMAXIMUM = 50; // maximum number of Keys
public String[] keyCodeToText = null;
public void keysInitialise()
{
if(keyCodeToText==null) keyCodeToText = new String[CodeMAXIMUM];
keyCodeToText[CodeSin] = "sin(";
keyCodeToText[CodeCos] = "cos(";
keyCodeToText[CodeTan] = "tan(";
keyCodeToText[CodeAsin] = "asin(";
keyCodeToText[CodeAcos] = "acos(";
keyCodeToText[CodeAtan] = "atan(";
keyCodeToText[CodeCosec] = "cosec(";
keyCodeToText[CodeSec] = "sec(";
keyCodeToText[CodeCot] = "cot(";
keyCodeToText[CodeSqrt] = "sqrt(";
keyCodeToText[CodeExp] = "e^(";
keyCodeToText[CodeLn] = "ln(";
keyCodeToText[CodeX] = "x";
keyCodeToText[CodeK] = "k";
keyCodeToText[CodePI] = "pi";
keyCodeToText[CodeOpenB] = "(";
keyCodeToText[CodeCloseB] = ")";
keyCodeToText[CodePlus] = "+";
keyCodeToText[CodeMinus] = "-";
keyCodeToText[CodeMultiply] = "*";
keyCodeToText[CodeDivide] = "/";
keyCodeToText[CodePower] = "^";
keyCodeToText[CodePoint] = ".";
keyCodeToText[CodeABC ] = "";
}
@Override
public void onKey(int primaryCode, int[] keyCodes) {
// Get the EditText and its Editable
View focusCurrent = mHostActivity.getWindow().getCurrentFocus();
if( focusCurrent==null || focusCurrent.getClass()!=EditText.class ) return;
EditText edittext = (EditText) focusCurrent;
Editable editable = edittext.getText();
int start = edittext.getSelectionStart();
keysInitialise();
// Apply the key to the edittext
if(primaryCode == CodeEvaluate) {
if(doneButton != null) doneButton.performClick();
}
else if (primaryCode == CodeClear){
if(clearButton != null) clearButton.performClick();
}
else if (primaryCode == CodeInfo){
if(infoButton != null) infoButton.performClick();
}
else if(primaryCode ==CodeDelete) {
if( editable!=null && start>0 ) editable.delete(start - 1, start);
}
else if(primaryCode == CodeHide) {
hideCustomKeyboard();
}
else if(primaryCode > CodeMINIMUM && primaryCode < CodeMAXIMUM) {
editable.insert(start, keyCodeToText[primaryCode]);
}
else editable.insert(start, Integer.toString(primaryCode));
}
@Override public void onPress(int arg0) {
}
@Override public void onRelease(int primaryCode) {
}
@Override public void onText(CharSequence text) {
}
public CustomKeyboard(Activity host, int viewid, int layoutid) {
mHostActivity= host;
mKeyboardView= (KeyboardView)mHostActivity.findViewById(viewid);
mKeyboardView.setKeyboard(new Keyboard(mHostActivity, layoutid));
mKeyboardView.setPreviewEnabled(false); // NOTE Do not show the preview balloons
mKeyboardView.setOnKeyboardActionListener(mOnKeyboardActionListener);
}
/** Returns whether the CustomKeyboard is visible. */
public boolean isCustomKeyboardVisible() {
return mKeyboardView.getVisibility() == View.VISIBLE;
}
/** Make the CustomKeyboard visible, and hide the system keyboard for the given view. */
public void showCustomKeyboard(View v) {
mKeyboardView.setVisibility(View.VISIBLE);
mKeyboardView.setEnabled(true);
}
/** Make the CustomKeyboard invisible. */
public void hideCustomKeyboard() {
mKeyboardView.setVisibility(View.GONE);
mKeyboardView.setEnabled(false);
}
/** Hide standard keyboard */
private void hideStandardKeyboard(View v) {
if(v != null) ((InputMethodManager)mHostActivity.getSystemService(Activity.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(v.getWindowToken(), 0);
}
/** Register the doneButton for which doneButton.performClick()
* will be called when the "Done" keypad-button is clicked.
*/
public void registerDoneButton (Button doneButton) {
this.doneButton = doneButton;
}
public void registerClearButton (Button clearButton) {
this.clearButton = clearButton;
}
public void registerInfoButton (Button infoButton) {
this.infoButton = infoButton;
}
/**
* Register <var>EditText<var> for using this custom keyboard.
*
* @param The EditText that registers to the custom keyboard.
*/
public void registerEditText(EditText edittext) {
// Make the custom keyboard appear or disappear
edittext.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus) showCustomKeyboard(v);
else hideCustomKeyboard();
}
});
edittext.setOnClickListener(new OnClickListener() {
@Override public void onClick(View v) {
showCustomKeyboard(v);
}
});
edittext.setOnTouchListener(new OnTouchListener() {
@Override public boolean onTouch(View v, MotionEvent event) {
((EditText) v).onTouchEvent(event);
hideStandardKeyboard(v);
return true; // Consume touch event
}
});
}
最佳答案
由于您拥有键盘的布局 xml,因此要使您的键盘与第一张图片中显示的键盘相同。您应该有键 View 的背景并将其添加到每个键。
关于android - 在android中创建自定义键盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30830182/
我最近在/ drawable中添加了一些.gifs,以便可以将它们与按钮一起使用。这个工作正常(没有错误)。现在,当我重建/运行我的应用程序时,出现以下错误: Error: Gradle: Execu
Android 中有返回内部存储数据路径的方法吗? 我有 2 部 Android 智能手机(Samsung s2 和 s7 edge),我在其中安装了一个应用程序。我想使用位于这条路径中的 sqlit
这个问题在这里已经有了答案: What's the difference between "?android:" and "@android:" in an android layout xml f
我只想知道 android 开发手机、android 普通手机和 android root 手机之间的实际区别。 我们不能从实体店或除 android marketplace 以外的其他地方购买开发手
自Gradle更新以来,我正在努力使这个项目达到标准。这是一个团队项目,它使用的是android-apt插件。我已经进行了必要的语法更改(编译->实现和apt->注释处理器),但是编译器仍在告诉我存在
我是android和kotlin的新手,所以请原谅要解决的一个非常简单的问题! 我已经使用导航体系结构组件创建了一个基本应用程序,使用了底部的导航栏和三个导航选项。每个导航选项都指向一个专用片段,该片
我目前正在使用 Facebook official SDK for Android . 我现在正在使用高级示例应用程序,但我不知道如何让它获取应用程序墙/流/状态而不是登录的用户。 这可能吗?在那种情
我在下载文件时遇到问题, 我可以在模拟器中下载文件,但无法在手机上使用。我已经定义了上网和写入 SD 卡的权限。 我在服务器上有一个 doc 文件,如果用户单击下载。它下载文件。这在模拟器中工作正常但
这个问题在这里已经有了答案: What is the difference between gravity and layout_gravity in Android? (22 个答案) 关闭 9
任何人都可以告诉我什么是 android 缓存和应用程序缓存,因为当我们谈论缓存清理应用程序时,它的作用是,缓存清理概念是清理应用程序缓存还是像内存管理一样主存储、RAM、缓存是不同的并且据我所知,缓
假设应用程序 Foo 和 Eggs 在同一台 Android 设备上。任一应用程序都可以获取设备上所有应用程序的列表。一个应用程序是否有可能知道另一个应用程序是否已经运行以及运行了多长时间? 最佳答案
我有点困惑,我只看到了从 android 到 pc 或者从 android 到 pc 的例子。我需要制作一个从两部手机 (android) 连接的 android 应用程序进行视频聊天。我在想,我知道
用于使用 Android 以编程方式锁定屏幕。我从 Stackoverflow 之前关于此的问题中得到了一些好主意,并且我做得很好,但是当我运行该代码时,没有异常和错误。而且,屏幕没有锁定。请在这段代
文档说: android:layout_alignParentStart If true, makes the start edge of this view match the start edge
我不知道这两个属性和高度之间的区别。 以一个TextView为例,如果我将它的layout_width设置为wrap_content,并将它的width设置为50 dip,会发生什么情况? 最佳答案
这两个属性有什么关系?如果我有 android:noHistory="true",那么有 android:finishOnTaskLaunch="true" 有什么意义吗? 最佳答案 假设您的应用中有
我是新手,正在尝试理解以下 XML 代码: 查看 developer.android.com 上的文档,它说“starStyle”是 R.attr 中的常量, public static final
在下面的代码中,为什么当我设置时单选按钮的外观会发生变化 android:layout_width="fill_parent" 和 android:width="fill_parent" 我说的是
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
假设我有一个函数 fun myFunction(name:String, email:String){},当我调用这个函数时 myFunction('Ali', 'ali@test.com ') 如何
我是一名优秀的程序员,十分优秀!