2017-02-22 2 views
0

Je crée une application pour AndroidTV et mon exigence est de créer un clavier personnalisé à l'écran. J'ai créé un clavier en utilisant KyboardView et je reçois le clavier enveloppé dans RelativeLayout. Je ne suis pas capable de me concentrer sur les touches en utilisant DPAD Remote. Ci-dessous mon code -Problème de mise au point de clavier personnalisé à l'aide de la télécommande

Activité

KeyboardView keyboardView = (KeyboardView) view.findViewById(R.id.keyboardView); 
keyboardView.setKeyboard(new Keyboard(getActivity(),R.xml.keyboard_qwerty)); 
keyboardView.setPreviewEnabled(false); 
keyboardView.setOnKeyboardActionListener(new KeyboardView.OnKeyboardActionListener() { 
     @Override 
     public void onPress(int primaryCode) { 

     } 

     @Override 
     public void onRelease(int primaryCode) { 

     } 

     @Override 
     public void onKey(int primaryCode, int[] keyCodes) { 
      Log.e(TAG, "#onkey - "+primaryCode); 
     } 

     @Override 
     public void onText(CharSequence text) { 
      YuppLog.e(TAG, "#text - "+text); 

     } 

     @Override 
     public void swipeLeft() { 

     } 

     @Override 
     public void swipeRight() { 

     } 

     @Override 
     public void swipeDown() { 

     } 

     @Override 
     public void swipeUp() { 

     } 
    }); 

keyboard_qwertty

<?xml version="1.0" encoding="utf-8"?> 
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android" 
android:keyHeight="7.5%p" 
android:horizontalGap="0.3%p" 
android:verticalGap="0.5%p" 
android:keyWidth="10%p"> 
<Row> 
    <Key 
     android:codes="49" 
     android:keyEdgeFlags="left" 
     android:keyLabel="1" /> 
    <Key 
     android:codes="50" 
     android:keyLabel="2" /> 
    <Key 
     android:codes="51" 
     android:keyLabel="3" /> 
    <Key 
     android:codes="52" 
     android:keyLabel="4" /> 
    <Key 
     android:codes="53" 
     android:keyLabel="5" /> 
    <Key 
     android:codes="54" 
     android:keyLabel="6" /> 
    <Key 
     android:codes="55" 
     android:keyLabel="7" /> 
    <Key 
     android:codes="56" 
     android:keyLabel="8" /> 
    <Key 
     android:codes="57" 
     android:keyLabel="9" /> 
    <Key 
     android:codes="48" 
     android:keyEdgeFlags="right" 
     android:keyLabel="0" /> 
</Row> 
<Row> 
    <Key 
     android:codes="113" 
     android:keyEdgeFlags="left" 
     android:keyLabel="q" /> 
    <Key 
     android:codes="119" 
     android:keyLabel="w" /> 
    <Key 
     android:codes="101" 
     android:keyLabel="e" /> 
    <Key 
     android:codes="114" 
     android:keyLabel="r" /> 
    <Key 
     android:codes="116" 
     android:keyLabel="t" /> 
    <Key 
     android:codes="121" 
     android:keyLabel="y" /> 
    <Key 
     android:codes="117" 
     android:keyLabel="u" /> 
    <Key 
     android:codes="105" 
     android:keyLabel="i" /> 
    <Key 
     android:codes="111" 
     android:keyLabel="o" /> 
    <Key 
     android:codes="112" 
     android:keyEdgeFlags="right" 
     android:keyLabel="p" /> 
</Row> 
<Row> 
    <Key 
     android:codes="97" 
     android:keyEdgeFlags="left" 
     android:keyLabel="a" /> 
    <Key 
     android:codes="115" 
     android:keyLabel="s" /> 
    <Key 
     android:codes="100" 
     android:keyLabel="d" /> 
    <Key 
     android:codes="102" 
     android:keyLabel="f" /> 
    <Key 
     android:codes="103" 
     android:keyLabel="g" /> 
    <Key 
     android:codes="104" 
     android:keyLabel="h" /> 
    <Key 
     android:codes="106" 
     android:keyLabel="j" /> 
    <Key 
     android:codes="107" 
     android:keyLabel="k" /> 
    <Key 
     android:codes="108" 
     android:keyLabel="l" /> 

    <Key 
     android:codes="45" 
     android:keyEdgeFlags="right" 
     android:keyLabel="-" /> 
</Row> 
<Row> 
    <Key 
     android:codes="-1" 
     android:isModifier="true" 
     android:isSticky="true" 
     android:keyEdgeFlags="left" 
     android:keyIcon="@drawable/ic_keyboard_capital" 
     android:keyWidth="10%p" /> 
    <Key 
     android:codes="122" 
     android:keyLabel="z" /> 
    <Key 
     android:codes="120" 
     android:keyLabel="x" /> 
    <Key 
     android:codes="99" 
     android:keyLabel="c" /> 
    <Key 
     android:codes="118" 
     android:keyLabel="v" /> 
    <Key 
     android:codes="98" 
     android:keyLabel="b" /> 
    <Key 
     android:codes="110" 
     android:keyLabel="n" /> 
    <Key 
     android:codes="109" 
     android:keyLabel="m" /> 
    <Key 
     android:codes="96" 
     android:keyLabel="'" 
     android:keyEdgeFlags="right" /> 
</Row> 
<Row android:rowEdgeFlags="bottom"> 
    <Key 
     android:codes="123123" 
     android:keyLabel="!#$" 
     android:keyWidth="20.3%p" /> 
    <Key 
     android:codes="32" 
     android:keyIcon="@drawable/ic_keyboard_space_bar" 
     android:keyWidth="48%p" /> 

    <Key 
     android:codes="-5" 
     android:isRepeatable="true" 
     android:keyEdgeFlags="right" 
     android:keyIcon="@drawable/ic_keyboard_delete" 
     android:keyWidth="30.6%p" /> 
</Row> 

+0

Essayez de vérifier ce [tutoriel] (http://www.blackcj.com/blog/2016/03/30/building-a-custom-android-keyboard/) sur la façon de construire un clavier android personnalisé. Vous pouvez apprendre ici la procédure étape par étape sur la façon de le créer. Il compose d'un exemple de code que vous pouvez copier. Vous pouvez également vérifier les liens utilisés pour créer ce clavier personnalisé. Pour plus d'informations, vérifiez cette [question SO] liée (http://stackoverflow.com/questions/29285276/custom-keyboard-view-in-android). – KENdi

+0

@KENdi J'ai fait de même mais je dois utiliser le clavier personnalisé sur AndroidTV, pas sur les appareils à écran tactile. Je ne suis pas capable de me concentrer sur le clavier personnalisé en utilisant DPAD. Si j'utilise une souris, je peux cliquer sur le clavier. –

+0

@GauravBarthwal avez-vous trouvé une solution pour cela? –

Répondre

1

Après avoir fait beaucoup de recherches et non en mesure d'obtenir ma réponse, je débrouillés pour créer un clavier personnalisé en utilisant ma propre logique et avec l'aide de android.inputmethodservice.Keyboard classe. Voici mon code pour obtenir un clavier personnalisé.

package com.gaurav.keyboard; 

import android.content.Context; 
import android.graphics.drawable.Drawable; 
import android.inputmethodservice.Keyboard; 
import android.support.v7.widget.RecyclerView; 


/** 
* Created by Gaurav on 29/12/16. 
* <p> 
* Utils class returns keyboard based on the requested Keyboard type 
    {KB_NUMERIC, KB_QWERTY, KB_EMAIL, KB_MONTH & KB_YEAR}. 
* <p> 
* Client has to implement {@link OnKeyClickListener} to get key click 
    event. 
* <p> 
* For multiple keyboards instantiate the class. 
*/ 

public class KeyboardHelper { 
public final String TAG = KeyboardHelper.class.getSimpleName(); 
private Context mContext; 
private CustomKeyboardView keyboardView; 

/** 
* CONSTANTS FOR KEYBOARD TYPES 
*/ 
public static final int KB_NUMERIC = 1; 
public static final int KB_QWERTY = 2; 
public static final int KB_EMAIL = 3; 
public static final int KB_MONTH = 4; 
public static final int KB_YEAR = 5; 
public static final int KB_SEARCH = 6; 

/** 
* KEYBOARD KEY CODES 
*/ 
public static final int KEY_CODE_SPACE = 32; 
public static final int KEY_CODE_BACK_SPACE = -5; 
public static final int KEY_CODE_SPECIAL_CHARACTER = 123123; 
public static final int KEY_CODE_CLEAR = 123124; 
public static final int KEY_CODE_CAPITAL_CASE = -1; 
public static final int KEY_CODE_HOTMAIL_DOT_COM = 54321; 
public static final int KEY_CODE_GMAIL_DOT_COM = 54320; 
public static final int KEY_CODE_YAHOO_DOT_COM = 54319; 
public static final int KEY_CODE_AT_THE_RATE = 85245; 
public static final int KEY_CODE_DOT = 789789; 
public static final int KEY_CODE_DOT_COM = 456654; 
static final int KEY_CODE_EMPTY = 540; 

/** 
* interface to get key event of keyboard 
* <p> 
* to get key code - clickedKey.codes[0] 
* NOTE :- All keys have single code. 
*/ 
public interface OnKeyClickListener { 
    void onKeyClick(Keyboard.Key clickedKey); 
} 

public KeyboardHelper(Context mContext, OnKeyClickListener onKeyClickListener) { 
    this.mContext = mContext; 
    keyboardView = new CustomKeyboardView(mContext, onKeyClickListener); 
    keyboardView.setHasFixedSize(true); 
} 

/** 
* sets the selector for key 
* 
* @param selector - {@link Drawable} 
*/ 
public void setKeySelector(Drawable selector) { 
    if (selector != null) 
     keyboardView.setKeyDrawable(selector); 
} 

/** 
* Returns the keyboard view based on the keyboard type 
* 
* @param mKeyboardType - int 
* @return - {@link RecyclerView} 
*/ 
public RecyclerView requestKeyboard(int mKeyboardType) { 
    switch (mKeyboardType) { 
     case KB_NUMERIC: 
      return keyboardView.loadKeyboard(KB_NUMERIC, new Keyboard(mContext, R.xml.keyboard_numeric)); 
     case KB_QWERTY: 
      return keyboardView.loadKeyboard(KB_QWERTY, new Keyboard(mContext, R.xml.keyboard_qwerty)); 
     case KB_EMAIL: 
      return keyboardView.loadKeyboard(KB_EMAIL, new Keyboard(mContext, R.xml.keyboard_email)); 
     case KB_MONTH: 
      return keyboardView.loadKeyboard(KB_MONTH, new Keyboard(mContext, R.xml.keyboard_month)); 
     case KB_YEAR: 
      return keyboardView.loadKeyboard(KB_YEAR, new Keyboard(mContext, R.xml.keyboard_month)); 
     case KB_SEARCH: 
      return keyboardView.loadKeyboard(KB_SEARCH, new Keyboard(mContext, R.xml.keyboard_search)); 
     default: 
      return keyboardView.loadKeyboard(KB_QWERTY, new Keyboard(mContext, R.xml.keyboard_qwerty)); 
    } 
} 

}

CustomKeyboardView retourne un clavier à part entière enveloppée dans RecyclerView. Nombre de clés sont fixées bien que j'ai codé en dur certaines valeurs dans initializeRows().

package com.gaurav.keyboard; 

import android.content.Context; 
import android.content.res.Resources; 
import android.graphics.drawable.Drawable; 
import android.inputmethodservice.Keyboard; 
import android.support.v7.widget.AppCompatImageView; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.view.KeyEvent; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.RelativeLayout; 

import java.util.Calendar; 
import java.util.List; 

/** 
* Created by Gaurav on 21/2/17. 
* This class extends {@link RecyclerView} and returns Keyboard layout 
*/ 
class CustomKeyboardView extends RecyclerView { 
    private final String TAG = CustomKeyboardView.class.getSimpleName(); 

private Context mContext; 
private Resources resources; 

private int ROWS; 

private LinearLayoutManager linearLayoutManager; 

private List<Keyboard.Key> mKeys; 
private List<Keyboard.Key> mModifierKeys; 
private int keyboardType; 
private int startIndex; 
private int endIndex; 
int[] years = new int[3]; 
private int currentYear; 

private KeyboardAdapter keyboardAdapter; 

private KeyboardHelper.OnKeyClickListener onKeyClickListener; 
private boolean areKeysCapital = false; 
private boolean areKeysSpecial = false; 

private Drawable keyDrawable; 

private boolean isKeyPressed = false; 

private List<Keyboard.Key> mSpecialKeys; 
private List<Keyboard.Key> mCharKeys; 

CustomKeyboardView(Context context, KeyboardHelper.OnKeyClickListener mCallBack) { 
    super(context); 
    mContext = context; 
    resources = getResources(); 

    linearLayoutManager = new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false); 

    try { 
     onKeyClickListener = mCallBack; 
    } catch (Exception e) { 
     e.getMessage(); 
     e.printStackTrace(); 
    } 

    setLayoutManager(linearLayoutManager); 
} 

/** 
* sets drawable for key layout 
* 
* @param keyDrawable - {@link Drawable} 
*/ 
void setKeyDrawable(Drawable keyDrawable) { 
    this.keyDrawable = keyDrawable; 
} 

/** 
* Returns {@link CustomKeyboardView} based on the keyboard type 
* @param keyboardType - requested keyboard 
* @param keyboard  - {@link Keyboard} needs to be loaded 
* @return - {@link CustomKeyboardView} 
*/ 
CustomKeyboardView loadKeyboard(int keyboardType, Keyboard keyboard) { 
    this.keyboardType = keyboardType; 
    mKeys = keyboard.getKeys(); 
    if (keyboardType == KeyboardHelper.KB_YEAR) { 
     Calendar calendar = Calendar.getInstance(); 
     calendar.setTimeInMillis(System.currentTimeMillis()); 
     currentYear = calendar.get(Calendar.YEAR); 
    } 
    initializeRows(); 
    keyboardAdapter = new KeyboardAdapter(mContext); 
    setAdapter(keyboardAdapter); 
    return this; 
} 

/** 
* initializes rows of the keyboard's rows and columns 
* numeric, month and year keyboard will have 4 rows, qwerty keyboard has 6 rows and email keyboard has 6 rows 
*/ 
private void initializeRows() { 
    switch (keyboardType) { 
     case KeyboardHelper.KB_NUMERIC: 
      startIndex = 0; 
      endIndex = 3; 
      ROWS = 4; 
      break; 
     case KeyboardHelper.KB_QWERTY: 
      startIndex = 0; 
      endIndex = 10; 
      ROWS = 5; 
      mSpecialKeys = new Keyboard(mContext, R.xml.special_character_keys).getKeys(); 
      mCharKeys = new Keyboard(mContext, R.xml.character_keys).getKeys(); 
      break; 
     case KeyboardHelper.KB_EMAIL: 
      startIndex = 0; 
      endIndex = 10; 
      ROWS = 6; 
      mSpecialKeys = new Keyboard(mContext, R.xml.special_character_keys).getKeys(); 
      mCharKeys = new Keyboard(mContext, R.xml.character_keys).getKeys(); 
      break; 
     case KeyboardHelper.KB_MONTH: 
      startIndex = 0; 
      endIndex = 3; 
      ROWS = 4; 
      break; 
     case KeyboardHelper.KB_YEAR: 
      startIndex = 0; 
      endIndex = 3; 
      ROWS = 4; 
      break; 
     case KeyboardHelper.KB_SEARCH: 
      startIndex = 0; 
      endIndex = 19; 
      ROWS = 3; 
      break; 
    } 
} 

/** 
* gets keys for the given positioned row 
* NOTE - calculations have been done based on keys in each rows. 
* @param position - row position 
* @return - List of {@link android.inputmethodservice.Keyboard.Key} 
*/ 
private List<Keyboard.Key> getRowKeys(int position) { 
    List<Keyboard.Key> rowKeys = null; 
    switch (keyboardType) { 
     case KeyboardHelper.KB_NUMERIC: 
      if (position < 3) 
       rowKeys = mKeys.subList(startIndex, endIndex); 
      else 
       rowKeys = mKeys.subList(startIndex, mKeys.size()); 
      startIndex = endIndex; 
      endIndex = endIndex + 3; 
      break; 
     case KeyboardHelper.KB_QWERTY: 
      if (position < 3) 
       rowKeys = mKeys.subList(startIndex, endIndex); 
      else if (position == 3) 
       rowKeys = mKeys.subList(30, 39); 
      else if (position == 4) 
       rowKeys = mKeys.subList(39, mKeys.size()); 
      startIndex = endIndex; 
      endIndex = endIndex + 10; 
      break; 
     case KeyboardHelper.KB_EMAIL: 
      if (position < 3) 
       rowKeys = mKeys.subList(startIndex, endIndex); 
      else if (position == 3) 
       rowKeys = mKeys.subList(30, 39); 
      else if (position == 4) 
       rowKeys = mKeys.subList(39, 42); 
      else if (position == 5) 
       rowKeys = mKeys.subList(42, mKeys.size()); 
      startIndex = endIndex; 
      endIndex = endIndex + 10; 
      break; 
     case KeyboardHelper.KB_MONTH: 
      rowKeys = mKeys.subList(startIndex, endIndex); 
      startIndex = endIndex; 
      endIndex = endIndex + 3; 
      break; 
     case KeyboardHelper.KB_YEAR: 
      rowKeys = mKeys.subList(startIndex, endIndex); 
      startIndex = endIndex; 
      endIndex = endIndex + 3; 
      for (int i = 0; i < years.length; i++) { 
       years[i] = currentYear++; 
      } 
      break; 
     case KeyboardHelper.KB_SEARCH: 
      rowKeys = mKeys.subList(startIndex, endIndex); 
      startIndex = endIndex; 
      endIndex = endIndex + 19; 
      if (position == 1) 
       endIndex = mKeys.size(); 
      break; 
    } 
    return rowKeys; 
} 

/** 
* Adapter for the keyboard 
* It helps to set each row 
*/ 
private class KeyboardAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

    private final Context mContext; 

    KeyboardAdapter(Context mContext) { 
     this.mContext = mContext; 
    } 

    class KeyboardViewHolder extends RecyclerView.ViewHolder { 
     private RecyclerView keyboardRow; 

     KeyboardViewHolder(View itemView) { 
      super(itemView); 
      keyboardRow = (RecyclerView) itemView.findViewById(R.id.keyboardRow); 
      keyboardRow.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false)); 
     } 
    } 

    @Override 
    public int getItemCount() { 
     return ROWS; 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     KeyboardViewHolder _holder = (KeyboardViewHolder) holder; 

     _holder.keyboardRow.setAdapter(new KeyAdapter(getRowKeys(position))); 

    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_keyboard_row, parent, false); 

     return new KeyboardViewHolder(v); 
    } 
} 

/** 
* Adapter for row key 
*/ 
private class KeyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 
    private List<Keyboard.Key> rowKeys; 

    KeyAdapter(List<Keyboard.Key> rowKeys) { 
     this.rowKeys = rowKeys; 
    } 

    class KeyViewHolder extends RecyclerView.ViewHolder { 
     private AppCompatImageView keyIcon; 
     private KeyTextView keyLabel, keySupportLabel; 
     private RelativeLayout key_layout; 

     KeyViewHolder(final View itemView) { 
      super(itemView); 
      key_layout = (RelativeLayout) itemView.findViewById(R.id.key_layout); 
      keyIcon = (AppCompatImageView) itemView.findViewById(R.id.keyIcon); 
      keyLabel = (KeyTextView) itemView.findViewById(R.id.keyLabel); 
      keySupportLabel = (KeyTextView) itemView.findViewById(R.id.keySupportLabel); 

      /* 
      * if user has defined keyDrawable then no need to apply default animations 
      */ 
      if (keyDrawable == null) { 
       itemView.setOnKeyListener(new OnKeyListener() { 
        @Override 
        public boolean onKey(View view, int i, KeyEvent keyEvent) { 
         if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_DPAD_CENTER) { 
          Keyboard.Key clickedKey = rowKeys.get(getAdapterPosition()); 
          if(keyEvent.getAction() == KeyEvent.ACTION_UP) { 
           itemView.setBackground(getResources().getDrawable(R.drawable.key_press_gradient)); 
           clickedKey.label = keyLabel.getText(); 
           if (clickedKey.modifier) { 
            if(clickedKey.codes[0] == KeyboardHelper.KEY_CODE_CAPITAL_CASE) 
             toggleKeyCase(); 
            else if(clickedKey.codes[0] == KeyboardHelper.KEY_CODE_SPECIAL_CHARACTER) 
             toggleSpecialCase(keyLabel); 
           } else { 
            if (onKeyClickListener != null) { 
             onKeyClickListener.onKeyClick(clickedKey); 
            } 
           } 
          }else { 
           if((keyEvent.getAction() == KeyEvent.ACTION_UP) && clickedKey.codes[0] == KeyboardHelper.KEY_CODE_BACK_SPACE) { 
            if (onKeyClickListener != null) { 
             onKeyClickListener.onKeyClick(clickedKey); 
            } 
           } 
          } 
         } else 
          itemView.setBackground(getResources().getDrawable(R.drawable.tv_key_board_key_background)); 
         return false; 
        } 
       }); 
      } 
     } 
    } 

    @Override 
    public int getItemCount() { 
     return rowKeys.size(); 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     KeyViewHolder _holder = (KeyViewHolder) holder; 
     _holder.itemView.setFocusable(true); 
     _holder.itemView.setFocusableInTouchMode(true); 
     _holder.itemView.setVisibility(VISIBLE); 
     Keyboard.Key mKey = rowKeys.get(position); 
     if (mKey.icon != null) { 
      _holder.keyIcon.setBackgroundDrawable(mKey.icon); 
      _holder.keyIcon.setVisibility(View.VISIBLE); 
     } else { 
      if (keyboardType == KeyboardHelper.KB_YEAR) 
       _holder.keyLabel.setText("" + years[position]); 
      else 
       _holder.keyLabel.setText(mKey.label); 
      _holder.keyIcon.setVisibility(View.GONE); 
     } 

     /* 
     * for EMAIL keyboard - gmail, hotmail and yahoo keys label text size has to be changed 
     */ 
     if (keyboardType == KeyboardHelper.KB_EMAIL) { 
      int keyCode = mKey.codes[0]; 
      if (keyCode == KeyboardHelper.KEY_CODE_GMAIL_DOT_COM 
        || keyCode == KeyboardHelper.KEY_CODE_YAHOO_DOT_COM 
        || keyCode == KeyboardHelper.KEY_CODE_HOTMAIL_DOT_COM) { 
       _holder.keyLabel.setTextSize(resources.getDimension(R.dimen.key_label_size)); 
      } 
     } else if (keyboardType == KeyboardHelper.KB_MONTH) { 
      _holder.keySupportLabel.setText(mKey.text); 
      _holder.keySupportLabel.setVisibility(View.VISIBLE); 
     } else if(keyboardType == KeyboardHelper.KB_SEARCH && mKey.codes[0] == KeyboardHelper.KEY_CODE_EMPTY) { 
      _holder.itemView.setFocusable(false); 
      _holder.itemView.setFocusableInTouchMode(false); 
      _holder.itemView.setVisibility(INVISIBLE); 
     } 

     RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(mKey.width, mKey.height); 
     layoutParams.setMargins(mKey.gap, mKey.gap, mKey.gap, mKey.gap); 
     _holder.key_layout.setLayoutParams(layoutParams); 

     if (keyDrawable != null) { 
      _holder.key_layout.setBackground(keyDrawable); 
     } 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_key, parent, false); 

     return new KeyViewHolder(v); 
    } 
} 

/** 
* toggles key case 
* NOTE - only qwerty and email keyboard has change case key and 1,2 and 3'rows will be going to update 
*/ 
private void toggleKeyCase() { 
    try { 
     if (keyboardAdapter != null) { 
      for (int i = 1; i < 4; i++) { 
       RecyclerView keyboardRow = (RecyclerView) linearLayoutManager.getChildAt(i); 
       LinearLayoutManager keyBoardLayoutManager = (LinearLayoutManager) keyboardRow.getLayoutManager(); 
       for (int j = 0; j < keyBoardLayoutManager.getItemCount(); j++) { 
        View keyView = keyBoardLayoutManager.getChildAt(j); 
        KeyTextView yuppTextView = (KeyTextView) keyView.findViewById(R.id.keyLabel); 
        if (!areKeysCapital) { 
         yuppTextView.setText(yuppTextView.getText().toString().toUpperCase()); 
        } else { 
         yuppTextView.setText(yuppTextView.getText().toString().toLowerCase()); 
        } 
       } 
      } 
      areKeysCapital = !areKeysCapital; 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

/** 
* switch keyboard case between special character and alphabet 
* Special characters are available only for KB_QWERTY and KB_EMAIL. 
* only top 4 rows are going to be changed 
*/ 
private void toggleSpecialCase(KeyTextView keyLabel) { 
    try { 
     if (keyboardAdapter != null 
       && mSpecialKeys != null 
       && (keyboardType == KeyboardHelper.KB_EMAIL || keyboardType == KeyboardHelper.KB_QWERTY)) { 
      startIndex = 0; 
      endIndex = 10; 
      if(areKeysSpecial) { 
       keyLabel.setText("!#$"); 
       for (int i = 0; i < 4; i++) { 
        RecyclerView keyboardRow = (RecyclerView) linearLayoutManager.getChildAt(i); 
        LinearLayoutManager keyBoardLayoutManager = (LinearLayoutManager) keyboardRow.getLayoutManager(); 
        List<Keyboard.Key> rowKeys = mCharKeys.subList(startIndex, endIndex); 
        for (int j = 0; j < keyBoardLayoutManager.getItemCount(); j++) { 
         View keyView = keyBoardLayoutManager.getChildAt(j); 
         KeyTextView yuppTextView = (KeyTextView) keyView.findViewById(R.id.keyLabel); 
         yuppTextView.setText(rowKeys.get(j).label); 
        } 
        startIndex = endIndex; 
        if(i == 2) 
         endIndex = mSpecialKeys.size(); 
        else 
         endIndex = endIndex + 10; 
       } 
       areKeysSpecial = false; 
      }else if(!areKeysSpecial) { 
       keyLabel.setText("abc"); 
       for (int i = 0; i < 4; i++) { 
        RecyclerView keyboardRow = (RecyclerView) linearLayoutManager.getChildAt(i); 
        LinearLayoutManager keyBoardLayoutManager = (LinearLayoutManager) keyboardRow.getLayoutManager(); 
        List<Keyboard.Key> rowKeys = mSpecialKeys.subList(startIndex, endIndex); 
        for (int j = 0; j < keyBoardLayoutManager.getItemCount(); j++) { 

         View keyView = keyBoardLayoutManager.getChildAt(j); 
         KeyTextView yuppTextView = (KeyTextView) keyView.findViewById(R.id.keyLabel); 
         if (!areKeysSpecial) { 
          yuppTextView.setText(rowKeys.get(j).label); 
         } else { 
          yuppTextView.setText(yuppTextView.getText().toString().toLowerCase()); 
         } 
        } 
        startIndex = endIndex; 
        if(i == 2) 
         endIndex = mSpecialKeys.size(); 
        else 
         endIndex = endIndex + 10; 
       } 
       areKeysSpecial = true; 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

}

Un échantillon de keyboard_email.xml. Fournir la hauteur, la largeur et les espaces clés.

<?xml version="1.0" encoding="utf-8"?> 
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android" 
android:horizontalGap="@dimen/key_gap" 
android:keyHeight="@dimen/key_email_default_height" 
android:keyWidth="@dimen/key_email_default_width" 
android:verticalGap="@dimen/key_gap"> 
<Row> 
    <Key 
     android:codes="49" 
     android:keyEdgeFlags="left" 
     android:keyLabel="1" /> 
    <Key 
     android:codes="50" 
     android:keyLabel="2" /> 
    <Key 
     android:codes="51" 
     android:keyLabel="3" /> 
    <Key 
     android:codes="52" 
     android:keyLabel="4" /> 
    <Key 
     android:codes="53" 
     android:keyLabel="5" /> 
    <Key 
     android:codes="54" 
     android:keyLabel="6" /> 
    <Key 
     android:codes="55" 
     android:keyLabel="7" /> 
    <Key 
     android:codes="56" 
     android:keyLabel="8" /> 
    <Key 
     android:codes="57" 
     android:keyLabel="9" /> 
    <Key 
     android:codes="48" 
     android:keyEdgeFlags="right" 
     android:keyLabel="0" /> 
</Row> 
<Row> 
    <Key 
     android:codes="113" 
     android:keyEdgeFlags="left" 
     android:keyLabel="q" /> 
    <Key 
     android:codes="119" 
     android:keyLabel="w" /> 
    <Key 
     android:codes="101" 
     android:keyLabel="e" /> 
    <Key 
     android:codes="114" 
     android:keyLabel="r" /> 
    <Key 
     android:codes="116" 
     android:keyLabel="t" /> 
    <Key 
     android:codes="121" 
     android:keyLabel="y" /> 
    <Key 
     android:codes="117" 
     android:keyLabel="u" /> 
    <Key 
     android:codes="105" 
     android:keyLabel="i" /> 
    <Key 
     android:codes="111" 
     android:keyLabel="o" /> 
    <Key 
     android:codes="112" 
     android:keyEdgeFlags="right" 
     android:keyLabel="p" /> 
</Row> 
<Row> 
    <Key 
     android:codes="97" 
     android:keyEdgeFlags="left" 
     android:keyLabel="a" /> 
    <Key 
     android:codes="115" 
     android:keyLabel="s" /> 
    <Key 
     android:codes="100" 
     android:keyLabel="d" /> 
    <Key 
     android:codes="102" 
     android:keyLabel="f" /> 
    <Key 
     android:codes="103" 
     android:keyLabel="g" /> 
    <Key 
     android:codes="104" 
     android:keyLabel="h" /> 
    <Key 
     android:codes="106" 
     android:keyLabel="j" /> 
    <Key 
     android:codes="107" 
     android:keyLabel="k" /> 
    <Key 
     android:codes="108" 
     android:keyLabel="l" /> 

    <Key 
     android:codes="45" 
     android:keyEdgeFlags="right" 
     android:keyLabel="-" /> 
</Row> 
<Row> 
    <Key 
     android:codes="-1" 
     android:isModifier="true" 
     android:isSticky="true" 
     android:keyEdgeFlags="left" 
     android:keyIcon="@drawable/ic_keyboard_capital" 
     android:keyWidth="@dimen/key_capital_case_width" /> 

    <Key 
     android:codes="122" 
     android:keyLabel="z" /> 
    <Key 
     android:codes="120" 
     android:keyLabel="x" /> 
    <Key 
     android:codes="99" 
     android:keyLabel="c" /> 
    <Key 
     android:codes="118" 
     android:keyLabel="v" /> 
    <Key 
     android:codes="98" 
     android:keyLabel="b" /> 
    <Key 
     android:codes="110" 
     android:keyLabel="n" /> 
    <Key 
     android:codes="109" 
     android:keyLabel="m" /> 
    <Key 
     android:codes="96" 
     android:keyEdgeFlags="right" 
     android:keyLabel="'" /> 
</Row> 
<Row> 
    <Key 
     android:codes="54321" 
     android:isRepeatable="true" 
     android:keyEdgeFlags="left" 
     android:keyHeight="@dimen/key_email_domain_height" 
     android:keyLabel="@string/hotmail.com" 
     android:keyWidth="@dimen/key_email_domain_width" /> 
    <Key 
     android:codes="54320" 
     android:isRepeatable="true" 
     android:keyHeight="@dimen/key_email_domain_height" 
     android:keyLabel="@string/gmail.com" 
     android:keyWidth="@dimen/key_email_domain_width" /> 
    <Key 
     android:codes="54319" 
     android:isRepeatable="true" 
     android:keyEdgeFlags="right" 
     android:keyHeight="@dimen/key_email_domain_height" 
     android:keyLabel="@string/yahoo.com" 
     android:keyWidth="@dimen/key_email_domain_width" /> 
</Row> 
<Row android:rowEdgeFlags="bottom"> 
    <Key 
     android:codes="123123" 
     android:keyEdgeFlags="left" 
     android:isModifier="true" 
     android:isSticky="true" 
     android:keyLabel="!#$" 
     android:keyWidth="@dimen/key_special_char_width" /> 

    <Key 
     android:codes="85245" 
     android:keyLabel="\@" 
     android:keyWidth="@dimen/key_special_char_width" /> 

    <Key 
     android:codes="789789" 
     android:keyLabel="." /> 

    <Key 
     android:codes="456654" 
     android:keyLabel=".com" 
     android:keyWidth="@dimen/key_special_char_width" /> 

    <Key 
     android:codes="-5" 
     android:isRepeatable="true" 
     android:keyEdgeFlags="right" 
     android:keyIcon="@drawable/ic_keyboard_delete" 
     android:keyWidth="@dimen/key_qwerty_delete_width" /> 
</Row> 
</Keyboard> 

l'implémentation RecyclerView qwertyKeyboard = new KeyboardHelper (Mactivity, PaymentInfoFragment.this) .requestKeyboard (KeyboardHelper.KB_QWERTY);

Implémentez KeyboardHelper.OnKeyClickListener pour obtenir l'événement click.

Ce code convient très bien à mes besoins.

+0

RecyclerView qwertyKeyboard = nouveau KeyboardHelper (mActivity, PaymentInfoFragment.this) .requestKeyboard (KeyboardHelper.KB_QWERTY); qwertyKeyboard.requestFocus(); –