Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何更改软键盘';运行时的高度是多少?_Android_Keyboard - Fatal编程技术网

Android 如何更改软键盘';运行时的高度是多少?

Android 如何更改软键盘';运行时的高度是多少?,android,keyboard,Android,Keyboard,我正在设计一个软键盘,我想在运行时改变它的高度,让用户在横向和纵向模式之间进行选择。我知道如何在xml中更改键的高度,但我需要动态更改 我唯一想到的是从键盘子类化,并覆盖其设置键高度(int高度),但它似乎没有用,因为整个键盘不再响应我的点击和高度(尽管与以前不同)不关心上述函数中的“高度” 有什么想法/解决办法吗 最初的解决方案发布在,但没有解释,所以在这里我对其进行了一些扩展 1) 创建一个新类,该类扩展覆盖getHeight()方法的键盘类 注意:这里的数字3是您的总行数,如果您的键盘有5

我正在设计一个软键盘,我想在运行时改变它的高度,让用户在横向和纵向模式之间进行选择。我知道如何在xml中更改键的高度,但我需要动态更改

我唯一想到的是从键盘子类化,并覆盖其设置键高度int高度),但它似乎没有用,因为整个键盘不再响应我的点击和高度(尽管与以前不同)不关心上述函数中的“高度”


有什么想法/解决办法吗

最初的解决方案发布在,但没有解释,所以在这里我对其进行了一些扩展

1) 创建一个新类,该类扩展覆盖getHeight()方法的键盘类

注意:这里的数字3是您的总行数,如果您的键盘有5行,请输入5

如果每行的键盘行高度不同,则需要自己计算并返回总高度(单位为像素,我花了一段时间才确定不是dp,因此需要将dp转换为像素进行所有计算),例如:

@Override
public int getHeight() {
   return row1Height + row2Height + row3Height + row4Height + row5Height;
}
2) 在同一类中创建新的公共函数

public void changeKeyHeight(double height_modifier)
{
   int height = 0;
   for(Keyboard.Key key : getKeys()) {
      key.height *= height_modifier;
      key.y *= height_modifier;
      height = key.height;
   }
   setKeyHeight(height);
   getNearestKeys(0, 0); //somehow adding this fixed a weird bug where bottom row keys could not be pressed if keyboard height is too tall.. from the Keyboard source code seems like calling this will recalculate some values used in keypress detection calculation
}
若并没有使用“高度”修改器,而是设置为“特定高度”,则需要自己计算key.y位置

如果每行的键盘行高度不同,则可能需要检查键,确定它所属的行,并将高度设置为正确值,否则键将相互重叠。还将行高度存储在专用变量中,以便在上面的getHeight()中使用。PS:在某些配置中,我在更改键盘高度后无法按最下面一行键,我发现调用getNearestKeys()可以解决这个问题,尽管我不太清楚原因

注意:key.y是键的y位置,坐标0从键盘顶部开始,随着值的增加而下降。e、 g.从键盘顶部将100个点坐标到100个像素:)

3) 最后一步是在扩展InputMethodService的主类中调用changeKeyHeight。在开始输入视图()内部执行(覆盖),因为在更改高度(通过首选项或其他方式)后,键盘应该在此处重新绘制

如果您正在查看Android软键盘示例项目,它将如下所示:

@Override public void onStartInputView(EditorInfo attribute, boolean restarting) {
   super.onStartInputView(attribute, restarting);

   // Change the key height here dynamically after getting your value from shared preference or something
   mCurKeyboard.changeKeyHeight(1.5);

   // Apply the selected keyboard to the input view.
   mInputView.setKeyboard(mCurKeyboard);
   mInputView.closing();        

   final InputMethodSubtype subtype = mInputMethodManager.getCurrentInputMethodSubtype();
   mInputView.setSubtypeOnSpaceKey(subtype);
}
干杯

额外:如果您需要dp到像素转换器,以下是代码:

private int convertDpToPx(int dp)
{
   return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics());
}

我在Android 6上使用以下代码:

private void adjustKeyboardKeyHeight (MyKeyboard keyboard, int newKeyHeight) {
   int oldKeyHeight = keyboard.getKeyHeight();
   int verticalGap = keyboard.getVerticalGap();
   int rows = 0;
   for (Keyboard.Key key : keyboard.getKeys()) {
      key.height = newKeyHeight;
      int row = (key.y + verticalGap) / (oldKeyHeight + verticalGap);
      key.y = row * newKeyHeight + (row - 1) * verticalGap;
      rows = Math.max(rows, row + 1);
      }
   keyboard.setHeight(rows * newKeyHeight + (rows - 1) * verticalGap);
}

private static class MyKeyboard extends Keyboard {
   private int height;
   MyKeyboard (Context context, int xmlLayoutResId) {
      super(context, xmlLayoutResId);
      height = super.getHeight();
   }
   @Override public int getKeyHeight() {
      return super.getKeyHeight();
   }
   @Override public int getVerticalGap() {
      return super.getVerticalGap();
   }
   public void setHeight (int newHeight) {
      height = newHeight;
   }
   @Override public int getHeight() {
      return height;
   }
}

布鲁斯的解决方案不再有效了。调整大小后,底部关键点停止响应。看看Keyboard.java:

    public int[] getNearestKeys(int x, int y) {
        if (mGridNeighbors == null) computeNearestNeighbors();
因此getNearestKeys不会触发任何计算,computeNearestNeighbors()不会被多次调用(而且它是私有的,所以不能直接调用)

我没有更改现有对象的大小,而是修改了键盘。键类:

     public class FTKey extends Keyboard.Key {
        FTKey(Resources res, Keyboard.Row parent, int x, int y, XmlResourceParser parser) {
        super(res, parent, x, y, parser);

        this.height = (int) (height * FTPref.yScale);
        this.y = this.height * FTPref.yScale; // This works only if all rows of the same height
    }
在onStartInput()中,我每次都重新创建所有键盘对象:

FTPref.yScale = 0.7f;
mEnglishKeyboard = new FTKeyboard(this ...
mRussianKeyboard = new FTKeyboard(this ...
仍然需要重写getHeight()以计算键盘总高度


使用不同高度的关键点会很棘手,因为您不仅要计算总高度,还要计算每个按钮的y位置,这取决于前几行的高度。

我也在努力解决这个问题。调用setKeysHeight和setKeysWidth似乎没有任何作用。。在的答案似乎部分有效,但我仍然无法改变键盘高度!我最终为我需要的每个键盘定义了单独的布局,然后根据需要设置KeyboardView.setKeyboard(…)。这样,每个需要不同键高的键盘都有一个不同的键盘对象。不确定你是否还需要它,但我已经让它工作了,现在输入答案嘿,约瑟夫,我想知道你的键盘是否工作了,我目前正在寻找一种解决方案,通过不同的布局改变键盘高度,或者按照答案中所述改变高度,我想知道我是否可以专门为我的应用程序定义一个键盘视图,或者我是否必须创建一个单独的键盘来实现这一点。如果你能分享一些你是如何做到这一点的知识,那就太好了。谢谢。如何获取每行的高度。我在不同的赛道上使用不同的高度,mInputView在这里是什么?不再起作用了。调整大小后,底部关键点停止响应。我检查了KeyboardView源代码,由于“if(mgridneights==null)”检查,getNearestKeys似乎不会触发任何重新计算。
FTPref.yScale = 0.7f;
mEnglishKeyboard = new FTKeyboard(this ...
mRussianKeyboard = new FTKeyboard(this ...