Замена клавиатуры Android

Можно ли встроить веб-представление в приложение для замены клавиатуры Android?

У меня есть интерфейс, написанный на javascript, и я хотел бы встроить его в приложение для замены клавиатуры Android. Он должен иметь возможность обнаруживать события касания и отправлять текстовые строки обратно в собственный пользовательский интерфейс из веб-представления.

Я искал это в Google, но не могу найти информацию о том, как создать веб-представление в приложении для замены клавиатуры.


РЕДАКТИРОВАТЬ: Создан проект github для шаблона на основе ответа @ckozl

https://github.com/billymoon/javascript-android-keyboard-boilerplate


person Billy Moon    schedule 07.02.2012    source источник
comment
Итак, давайте разберемся, у вас есть, скажем, клавиатура HTML/JS в вашем веб-просмотре. и хотите, чтобы он отправлял данные на ваше устройство Android?   -  person Maikel Bollemeijer    schedule 16.02.2012
comment
в этом случае для веб-просмотра это не казалось необходимым (по моему эксперименту)   -  person necromancer    schedule 19.06.2012


Ответы (1)


Да. Короче говоря. Не лучшая идея, но технически осуществимая. Позвольте мне показать вам краткий пример проекта, адаптированный из примера SoftKeyboard, включенного в Android SDK. Теперь есть ряд других технических проблем, которые нужно решить, но это должно дать вам основную отправную точку....

Для начала давайте создадим базовую раскладку для использования в качестве клавиатуры:

\res\layout\input.xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>

    <WebView
      android:id="@+id/myWebView"
      android:layout_width="match_parent"
      android:layout_height="600dp"
    />

</FrameLayout>

это требуется Android, чтобы принять наш IME

\res\xml\method.xml:

<?xml version="1.0" encoding="utf-8"?>
<input-method xmlns:android="http://schemas.android.com/apk/res/android"  />

теперь в наш манифест \AndroidManifest.xml

<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.android.softkeyboard">

    <uses-sdk android:minSdkVersion="13" android:targetSdkVersion="13" />
    <uses-permission android:name="android.permission.INTERNET" />

    <application android:label="SoftKeyboard">

        <service 
            android:name="SoftKeyboard"
            android:permission="android.permission.BIND_INPUT_METHOD"
        >
            <intent-filter>
                <action android:name="android.view.InputMethod" />
            </intent-filter>

            <meta-data android:name="android.view.im" android:resource="@xml/method" />      
        </service>
    </application>
</manifest>

очевидно, что uses-sdk и user-permission зависят от приложения и не требуются для этого кода (я не использую здесь какие-либо интернет-файлы, но вы могли бы, я проверил это, и это сработало...)

теперь определите простую клавиатуру \src...\SoftKeyboard.java:

package com.example.android.softkeyboard;

import android.inputmethodservice.InputMethodService;
import android.inputmethodservice.KeyboardView;
import android.view.View;
import android.webkit.WebView;

public class SoftKeyboard extends InputMethodService implements KeyboardView.OnKeyboardActionListener {

    private WebView myWebView = null;

    @Override 
    public View onCreateInputView() {

        View view = getLayoutInflater().inflate(R.layout.input, null);
        myWebView = (WebView) view.findViewById(R.id.myWebView);
        myWebView.getSettings().setJavaScriptEnabled(true);
        myWebView.addJavascriptInterface(jsInterface, "android");

        return view;
    }

    private Object jsInterface = new Object() {

        @SuppressWarnings("unused")
        public void sendKeys() {
            getCurrentInputConnection().setComposingText("how do ya like me now?", 1);
        }

    };

    @Override
    public void onWindowShown() {

        super.onWindowShown();      
        myWebView.loadUrl("file:///android_asset/keyboard_test.html");
    }

    @Override
    public void onKey(int primaryCode, int[] keyCodes) {}

    @Override
    public void onPress(int primaryCode) {}

    @Override
    public void onRelease(int primaryCode) {}

    @Override
    public void onText(CharSequence text) {}

    @Override
    public void swipeDown() {}

    @Override
    public void swipeLeft() {}

    @Override
    public void swipeRight() {}

    @Override
    public void swipeUp() {}

}

здесь мы в основном создаем веб-просмотр, затем заполняем его из файла ресурсов и привязываем к нему простой интерфейс после включения javascript.

вот HTML-код актива: *\assets\keyboard_test.html*

<!DOCTYPE html>
<html>
<head>
<title>test</title>
<style>
button {

    display:block;
    margin:300px auto;
    width:400px;
    padding:60px;

}
</style>
</head>
<body>

<button onclick="android.sendKeys()">yeah buddy!</button>

</body>
</html>

и все, запустите его, и вы получите клавиатуру с одной кнопкой, и когда вы нажмете ее, javascript отправит текст в композитор ввода...

надеюсь, что это поможет -ck

person ckozl    schedule 20.02.2012
comment
Спасибо за очень подробный ответ. Я еще не проверял код, но похоже, что это именно то, что мне нужно. Спасибо за предоставление полных комментариев/демонстрации. Я, вероятно, размещу это как рабочую демонстрацию на github, чтобы другие люди могли использовать ее в качестве базы. - person Billy Moon; 21.02.2012
comment
Помимо проблем с производительностью (о которых мне хорошо известно), есть ли какие-либо другие проблемы, которые делают мой план плохой идеей? - person Billy Moon; 21.02.2012
comment
Производительность является основной причиной, клавиатуры должны быть легкими с очень простыми раскладками (это означает, что раскладка xml должна быть несложной, а не сама раскладка клавиатуры), чтобы они быстро загружались и очень быстро реагировали. Мой опыт работы с WebView заключается в том, что он нестабилен, медленен и тяжел. Я сделал приложение, которое на самом деле имело собственную клавиатуру, которая управляла рисованием на <canvas> (хотя клавиатура была встроена в приложение, а не всплывающее окно), и когда оно было встроено в WebView, оно не отвечало и казалось неуклюжим. [....продолжение....] - person ckozl; 21.02.2012
comment
После того, как часть приложения с клавиатурой была повторно реализована с использованием собственных конструкций пользовательского интерфейса (java/xml), оно стало в 10 раз более отзывчивым и быстрым. Просто лучший UX в целом. Однако, возможно, ICS и возможная интеграция с Chrome решат некоторые из этих проблем -ck - person ckozl; 21.02.2012
comment
У меня были проблемы с холстом. Было бы здорово, если бы он работал хорошо, но кажется немного тяжелым. Я делаю довольно простой интерфейс, который просто меняет местами несколько изображений и обнаруживает сенсорные события, которые, похоже, работают нормально. Вы будете рады узнать, что все это реализовано и работает так, как ожидалось, даже с моим собственным кодом javascript. Большое спасибо за этот ответ, я потерялся без него. - person Billy Moon; 21.02.2012
comment
np, если вы в конечном итоге опубликуете приложение или откроете исходный код на github или что-то в этом роде, вам придется вернуться сюда и поделиться ссылкой, потому что я не могу отрицать, что мне любопытно, что вы собираетесь производить с это... И <canvas> не было медленным (если вы не включили аппаратное ускорение, иронично, верно?), была просто заметная задержка между касанием и событием касания на обычных элементах DOM... -ck - person ckozl; 21.02.2012
comment
К сожалению, проект, над которым я работаю, не может быть с открытым исходным кодом, но я планирую объединить ваш ответ в демо-версию Google SoftKeyboard и добавить небольшую документацию, чтобы люди могли использовать ее в качестве шаблона для своих собственных клавиатур на основе javascript. Я выложу это на github и поделюсь ссылкой здесь. Надеюсь, люди потом добавят шаблон, так как в написании приложений для клавиатуры много сложных деталей. Я мог бы сделать там клавиатуру с азбукой Морзе, чтобы люди могли видеть, как она работает. - person Billy Moon; 21.02.2012
comment
Это необходимо: implements KeyboardView.OnKeyboardActionListener? - person necromancer; 19.06.2012
comment
@agksmehx это интерфейс IME для ключевых событий и жестов, поэтому я думаю, что ответ на ваш вопрос: может быть, это зависит от того, что вы делаете, но в целом я не считаю, что это требуется для метода ввода. принято как таковое... вы всегда можете проверить и посмотреть, что произойдет.... -ck - person ckozl; 19.06.2012