Как изменить тему настраиваемой софт-клавиатуры? - PullRequest
0 голосов
/ 07 июля 2019

Я разработал пользовательскую клавиатуру, указанную для букв, используемых в черкесском языке.Проблема в том, что я не могу изменить тему (внешний вид) клавиатуры относительно выбранной пользователем темы.Я предоставил пользовательский интерфейс, чтобы пользователи могли выбирать темы по своему выбору.После нажатия на метод выбора темы InputMethodService останавливается и запускается.Но клавиатура остается прежней.

Я создал файлы макетов для каждой темы, которую я хотел бы добавить, и я использую их для создания экземпляра KeyboardView в методе onCreateInputView метода InputMethodService.Ниже приведен код для InputMethodService.

package net.dijitalbeyin.circassian_keyboard;

import android.content.SharedPreferences;
import android.inputmethodservice.InputMethodService;
import android.inputmethodservice.Keyboard;
import android.inputmethodservice.KeyboardView;
import android.media.AudioManager;
import android.preference.PreferenceManager;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.InputConnection;

public class MyInputMethodService extends InputMethodService implements KeyboardView.OnKeyboardActionListener {
    private KeyboardView keyboardView;
    private Keyboard qwertyKeyboard;
    private Keyboard symbolsKeyboard;
    private SharedPreferences sharedPreferences;
    private boolean isJustStarted = true;
    private boolean isCaps = false;
    private boolean isAfterDot = false;

    @Override
    public View onCreateInputView() {
        sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        String selectedThemeName = sharedPreferences.getString("selectedThemeName", "Green");
        setKeyboardTheme(selectedThemeName);
        keyboardView.setKeyboard(qwertyKeyboard);
        keyboardView.setOnKeyboardActionListener(this);
        shiftKeyboard();
        return keyboardView;
    }

    @Override
    public void onPress(int primaryCode) {

    }

    @Override
    public void onRelease(int primaryCode) {

    }

    @Override
    public void onKey(int primaryCode, int[] keyCodes) {
        InputConnection inputConnection = getCurrentInputConnection();
        if (inputConnection != null) {
            playSound(primaryCode);
            switch (primaryCode) {
                case Keyboard.KEYCODE_MODE_CHANGE:
                    Keyboard currentKeyboard = keyboardView.getKeyboard();
                    if (currentKeyboard == qwertyKeyboard) {
                        currentKeyboard = symbolsKeyboard;
                    } else {
                        currentKeyboard = qwertyKeyboard;
                    }
                    keyboardView.setKeyboard(currentKeyboard);
                    break;
                case Keyboard.KEYCODE_DELETE:
                    CharSequence selectedText = inputConnection.getSelectedText(0);
                    if (TextUtils.isEmpty(selectedText)) {
                        inputConnection.deleteSurroundingText(1, 0);
                    } else {
                        inputConnection.commitText("", 1);
                    }
                    break;
                case Keyboard.KEYCODE_SHIFT:
                    isCaps = !isCaps;
                    qwertyKeyboard.setShifted(isCaps);
                    keyboardView.invalidateAllKeys();
                    break;
                case Keyboard.KEYCODE_DONE:
                    inputConnection.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER));
                    break;
                default:
                    char code = (char) primaryCode;
                    if (Character.isLetter(code) && isCaps) {
                        code = Character.toUpperCase(code);
                    }
                    inputConnection.commitText(String.valueOf(code), 1);
                    if (isJustStarted) {
                        unshiftKeyboard();
                        isJustStarted = false;
                    }
                    if (isAfterDot) {
                        unshiftKeyboard();
                    }
                    if (code == 46) {
                        isAfterDot = true;
                        inputConnection.commitText(" ", 1);
                        shiftKeyboard();
                    }
            }
        }
    }

    @Override
    public void onText(CharSequence text) {

    }

    @Override
    public void swipeLeft() {

    }

    @Override
    public void swipeRight() {

    }

    @Override
    public void swipeDown() {

    }

    @Override
    public void swipeUp() {

    }

    private void playSound(int primaryCode) {
        AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
        switch (primaryCode) {
            case 32:
                audioManager.playSoundEffect(AudioManager.FX_KEYPRESS_SPACEBAR);
                break;
            case Keyboard.KEYCODE_DONE:
            case 10:
                audioManager.playSoundEffect(AudioManager.FX_KEYPRESS_RETURN);
                break;
            case Keyboard.KEYCODE_DELETE:
                audioManager.playSoundEffect(AudioManager.FX_KEYPRESS_DELETE);
                break;
            default:
                audioManager.playSoundEffect(AudioManager.FX_KEYPRESS_STANDARD);
        }
    }

    private void shiftKeyboard() {
        qwertyKeyboard.setShifted(true);
        keyboardView.invalidateAllKeys();
        isCaps = true;
    }

    private void unshiftKeyboard() {
        if (isCaps) {
            qwertyKeyboard.setShifted(false);
            keyboardView.invalidateAllKeys();
            isCaps = false;
        }
    }

    private void setKeyboardTheme(String selectedThemeName) {
        if (selectedThemeName.equals("Green")) {
            keyboardView = (KeyboardView) getLayoutInflater().inflate(R.layout.keyboard_view_green_theme, null);
            qwertyKeyboard = new Keyboard(this, R.xml.keys_layout_green_theme);
            symbolsKeyboard = new Keyboard(this, R.xml.symbols_green_theme);
        } else if (selectedThemeName.equals("Light")) {
            keyboardView = (KeyboardView) getLayoutInflater().inflate(R.layout.keyboard_view_light_theme, null);
            qwertyKeyboard = new Keyboard(this, R.xml.keys_layout_light_theme);
            symbolsKeyboard = new Keyboard(this, R.xml.symbols_light_theme);
        } else if (selectedThemeName.equals("Dark")) {
            keyboardView = (KeyboardView) getLayoutInflater().inflate(R.layout.keyboard_view_dark_theme, null);
            qwertyKeyboard = new Keyboard(this, R.xml.keys_layout_dark_theme);
            symbolsKeyboard = new Keyboard(this, R.xml.symbols_dark_theme);
        } else {
            keyboardView = (KeyboardView) getLayoutInflater().inflate(R.layout.keyboard_view_green_theme, null);
            qwertyKeyboard = new Keyboard(this, R.xml.keys_layout_green_theme);
            symbolsKeyboard = new Keyboard(this, R.xml.symbols_green_theme);
            Log.e("TAG", "Unknown theme selection: " + selectedThemeName);
        }
    }
}

ThemesActivity.java

package net.dijitalbeyin.circassian_keyboard;

import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

public class ThemesActivity extends AppCompatActivity implements ThemeAdapter.OnThemeListener {
    RecyclerView rw_themes;
    RecyclerView.Adapter themeAdapter;
    RecyclerView.LayoutManager layoutManager;
    SharedPreferences sharedPreferences;

    Theme[] themes = new Theme[3];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_themes);

        rw_themes = findViewById(R.id.rw_themes);
        rw_themes.setHasFixedSize(true);

        int greenThemeImageResourceId = getResources().getIdentifier("green_theme_preview", "drawable", this.getPackageName());
        Theme greenTheme = new Theme("Green", greenThemeImageResourceId, true);
        int lightThemeImageResourceId = getResources().getIdentifier("light_theme_preview", "drawable", this.getPackageName());
        Theme lightTheme = new Theme("Light", lightThemeImageResourceId, false);
        int darkThemeImageResourceId = getResources().getIdentifier("dark_theme_preview", "drawable", this.getPackageName());
        Theme darkTheme = new Theme("Dark", darkThemeImageResourceId, false);
        themes[0] = greenTheme;
        themes[1] = lightTheme;
        themes[2] = darkTheme;

        themeAdapter = new ThemeAdapter(themes, this);
        rw_themes.setAdapter(themeAdapter);
        layoutManager = new LinearLayoutManager(this);
        ((LinearLayoutManager) layoutManager).setOrientation(LinearLayoutManager.HORIZONTAL);
        rw_themes.setLayoutManager(layoutManager);
    }

    @Override
    public void onThemeClick(int position) {
        Theme currentTheme = themes[position];
        if (!currentTheme.isActive()) {
            String curentThemeName = currentTheme.getThemeName();
            for (int i = 0; i < themes.length; i++) {
                if (themes[i].getThemeName().equals(curentThemeName)) {
                    themes[i].setActive(true);
                } else {
                    themes[i].setActive(false);
                }
            }
            sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
            SharedPreferences.Editor editor = sharedPreferences.edit();
            editor.putString("selectedThemeName", curentThemeName);
            editor.apply();
            stopService(new Intent(this, MyInputMethodService.class));
            startService(new Intent(this, MyInputMethodService.class));
        }
    }
}

1 Ответ

0 голосов
/ 08 июля 2019

Я решил свою проблему, применяя решение по этой ссылке .Переопределение onStartInputMethod и вызов

setInputView(onCreateInputView());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...