Отображение символов в edroidxt android

Я хочу сделать свой edittext похожим, когда я пишу символ "g", связанный с ним соответствующий пользовательский символ должен быть написан как на хинди "जी"

Я думаю, что должно быть отображение символов, но без знания кто-нибудь может мне помочь как это сделать

Другое приложение https://play.google.com/store/apps/details?id=nichetech.hindi.editor также делает то же, что и в этом случае, доступен вариант офлайн и онлайн

Интернет работает с помощью переводчика google, но если я выберу "Оффлайн", тогда запись происходит так, как это делается

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

enter image description here

Спасибо

Есть ли способ, которым я пишу на английском языке, и связанный с ним символ сопоставления будет записан только в EditText моего приложения.

Делает ли кто-нибудь подобное, пожалуйста, помогите мне, как это сделать

Ответ 1

Чтобы выполнить то, что вам нужно, я бы создал HashMap символов, которые сопоставляются с другими символами. Если какой-то конкретный char не отображается, просто распечатайте его. Вот пример, который я поставил:

final HashMap<Character, Character> charMap = new HashMap<Character, Character>();
charMap.put('q', '1');
charMap.put('w', '2');
charMap.put('e', '3');
charMap.put('r', '4');
charMap.put('t', '5');
charMap.put('y', '6');

final EditText editText = (EditText) findViewById(R.id.editText);

editText.addTextChangedListener(new TextWatcher() {
    boolean replaced;

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        Log.e("TAG", start + " " + before + " " + count);
        // Check in lower case
        String oldStr = s.toString().toLowerCase();
        StringBuilder newStr = new StringBuilder(s);

        // Loop through changed chars
        for (int i = 0; i < count; i++) {
            // Replace if a substitution is avaiable
            Character replacement = charMap.get(oldStr.charAt(start + i));
            if (replacement != null) {
                replaced = true;
                newStr.setCharAt(start + i, replacement);
            }
        }

        if (replaced) {
            replaced = false;
            editText.setText(newStr);
            // Move cursor after the new chars
            editText.setSelection(start + count);
        }

    }

    @Override
    public void afterTextChanged(Editable s) {

    }
});

Плюсы:

  • Игнорирует случай при поиске замены. (q = Q = 1)
  • Заменяет сразу одно и несколько символов
  • Не зацикливает всю строку
  • Можно заменить в середине другой строки

Минусы:

  • У вас должна быть запись HashMap для каждого символа, который вы хотите заменить.
  • ...

В качестве побочной заметки я бы назвал несколько ограничений, которые у вашего приложения "онлайн-версия":

  • Преобразование выполняется только при вводе пробела, новой строки или знака препинания.
  • Вы не можете добавлять буквы к уже преобразованным словам.

В приложениях "автономная" версия также имеет незначительную ошибку:

  • Он не конвертирует слова, которые скопированы или написаны с помощью Swipe

Ответ 2

Я думаю, вам лучше смотреть на создание собственного *.ttf файла со всеми символьными сопоставлениями. Вы можете просто установить его на свой EditText (или любой текстовый виджет, который вы используете). Шрифты TTF приветствуются в каталоге assets/(или любой каталог, который вы можете прочитать). Вы можете создать объект Typeface с помощью:

Typeface.createFromAsset(AssetManager mgr, String path)

и установите его с помощью:

textView.setTypeface(mTypeface);

Ответ 3

Файлы ключевых символов (файлы .kcm) отвечают за сопоставление комбинаций кодов клавиш Android с модификаторами с символами Юникода. Файлы разметки ключевых слов необходимы для всех внутренних (встроенных) устройств ввода, имеющих ключи, если только чтобы сообщить системе, что устройство предназначено только для специальных целей (не полная клавиатура).

Файлы макетов ключей, специфичные для устройства, являются необязательными для внешних клавиатур и часто вообще не нужны. Система предоставляет общую карту символов, которая подходит для многих внешних клавиатур.

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

Ключевые файлы с символьной картой расположены по идентификатору поставщика USB, продукту (и опциональной версии) или по имени устройства ввода.

Ключевые файлы с символьной картой расположены по идентификатору поставщика USB, продукту (и опциональной версии) или по имени устройства ввода.

Предположим, что пользователь нажал A и SHIFT вместе. Сначала система обнаруживает набор свойств и поведения, связанных с KEYCODE_A.

ключ A {   label: 'A'   base: 'a'   shift, caplock: 'A'   ctrl, alt, meta: none }

ey ESCAPE {   основание: резервное НАЗАД   alt, meta: резервный ДОМ   ctrl: резервное МЕНЮ }

ключ A {   label: 'A'   номер 2'   base: 'a'   shift, caplock: 'A'   alt: '#'   shift + alt, caplock + alt: none }

ключ SPACE {   метка:' '   номер: ' '   база: ' '   сдвиг:' '   alt: '\ uef01'   shift + alt: '\ uef01' }

Ответ 4

public void MapCharacter() {
    this.singleChar.put((Object)"a", (Object)"\u0905");
    this.singleChar.put((Object)"b", (Object)"\u092c");
    this.singleChar.put((Object)"c", (Object)"\u091a");
    this.singleChar.put((Object)"d", (Object)"\u0926");
    this.singleChar.put((Object)"e", (Object)"\u090f");
    this.singleChar.put((Object)"f", (Object)"\u092b");
    this.singleChar.put((Object)"g", (Object)"\u0917");
    this.singleChar.put((Object)"h", (Object)"\u0939");
    this.singleChar.put((Object)"i", (Object)"\u0907");
    this.singleChar.put((Object)"j", (Object)"\u091c");
    this.singleChar.put((Object)"k", (Object)"\u0915");
    this.singleChar.put((Object)"l", (Object)"\u0932");
    this.singleChar.put((Object)"m", (Object)"\u092e");
    this.singleChar.put((Object)"n", (Object)"\u0928");
    this.singleChar.put((Object)"o", (Object)"\u0913");
    this.singleChar.put((Object)"p", (Object)"\u092a");
    this.singleChar.put((Object)"q", (Object)"");
    this.singleChar.put((Object)"r", (Object)"\u0930");
    this.singleChar.put((Object)"s", (Object)"\u0938");
    this.singleChar.put((Object)"t", (Object)"\u0924");
    this.singleChar.put((Object)"u", (Object)"\u0909");
    this.singleChar.put((Object)"v", (Object)"\u0935");
    this.singleChar.put((Object)"w", (Object)"\u0935");
    this.singleChar.put((Object)"x", (Object)"\u0915\u094d\u0937");
    this.singleChar.put((Object)"y", (Object)"\u092f");
    this.singleChar.put((Object)"z", (Object)"\u091d");
    this.singleChar.put((Object)"A", (Object)"\u0906");
    this.singleChar.put((Object)"B", (Object)"\u092c");
    this.singleChar.put((Object)"C", (Object)"\u091a");
    this.singleChar.put((Object)"D", (Object)"\u0921");
    this.singleChar.put((Object)"E", (Object)"\u090d");
    this.singleChar.put((Object)"F", (Object)"\u092b");
    this.singleChar.put((Object)"G", (Object)"\u0917");
    this.singleChar.put((Object)"H", (Object)"\u0903");
    this.singleChar.put((Object)"I", (Object)"\u0908");
    this.singleChar.put((Object)"J", (Object)"\u091c");
    this.singleChar.put((Object)"K", (Object)"\u0915");
    this.singleChar.put((Object)"L", (Object)"\u0933");
    this.singleChar.put((Object)"M", (Object)"\u0902");
    this.singleChar.put((Object)"N", (Object)"\u0923");
    this.singleChar.put((Object)"O", (Object)"\u0911");
    this.singleChar.put((Object)"P", (Object)"\u092a");
    this.singleChar.put((Object)"Q", (Object)"");
    this.singleChar.put((Object)"R", (Object)"\u0930");
    this.singleChar.put((Object)"S", (Object)"\u0936");
    this.singleChar.put((Object)"T", (Object)"\u091f");
    this.singleChar.put((Object)"U", (Object)"\u090a");
    this.singleChar.put((Object)"V", (Object)"\u0935");
    this.singleChar.put((Object)"W", (Object)"\u0935");
    this.singleChar.put((Object)"X", (Object)"\u0915\u094d\u0937");
    this.singleChar.put((Object)"Y", (Object)"\u092f");
    this.singleChar.put((Object)"Z", (Object)"\u091d");
    this.singleChar.put((Object)"1", (Object)"\u0967");
    this.singleChar.put((Object)"2", (Object)"\u0968");
    this.singleChar.put((Object)"3", (Object)"\u0969");
    this.singleChar.put((Object)"4", (Object)"\u096a");
    this.singleChar.put((Object)"5", (Object)"\u096b");
    this.singleChar.put((Object)"6", (Object)"\u096c");
    this.singleChar.put((Object)"7", (Object)"\u096d");
    this.singleChar.put((Object)"8", (Object)"\u096e");
    this.singleChar.put((Object)"9", (Object)"\u096f");
    this.singleChar.put((Object)"0", (Object)"\u0966");
    this.singleChar.put((Object)"#", (Object)"\u0953");
    this.singleChar.put((Object)"$", (Object)" \u0951");
    this.singleChar.put((Object)"^", (Object)"\u094d");
    this.singleChar.put((Object)":", (Object)"\u0903");
    this.delimtrChar.put((Object)" ", (Object)" ");
    this.delimtrChar.put((Object)"!", (Object)"!");
    this.delimtrChar.put((Object)"@", (Object)"\u0970");
    this.delimtrChar.put((Object)"%", (Object)"%");
    this.delimtrChar.put((Object)"&", (Object)"\u093d");
    this.delimtrChar.put((Object)"(", (Object)"(");
    this.delimtrChar.put((Object)")", (Object)")");
    this.delimtrChar.put((Object)"~", (Object)"~");
    this.delimtrChar.put((Object)"`", (Object)"`");
    this.delimtrChar.put((Object)"_", (Object)"_");
    this.delimtrChar.put((Object)"=", (Object)"=");
    this.delimtrChar.put((Object)"{", (Object)"{");
    this.delimtrChar.put((Object)"}", (Object)"}");
    this.delimtrChar.put((Object)"|", (Object)"\u0964");
    this.delimtrChar.put((Object)"\"", (Object)"\"");
    this.delimtrChar.put((Object)"<", (Object)"<");
    this.delimtrChar.put((Object)">", (Object)">");
    this.delimtrChar.put((Object)"?", (Object)"?");
    this.delimtrChar.put((Object)"+", (Object)"+");
    this.delimtrChar.put((Object)"-", (Object)"-");
    this.delimtrChar.put((Object)"[", (Object)"[");
    this.delimtrChar.put((Object)"]", (Object)"]");
    this.delimtrChar.put((Object)"\\", (Object)"\\");
    this.delimtrChar.put((Object)";", (Object)";");
    this.delimtrChar.put((Object)"'", (Object)"'");
    this.delimtrChar.put((Object)",", (Object)",");
    this.delimtrChar.put((Object)".", (Object)".");
    this.delimtrChar.put((Object)"/", (Object)"/");
    this.doubleChar.put((Object)"aa", (Object)"\u0906");
    this.doubleChar.put((Object)"ai", (Object)"\u0910");
    this.doubleChar.put((Object)"au", (Object)"\u0914");
    this.doubleChar.put((Object)"ou", (Object)"\u0914");
    this.doubleChar.put((Object)"ee", (Object)"\u0908");
    this.doubleChar.put((Object)"oo", (Object)"\u090a");
    this.doubleChar.put((Object)"aM", (Object)"\u0905\u0902");
    this.doubleChar.put((Object)"aM~", (Object)"\u0905\u0901");
    this.doubleChar.put((Object)"aH", (Object)"\u0905\u0903");
    this.doubleChar.put((Object)"a:", (Object)"\u0905\u0903");
    this.doubleChar.put((Object)"NG", (Object)"\u0919");
    this.doubleChar.put((Object)"OM", (Object)"\u0950");
    this.doubleChar.put((Object)"+~", (Object)"\u5350");
    this.doubleChar.put((Object)"Rs", (Object)"\u20b9");
    this.doubleChar.put((Object)"||", (Object)"\u0965");
    this.doubleChar.put((Object)"NY", (Object)"\u091e");
    this.doubleChar.put((Object)"Gy", (Object)"\u091c\u094d\u091e");
    this.doubleChar.put((Object)"kh", (Object)"\u0916");
    this.doubleChar.put((Object)"gh", (Object)"\u0918");
    this.doubleChar.put((Object)"Ch", (Object)"\u091b");
    this.doubleChar.put((Object)"chh", (Object)"\u091b");
    this.doubleChar.put((Object)"ch", (Object)"\u091a");
    this.doubleChar.put((Object)"th", (Object)"\u0925");
    this.doubleChar.put((Object)"Th", (Object)"\u0920");
    this.doubleChar.put((Object)"dh", (Object)"\u0927");
    this.doubleChar.put((Object)"Dh", (Object)"\u0922");
    this.doubleChar.put((Object)"jh", (Object)"\u091d");
    this.doubleChar.put((Object)"ph", (Object)"\u092b");
    this.doubleChar.put((Object)"bh", (Object)"\u092d");
    this.doubleChar.put((Object)"sh", (Object)"\u0936");
    this.doubleChar.put((Object)"Sh", (Object)"\u0937");
    this.doubleChar.put((Object)"kSh", (Object)"\u0915\u094d\u0937");
    this.doubleChar.put((Object)"Ri", (Object)"\u090b");
    this.doubleChar.put((Object)"RI", (Object)"\u0960");
    this.doubleChar.put((Object)"Li~", (Object)"\u090c");
    this.doubleChar.put((Object)"LI~", (Object)"\u0961");
    this.doubleChar.put((Object)"@@", (Object)"\u0971");
    this.doubleChar.put((Object)"$$", (Object)"\u0952");
    this.matraChar.put((Object)"a", (Object)"\u093e");
    this.matraChar.put((Object)"A", (Object)"\u093e");
    this.matraChar.put((Object)"i", (Object)"\u093f");
    this.matraChar.put((Object)"I", (Object)"\u0940");
    this.matraChar.put((Object)"u", (Object)"\u0941");
    this.matraChar.put((Object)"U", (Object)"\u0942");
    this.matraChar.put((Object)"e", (Object)"\u0947");
    this.matraChar.put((Object)"E", (Object)"\u0945");
    this.matraChar.put((Object)"o", (Object)"\u094b");
    this.matraChar.put((Object)"O", (Object)"\u0949");
    this.matraChar.put((Object)"ai", (Object)"\u0948");
    this.matraChar.put((Object)"au", (Object)"\u094c");
    this.matraChar.put((Object)"ou", (Object)"\u094c");
    this.matraChar.put((Object)"aa", (Object)"\u093e");
    this.matraChar.put((Object)"oo", (Object)"\u0942");
    this.matraChar.put((Object)"ee", (Object)"\u0940");
    this.matraChar.put((Object)"*", (Object)"\u093c");
    this.matraChar.put((Object)"M~", (Object)"\u0901");
    this.matraChar.put((Object)"r", (Object)"\u094d\u0930");
    this.matraChar.put((Object)"R", (Object)"\u0930\u094d");
    this.matraChar.put((Object)"Ri", (Object)"\u0943");
    this.matraChar.put((Object)"RI", (Object)"\u0944");
    this.matraChar.put((Object)"Li~", (Object)"\u0962");
    this.matraChar.put((Object)"LI~", (Object)"\u0963");
}