2015-03-19 4 views
1

Привет люди на StackOverflow,Применить тему динамически для Android Keyboard

я столкнулся с проблемой при программировании экранной клавиатуры:

Что я хочу добиться того, что мягкие нагрузки клавиатуры динамически тему/стиль оптимизирован для ввода в ночное время и темы/стиля для ввода солнечного света. Стили уже определены, и я уже могу легко их переключать, только изменяя стиль в input.xml.

import ... /*Not quite relevant (yet)*/ 

public class LatinKeyboardView extends KeyboardView { 

public LatinKeyboardView(Context context, AttributeSet attrs) { 
    this(context, attrs, loadColor()); 
} 

public LatinKeyboardView(Context context, AttributeSet attrs, int defStyle)     { 
    super(context, attrs, defStyle); 

} 

public static int loadColor() { 

    String dbg = android.os.Debug.isDebuggerConnected() ? "Y" : "N"; 

    android.util.Log.d("loadColor", "Debugger connected: " + dbg); 

    android.os.Debug.waitForDebugger(); 

    int temp = 0; 
    int id = 0; 

    if (temp == 1) 
    { 
     id = R.style.KeyStyle_Day; 
    } 
    else 
    { 
     id = R.style.KeyStyle_Night; 
    } 

    android.util.Log.d("loadColor", Integer.toString(id)); 
    return id; 
} 

Когда я переадресовать вызов из первого конструктора ко второму конструктору (как показано в исходной клавиатуре кода Хакера), мягкие клавиатуры нагрузку успешно идентификатор стиля в loadColor(), но после этого, там происходит внутри исключение, которое я не удается проследить, даже с трассировки стека:

03-19 08:32:48.313 18630-18630/com.alphanerd.eztype.keyboard E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.alphanerd.eztype.keyboard, PID: 18630 
    android.view.InflateException: Binary XML file line #21: Error inflating class com.alphanerd.eztype.keyboard.LatinKeyboardView 
      at android.view.LayoutInflater.createView(LayoutInflater.java:626) 
      at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702) 
      at android.view.LayoutInflater.inflate(LayoutInflater.java:470) 
      at android.view.LayoutInflater.inflate(LayoutInflater.java:398) 
      at android.view.LayoutInflater.inflate(LayoutInflater.java:354) 
      at com.alphanerd.eztype.keyboard.EZTypeKeyboard.onCreateInputView(EZTypeKeyboard.java:125) 
      at android.inputmethodservice.InputMethodService.updateInputViewShown(InputMethodService.java:1594) 
      at android.inputmethodservice.InputMethodService.showWindowInner(InputMethodService.java:2220) 
      at android.inputmethodservice.InputMethodService.showWindow(InputMethodService.java:2179) 
      at android.inputmethodservice.InputMethodService$InputMethodImpl.showSoftInput(InputMethodService.java:712) 
      at android.inputmethodservice.IInputMethodWrapper.executeMessage(IInputMethodWrapper.java:214) 
      at com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:40) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:157) 
      at android.app.ActivityThread.main(ActivityThread.java:5335) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 
      at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.reflect.InvocationTargetException 
      at java.lang.reflect.Constructor.constructNative(Native Method) 
      at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
      at android.view.LayoutInflater.createView(LayoutInflater.java:600) 
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:470) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:398) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:354) 
            at com.alphanerd.eztype.keyboard.EZTypeKeyboard.onCreateInputView(EZTypeKeyboard.java:125) 
            at android.inputmethodservice.InputMethodService.updateInputViewShown(InputMethodService.java:1594) 
            at android.inputmethodservice.InputMethodService.showWindowInner(InputMethodService.java:2220) 
            at android.inputmethodservice.InputMethodService.showWindow(InputMethodService.java:2179) 
            at android.inputmethodservice.InputMethodService$InputMethodImpl.showSoftInput(InputMethodService.java:712) 
            at android.inputmethodservice.IInputMethodWrapper.executeMessage(IInputMethodWrapper.java:214) 
            at com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:40) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:157) 
            at android.app.ActivityThread.main(ActivityThread.java:5335) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:515) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 
            at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.NullPointerException 
      at android.inputmethodservice.KeyboardView.<init>(KeyboardView.java:370) 
      at com.alphanerd.eztype.keyboard.LatinKeyboardView.<init>(LatinKeyboardView.java:53) 
            at java.lang.reflect.Constructor.constructNative(Native Method) 
            at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
            at android.view.LayoutInflater.createView(LayoutInflater.java:600) 
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:470) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:398) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:354) 
            at com.alphanerd.eztype.keyboard.EZTypeKeyboard.onCreateInputView(EZTypeKeyboard.java:125) 
            at android.inputmethodservice.InputMethodService.updateInputViewShown(InputMethodService.java:1594) 
            at android.inputmethodservice.InputMethodService.showWindowInner(InputMethodService.java:2220) 
            at android.inputmethodservice.InputMethodService.showWindow(InputMethodService.java:2179) 
            at android.inputmethodservice.InputMethodService$InputMethodImpl.showSoftInput(InputMethodService.java:712) 
            at android.inputmethodservice.IInputMethodWrapper.executeMessage(IInputMethodWrapper.java:214) 
            at com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:40) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:157) 
            at android.app.ActivityThread.main(ActivityThread.java:5335) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:515) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 
            at dalvik.system.NativeStart.main(Native Method) 

Я надеюсь, вы можете помочь мне с этим. Код для динамической загрузки цвета в настоящее время так же динамичен, как и int temp; , Но в дальнейшем я буду реализовывать логику для загрузки цвета от sharedpreferences (клавиатура на самом деле предназначена для интеграции (оптический) с другим приложения мой АМФ развивается)

Заранее спасибо за любую помощь :)

ответ

1

я нашел решение, которое я думаю, это очень просто, как только я его нашел: Вместо взлома любой конструктор и т.д., я редактировал перекрытый onCreateInputView:

@Override 
public View onCreateInputView() { 
    int schema = loadColor(); 

    //Default code 

    //mInputView = (LatinKeyboardView) getLayoutInflater().inflate(
    //  R.layout.input, null); 

    mInputView = (LatinKeyboardView) getLayoutInflater().inflate(
      schema, null); 

    mInputView.setOnKeyboardActionListener(this); 
    mInputView.setKeyboard(mQwertyKeyboard); 
    return mInputView; 
} 

public static int loadColor() { 

    String dbg = android.os.Debug.isDebuggerConnected() ? "Y" : "N"; 

    android.util.Log.d("loadColor", "Debugger attached: " + dbg); 

    //android.os.Debug.waitForDebugger(); //Comment this out before releasing the keyboard 

    int temp = 1; 
    int id = 0; 

    if (temp == 1) 
    { 
     id = R.layout.input_day; 
    } 
    else 
    { 
     id = R.layout.input; 
    } 

    android.util.Log.d("loadColor", Integer.toString(id)); 
    return id; 
} 

Нормально, LayoutInflater загружаете раскладку по умолчанию как предполагалось google. Я могу порекомендовать определить несколько макетов ввода, каждый со своим стилем. Если ваша собственная клавиатура должна поддерживать созданные пользователем темы, просто создайте макет ввода и укажите там стиль, который относится к изображениям тем. Поместите все загруженные загруженные изображения тем в специальную папку, доступную для текстового ввода xml.

Последний совет: вы можете отлаживать мягкую клавиатуру, помещая android.os.Debug.waitForDebugger(); в коде. Клавиатура (или любое другое приложение) будет ожидать отладчика для присоединения. Не забудьте удалить каждый вызов waitForDebugger() перед тем, как отпустить приложение, иначе приложение перестанет работать везде, где вы забыли удалить эту строку. Надеюсь, я могу помочь любому, кто это читает.

Благодарим вас и у вас хороший день :)