为android创建自定义键盘

时间:2016-08-04 13:01:27

标签: android keyboard android-custom-view android-softkeyboard android-input-method

好吧,你可能已经看过很少的问题,比如要求这个。 但是阅读所有这些问题/答案以及Google中几乎所有的android输入法网页,我仍然遇到麻烦。

我的最终目标是创建自定义键盘。但是,当然,我的特定语言会有特殊的输入法。

但是这一次,我想要的是在弹出键盘时显示我的自定义视图。我设法根据qwerty.xml文件弹出默认布局,就像这样。

XML / qwerty.xml

<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
android:keyWidth="10%p"
android:horizontalGap="0px"
android:verticalGap="0px"
android:keyHeight="60dp"
>
<Row android:rowEdgeFlags="bottom">
    <Key android:codes="999" android:keyLabel="Settings" android:keyWidth="20%" android:keyEdgeFlags="left"/>
    <Key android:codes="44" android:keyLabel="," android:keyWidth="7%p"  />
    <Key android:codes="47" android:keyLabel="/" android:keyWidth="7%p" />
    <Key android:codes="32" android:keyLabel="SPACE" android:keyWidth="30%p" android:isRepeatable="true"/>
    <Key android:codes="-5" android:keyLabel="DEL" android:keyWidth="18%p" android:isRepeatable="true"/>
    <Key android:codes="-4" android:keyLabel="DONE" android:keyWidth="18%p" android:keyEdgeFlags="right"/>
</Row>

在我的扩展InputMethodService的类中,我有这个创建输入视图的代码。

private KeyboardView myKeyView;
private Keyboard keyboard;

@Override
public View onCreateInputView() {
    myKeyView = (KeyboardView)getLayoutInflater().inflate(R.layout.keyboard, null);
    keyboard = new Keyboard(this, R.xml.qwerty);
    myKeyView.setKeyboard(keyboard);
    myKeyView.setOnKeyboardActionListener(this);
    return myKeyView;
}

当然,因为我在将自定义视图应用到源代码时遇到了问题。 我只是在另一方面做了一些努力。当按下xml中的设置键时,

<Key android:codes="999" android:keyLabel="Settings" android:keyWidth="20%" android:keyEdgeFlags="left"/>

它将调用SettingsActivity

@Override
public void onKey(int primaryCode, int[] keyCodes) {
    if(primaryCode == 999) {
        openSettings();
    }
}

public void openSettings()
{
    Intent intent = new Intent(this, WRKeySettings.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
}

直到这里才能很好地工作,但我对这个观点问题很感兴趣。

我从阅读android develpers和一些文章的想法是,我可以扩展KeyboardView来制作我的自定义视图,在这个方法中,我可能能够以某种方式使用onDraw()绘制键。但是我在这方面遇到了很多麻烦。

任何建议都会很高兴。感谢。

1 个答案:

答案 0 :(得分:1)

要自定义键盘,您需要修改xml文件夹中的“qwerty”和布局文件夹中的键盘。我将展示一些例子:

这将在布局文件夹

上进行
#include <QtNetwork>
#include <QStringListModel> // needed for Qt 4
using DataModel = QStringListModel;

class Worker : public QObject {
   Q_OBJECT
   QNetworkAccessManager m_manager;
   QSignalMapper m_mapper;
   // QObject::connect is not clever enough to know that QNetworkReply* is-a QObject*
   Q_SLOT void map(QNetworkReply* reply) { m_mapper.map(reply); }
   Q_SLOT void onFeedRetrieved(QObject * dataModelObject) {
      auto dataModel = qobject_cast<DataModel*>(dataModelObject);
      auto reply = qobject_cast<QNetworkReply*>(m_mapper.mapping(dataModelObject));
      qDebug() << dataModel << reply;
      emit got(reply);
   }
public:
   Worker(QObject * parent = nullptr) : QObject{parent} {
      connect(&m_manager, SIGNAL(finished(QNetworkReply*)), SLOT(map(QNetworkReply*)));
      connect(&m_mapper, SIGNAL(mapped(QObject*)), SLOT(onFeedRetrieved(QObject*)));
   }
   void newRequest(const QUrl & url, DataModel * dataModel) {
      QNetworkRequest request{url};
      auto reply = m_manager.get(request);
      // Ensure a unique mapping
      Q_ASSERT(m_mapper.mapping(dataModel) == nullptr);
      m_mapper.setMapping(reply, dataModel);
   }
   Q_SIGNAL void got(QNetworkReply*);
};

int main(int argc, char ** argv) {
   QCoreApplication app{argc, argv};
   DataModel model;
   Worker worker;
   QObject::connect(&worker, SIGNAL(got(QNetworkReply*)), &app, SLOT(quit()));
   worker.newRequest(
            QUrl{"http://stackoverflow.com/questions/38775573/best-way-to-use-qsignalmapper"},
            &model);
   return app.exec();
}
#include "main.moc"

这是在xml文件夹中进行的:

<?xml version="1.0" encoding="UTF-8"?>
<com.example.keyboard.MyKeyboardView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/keyboard"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:keyPreviewLayout="@layout/preview"
android:keyBackground="@drawable/key_selector"
android:shadowRadius="0.0"
android:keyTextColor="#000000"
/> 

就像你说的,你可以从键盘布局扩展一个类,但它更适用于自定义键盘事件,如onTouch,onLongKeyPress,