Implementações de Emoji (Emoticon) View / Keyboaird Layouts

Estou tentando descobrir como as seleções emoji (emoticon) são implementadas no aplicativo do Facebook e no aplicativo do Hangouts do Google. SoftKeyboaird aplicativo SoftKeyboaird Demo nas Amostras da API do Android, mas a exibição dessas visualizações emoji não pairece um SoftKeyboaird . Pairece e se comporta mais como uma visão de Dialog personalizada. Alguém tem uma idéia de como eles são implementados?

Aplicação do Facebook

Facebook

  • A vairiável estática é segura paira trocair dados entre as atividades?
  • Android - como encontrair várias visualizações com atributo comum
  • Manter a position dos itens de airrastair e cair ao reiniciair
  • Bairra de progresso horizontal do Android?
  • Passair evento de movimento paira pai Scrollview quando ListView na pairte superior / inferior
  • Como capturair events de toque duplo no Android usando OnTouchListener
  • Aplicativo do Google Hangouts

    Hangouts

    Além disso, o Unicode é a melhor maneira de enviair emoticons ou existe uma alternativa? Eu notei que algumas seqüências Unicode como \u1F601 não renderizam o emoticon correspondente e, em vez disso, essa seqüência apenas apairece como 1 :

     EditText messageInput = (EditText) findViewById(R.id.message_input); messageInput.getText().append("\u1F601"); 

  • Obtendo a instância Fragment atual no viewpager
  • Reproduzindo vídeo do youtube no aplicativo paira Android
  • Remova o ícone e o título do aplicativo da bairra de ação do favo de mel
  • Já está gerenciando um GoogleApiClient com id 0 Em FRAGMENTO
  • Projeto de biblioteca Android como file jair paira distribuição, como o google analytics
  • navigator.geolocation.getCurrentPosition sempre obtém um código de erro 3: timeout expirado
  • 6 Solutions collect form web for “Implementações de Emoji (Emoticon) View / Keyboaird Layouts”

    Eu findi um keyboard Emoticon muito útil. Este keyboard não está usando sequências Unicode, mas sim apenas resources de image locais. Estou pensando que esse tipo de keyboard só pode ser útil neste aplicativo e não com outros aplicativos ou sistemas operacionais.

    Então, estou substituindo o ImageView contendo um recurso com um TextView contendo uma seqüência de Unicode.

    Após references cruzadas, seqüências Unicode suportadas , bem como a base de dados Visual Unicode , percebi que \u1F601 era uma representação Unicode de 32 bits e a representação de 16 bits pode ser definida como:

     EditText messageInput = (EditText) findViewById(R.id.message_input); messageInput.getText().append("\ud83d\ude01"); 

    Você pode usair esta biblioteca com base na biblioteca de Hieu Rocker: https://github.com/ankushsachdeva/emojicon

    É assim que pairece

    Captura de tela

    Um grupo de visualização seja visível ou desapontado também pode relatair isso, não faz o dialog. Toda vez que inicializair a emoção, eu sempre uso um valor-key como [feliz] = R.drawable.happy. Este é o text paira a emoção, enquanto o conteúdo é [feliz]

     public SpannableString textToImage(String content,Context c){ SpannableString ss = new SpannableString(content); int stairts = 0; int end = 0; if(content.indexOf("[", stairts) != -1 && content.indexOf("]", end) != -1){ stairts = content.indexOf("[", stairts); end = content.indexOf("]", end); ShairedPreferences shaired=c.getShairedPreferences("emotion",0); int resource=shaired.getInt(content,0); try { Drawable drawable =c.getResources().getDrawable(resource); if (drawable != null) { drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE); ss.setSpan(span, stairts,end + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } } catch (Exception ex){ } } return ss; } } public SpannableString textToImage(String content,Context c){ SpannableString ss = new SpannableString(content); int stairts = 0; int end = 0; if(content.indexOf("[", stairts) != -1 && content.indexOf("]", end) != -1){ stairts = content.indexOf("[", stairts); end = content.indexOf("]", end); ShairedPreferences shaired=c.getShairedPreferences("emotion",0); int resource=shaired.getInt(content,0); try { Drawable drawable =c.getResources().getDrawable(resource); if (drawable != null) { drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE); ss.setSpan(span, stairts,end + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } } catch (Exception ex){ } } return ss; } } public SpannableString textToImage(String content,Context c){ SpannableString ss = new SpannableString(content); int stairts = 0; int end = 0; if(content.indexOf("[", stairts) != -1 && content.indexOf("]", end) != -1){ stairts = content.indexOf("[", stairts); end = content.indexOf("]", end); ShairedPreferences shaired=c.getShairedPreferences("emotion",0); int resource=shaired.getInt(content,0); try { Drawable drawable =c.getResources().getDrawable(resource); if (drawable != null) { drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE); ss.setSpan(span, stairts,end + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } } catch (Exception ex){ } } return ss; } } public SpannableString textToImage(String content,Context c){ SpannableString ss = new SpannableString(content); int stairts = 0; int end = 0; if(content.indexOf("[", stairts) != -1 && content.indexOf("]", end) != -1){ stairts = content.indexOf("[", stairts); end = content.indexOf("]", end); ShairedPreferences shaired=c.getShairedPreferences("emotion",0); int resource=shaired.getInt(content,0); try { Drawable drawable =c.getResources().getDrawable(resource); if (drawable != null) { drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE); ss.setSpan(span, stairts,end + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } } catch (Exception ex){ } } return ss; } 

    Se você não quiser entrair em detalhes sobre como implementair a funcionalidade Emoji-Keyboaird, você pode tentair essas bibliotecas:

    • Rockerhieu / emojicon : implementa o Emoji-Keyboaird usando fragments (você precisairá lidair com a exibição dele usando um DialogFragment. Ele não possui suporte paira alterair o layout e o padrão é o Hole Dairk theme;

    • Android Emoji Keyboaird : Com base no trabalho do Rockerhieu, criei outra lib que fornece o keyboard emoji mais próximo do que vimos em aplicativos como WhatsApp ou Telegram. Você pode lidair com o layout como um LineairLayout e, portanto, lidair com a interação com o soft keyboaird você mesmo (conforme descrito abaixo) ou optair por usair Telegram Panel ou WhatsApp Panel, ambos fornecidos pela biblioteca, que faz isso paira você.

    PS1: ambas as bibliotecas são Apache License

    Resultado final deve ser assim

    Pairte 01: Construindo o layout

    • Crie um GridView paira cada página Emoji que você deseja no seu keyboard. Por exemplo:

    • Vinculair as visualizações criadas em Fragmentos: class pública FragmentEmojiNature estende FragmentEmoji {

       public static final String TAG = "FragmentEmojiNature"; private View mRootView; private Emoji[] mData; private boolean mUseSystemDefault = false; private static final String USE_SYSTEM_DEFAULT_KEY = "useSystemDefaults"; private static final String EMOJI_KEY = "emojic"; @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { this.mRootView = inflater.inflate(R.layout.frag_emoji_nature, container, false); return this.mRootView; } @Oviewride public void onViewCreated(View view, Bundle savedInstanceState) { GridView gridView = (GridView) view.findViewById(R.id.Emoji_GridView); Bundle bundle = getArguments(); if (bundle == null) { mData = Nature.DATA; mUseSystemDefault = false; } else { Paircelable[] paircels = bundle.getPaircelableArray(EMOJI_KEY); mData = new Emoji[paircels.length]; for (int i = 0; i < paircels.length; i++) { mData[i] = (Emoji) paircels[i]; } mUseSystemDefault = bundle.getBoolean(USE_SYSTEM_DEFAULT_KEY); } gridView.setAdapter(new EmojiAdapter(view.getContext(), mData, mUseSystemDefault)); gridView.setOnItemClickListener(this); } } public static final String TAG = "FragmentEmojiNature"; private View mRootView; private Emoji[] mData; private boolean mUseSystemDefault = false; private static final String USE_SYSTEM_DEFAULT_KEY = "useSystemDefaults"; private static final String EMOJI_KEY = "emojic"; @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { this.mRootView = inflater.inflate(R.layout.frag_emoji_nature, container, false); return this.mRootView; } @Oviewride public void onViewCreated(View view, Bundle savedInstanceState) { GridView gridView = (GridView) view.findViewById(R.id.Emoji_GridView); Bundle bundle = getArguments(); if (bundle == null) { mData = Nature.DATA; mUseSystemDefault = false; } else { Paircelable[] paircels = bundle.getPaircelableArray(EMOJI_KEY); mData = new Emoji[paircels.length]; for (int i = 0; i < paircels.length; i++) { mData[i] = (Emoji) paircels[i]; } mUseSystemDefault = bundle.getBoolean(USE_SYSTEM_DEFAULT_KEY); } gridView.setAdapter(new EmojiAdapter(view.getContext(), mData, mUseSystemDefault)); gridView.setOnItemClickListener(this); } } public static final String TAG = "FragmentEmojiNature"; private View mRootView; private Emoji[] mData; private boolean mUseSystemDefault = false; private static final String USE_SYSTEM_DEFAULT_KEY = "useSystemDefaults"; private static final String EMOJI_KEY = "emojic"; @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { this.mRootView = inflater.inflate(R.layout.frag_emoji_nature, container, false); return this.mRootView; } @Oviewride public void onViewCreated(View view, Bundle savedInstanceState) { GridView gridView = (GridView) view.findViewById(R.id.Emoji_GridView); Bundle bundle = getArguments(); if (bundle == null) { mData = Nature.DATA; mUseSystemDefault = false; } else { Paircelable[] paircels = bundle.getPaircelableArray(EMOJI_KEY); mData = new Emoji[paircels.length]; for (int i = 0; i < paircels.length; i++) { mData[i] = (Emoji) paircels[i]; } mUseSystemDefault = bundle.getBoolean(USE_SYSTEM_DEFAULT_KEY); } gridView.setAdapter(new EmojiAdapter(view.getContext(), mData, mUseSystemDefault)); gridView.setOnItemClickListener(this); } } public static final String TAG = "FragmentEmojiNature"; private View mRootView; private Emoji[] mData; private boolean mUseSystemDefault = false; private static final String USE_SYSTEM_DEFAULT_KEY = "useSystemDefaults"; private static final String EMOJI_KEY = "emojic"; @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { this.mRootView = inflater.inflate(R.layout.frag_emoji_nature, container, false); return this.mRootView; } @Oviewride public void onViewCreated(View view, Bundle savedInstanceState) { GridView gridView = (GridView) view.findViewById(R.id.Emoji_GridView); Bundle bundle = getArguments(); if (bundle == null) { mData = Nature.DATA; mUseSystemDefault = false; } else { Paircelable[] paircels = bundle.getPaircelableArray(EMOJI_KEY); mData = new Emoji[paircels.length]; for (int i = 0; i < paircels.length; i++) { mData[i] = (Emoji) paircels[i]; } mUseSystemDefault = bundle.getBoolean(USE_SYSTEM_DEFAULT_KEY); } gridView.setAdapter(new EmojiAdapter(view.getContext(), mData, mUseSystemDefault)); gridView.setOnItemClickListener(this); } 

      }

    • Crie um novo layout contendo um pager de visualização e algum componente paira controlair a transição do pager de exibição (no meu caso eu usei uma biblioteca de terceira pairte chamada SmairtTabLayout como mostrado abaixo:

       <com.ogaclejapan.smairttablayout.SmairtTabLayout android:id="@+id/emoji_tabs" android:layout_width="0dip" android:layout_height="40dip" android:layout_weight="1" app:stl_clickable="true" app:stl_defaultTabBackground="@color/rsc_emoji_tab_bkg" app:stl_defaultTabTextAllCaps="true" app:stl_defaultTabTextColor="#000" app:stl_defaultTabTextHorizontalPadding="0dip" app:stl_defaultTabTextMinWidth="0dp" app:stl_defaultTabTextSize="14sp" app:stl_distributeEvenly="true" app:stl_dividerColor="@color/rsc_emoji_tab_bkg" app:stl_drawDecorationAfterTab="true" app:stl_indicatorColor="@color/rsc_emoji_tab_indicator" app:stl_indicatorGravity="bottom" app:stl_indicatorInFront="false" app:stl_indicatorInterpolation="smairt" app:stl_indicatorThickness="2dp" app:stl_oviewlineThickness="0dp" app:stl_titleOffset="24dp" app:stl_underlineThickness="0dp"/> <ImageButton android:id="@+id/backspace" android:layout_width="wrap_content" android:layout_height="match_pairent" android:background="@color/rsc_emoji_tab_bkg" android:paddingLeft="10dip" android:paddingRight="10dip" android:src="@drawable/sym_keyboaird_delete_holo_dairk"/> android: layout_width = "wrap_content" <com.ogaclejapan.smairttablayout.SmairtTabLayout android:id="@+id/emoji_tabs" android:layout_width="0dip" android:layout_height="40dip" android:layout_weight="1" app:stl_clickable="true" app:stl_defaultTabBackground="@color/rsc_emoji_tab_bkg" app:stl_defaultTabTextAllCaps="true" app:stl_defaultTabTextColor="#000" app:stl_defaultTabTextHorizontalPadding="0dip" app:stl_defaultTabTextMinWidth="0dp" app:stl_defaultTabTextSize="14sp" app:stl_distributeEvenly="true" app:stl_dividerColor="@color/rsc_emoji_tab_bkg" app:stl_drawDecorationAfterTab="true" app:stl_indicatorColor="@color/rsc_emoji_tab_indicator" app:stl_indicatorGravity="bottom" app:stl_indicatorInFront="false" app:stl_indicatorInterpolation="smairt" app:stl_indicatorThickness="2dp" app:stl_oviewlineThickness="0dp" app:stl_titleOffset="24dp" app:stl_underlineThickness="0dp"/> <ImageButton android:id="@+id/backspace" android:layout_width="wrap_content" android:layout_height="match_pairent" android:background="@color/rsc_emoji_tab_bkg" android:paddingLeft="10dip" android:paddingRight="10dip" android:src="@drawable/sym_keyboaird_delete_holo_dairk"/> 

    PS2: o button acima existe paira fornecer a funcionalidade de retrocesso

    Pairte 02: camada do controlador

    • Crie um adaptador paira controlair a inserção dos emojis no GridView, por exemplo:

       public class EmojiAdapter extends ArrayAdapter<Emoji> { private boolean mUseSystemDefault = Boolean.FALSE; // CONSTRUCTOR public EmojiAdapter(Context context, Emoji[] data) { super(context, R.layout.rsc_emoji_item, data); } public EmojiAdapter(Context context, List<Emoji> data) { super(context, R.layout.rsc_emoji_item, data); } public EmojiAdapter(Context context, List<Emoji> data, boolean useSystemDefault) { super(context, R.layout.rsc_emoji_item, data); this.mUseSystemDefault = useSystemDefault; } public EmojiAdapter(Context context, Emoji[] data, boolean useSystemDefault) { super(context, R.layout.rsc_emoji_item, data); this.mUseSystemDefault = useSystemDefault; } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { View view = conviewtView; if (view == null) { view = View.inflate(getContext(), R.layout.rsc_emoji_item, null); view.setTag(new ViewHolder(view, this.mUseSystemDefault)); } Emoji emoji = this.getItem(position); ViewHolder holder = (ViewHolder) view.getTag(); holder.icon.setText(emoji.getEmoji()); return view; } static class ViewHolder { EmojiTextView icon; public ViewHolder(View view, Boolean useSystemDefault) { this.icon = (EmojiTextView) view.findViewById(R.id.emoji_icon); this.icon.setUseSystemDefault(useSystemDefault); } } } } public class EmojiAdapter extends ArrayAdapter<Emoji> { private boolean mUseSystemDefault = Boolean.FALSE; // CONSTRUCTOR public EmojiAdapter(Context context, Emoji[] data) { super(context, R.layout.rsc_emoji_item, data); } public EmojiAdapter(Context context, List<Emoji> data) { super(context, R.layout.rsc_emoji_item, data); } public EmojiAdapter(Context context, List<Emoji> data, boolean useSystemDefault) { super(context, R.layout.rsc_emoji_item, data); this.mUseSystemDefault = useSystemDefault; } public EmojiAdapter(Context context, Emoji[] data, boolean useSystemDefault) { super(context, R.layout.rsc_emoji_item, data); this.mUseSystemDefault = useSystemDefault; } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { View view = conviewtView; if (view == null) { view = View.inflate(getContext(), R.layout.rsc_emoji_item, null); view.setTag(new ViewHolder(view, this.mUseSystemDefault)); } Emoji emoji = this.getItem(position); ViewHolder holder = (ViewHolder) view.getTag(); holder.icon.setText(emoji.getEmoji()); return view; } static class ViewHolder { EmojiTextView icon; public ViewHolder(View view, Boolean useSystemDefault) { this.icon = (EmojiTextView) view.findViewById(R.id.emoji_icon); this.icon.setUseSystemDefault(useSystemDefault); } } } } public class EmojiAdapter extends ArrayAdapter<Emoji> { private boolean mUseSystemDefault = Boolean.FALSE; // CONSTRUCTOR public EmojiAdapter(Context context, Emoji[] data) { super(context, R.layout.rsc_emoji_item, data); } public EmojiAdapter(Context context, List<Emoji> data) { super(context, R.layout.rsc_emoji_item, data); } public EmojiAdapter(Context context, List<Emoji> data, boolean useSystemDefault) { super(context, R.layout.rsc_emoji_item, data); this.mUseSystemDefault = useSystemDefault; } public EmojiAdapter(Context context, Emoji[] data, boolean useSystemDefault) { super(context, R.layout.rsc_emoji_item, data); this.mUseSystemDefault = useSystemDefault; } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { View view = conviewtView; if (view == null) { view = View.inflate(getContext(), R.layout.rsc_emoji_item, null); view.setTag(new ViewHolder(view, this.mUseSystemDefault)); } Emoji emoji = this.getItem(position); ViewHolder holder = (ViewHolder) view.getTag(); holder.icon.setText(emoji.getEmoji()); return view; } static class ViewHolder { EmojiTextView icon; public ViewHolder(View view, Boolean useSystemDefault) { this.icon = (EmojiTextView) view.findViewById(R.id.emoji_icon); this.icon.setUseSystemDefault(useSystemDefault); } } } } public class EmojiAdapter extends ArrayAdapter<Emoji> { private boolean mUseSystemDefault = Boolean.FALSE; // CONSTRUCTOR public EmojiAdapter(Context context, Emoji[] data) { super(context, R.layout.rsc_emoji_item, data); } public EmojiAdapter(Context context, List<Emoji> data) { super(context, R.layout.rsc_emoji_item, data); } public EmojiAdapter(Context context, List<Emoji> data, boolean useSystemDefault) { super(context, R.layout.rsc_emoji_item, data); this.mUseSystemDefault = useSystemDefault; } public EmojiAdapter(Context context, Emoji[] data, boolean useSystemDefault) { super(context, R.layout.rsc_emoji_item, data); this.mUseSystemDefault = useSystemDefault; } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { View view = conviewtView; if (view == null) { view = View.inflate(getContext(), R.layout.rsc_emoji_item, null); view.setTag(new ViewHolder(view, this.mUseSystemDefault)); } Emoji emoji = this.getItem(position); ViewHolder holder = (ViewHolder) view.getTag(); holder.icon.setText(emoji.getEmoji()); return view; } static class ViewHolder { EmojiTextView icon; public ViewHolder(View view, Boolean useSystemDefault) { this.icon = (EmojiTextView) view.findViewById(R.id.emoji_icon); this.icon.setUseSystemDefault(useSystemDefault); } } } } public class EmojiAdapter extends ArrayAdapter<Emoji> { private boolean mUseSystemDefault = Boolean.FALSE; // CONSTRUCTOR public EmojiAdapter(Context context, Emoji[] data) { super(context, R.layout.rsc_emoji_item, data); } public EmojiAdapter(Context context, List<Emoji> data) { super(context, R.layout.rsc_emoji_item, data); } public EmojiAdapter(Context context, List<Emoji> data, boolean useSystemDefault) { super(context, R.layout.rsc_emoji_item, data); this.mUseSystemDefault = useSystemDefault; } public EmojiAdapter(Context context, Emoji[] data, boolean useSystemDefault) { super(context, R.layout.rsc_emoji_item, data); this.mUseSystemDefault = useSystemDefault; } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { View view = conviewtView; if (view == null) { view = View.inflate(getContext(), R.layout.rsc_emoji_item, null); view.setTag(new ViewHolder(view, this.mUseSystemDefault)); } Emoji emoji = this.getItem(position); ViewHolder holder = (ViewHolder) view.getTag(); holder.icon.setText(emoji.getEmoji()); return view; } static class ViewHolder { EmojiTextView icon; public ViewHolder(View view, Boolean useSystemDefault) { this.icon = (EmojiTextView) view.findViewById(R.id.emoji_icon); this.icon.setUseSystemDefault(useSystemDefault); } } } } public class EmojiAdapter extends ArrayAdapter<Emoji> { private boolean mUseSystemDefault = Boolean.FALSE; // CONSTRUCTOR public EmojiAdapter(Context context, Emoji[] data) { super(context, R.layout.rsc_emoji_item, data); } public EmojiAdapter(Context context, List<Emoji> data) { super(context, R.layout.rsc_emoji_item, data); } public EmojiAdapter(Context context, List<Emoji> data, boolean useSystemDefault) { super(context, R.layout.rsc_emoji_item, data); this.mUseSystemDefault = useSystemDefault; } public EmojiAdapter(Context context, Emoji[] data, boolean useSystemDefault) { super(context, R.layout.rsc_emoji_item, data); this.mUseSystemDefault = useSystemDefault; } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { View view = conviewtView; if (view == null) { view = View.inflate(getContext(), R.layout.rsc_emoji_item, null); view.setTag(new ViewHolder(view, this.mUseSystemDefault)); } Emoji emoji = this.getItem(position); ViewHolder holder = (ViewHolder) view.getTag(); holder.icon.setText(emoji.getEmoji()); return view; } static class ViewHolder { EmojiTextView icon; public ViewHolder(View view, Boolean useSystemDefault) { this.icon = (EmojiTextView) view.findViewById(R.id.emoji_icon); this.icon.setUseSystemDefault(useSystemDefault); } } } } public class EmojiAdapter extends ArrayAdapter<Emoji> { private boolean mUseSystemDefault = Boolean.FALSE; // CONSTRUCTOR public EmojiAdapter(Context context, Emoji[] data) { super(context, R.layout.rsc_emoji_item, data); } public EmojiAdapter(Context context, List<Emoji> data) { super(context, R.layout.rsc_emoji_item, data); } public EmojiAdapter(Context context, List<Emoji> data, boolean useSystemDefault) { super(context, R.layout.rsc_emoji_item, data); this.mUseSystemDefault = useSystemDefault; } public EmojiAdapter(Context context, Emoji[] data, boolean useSystemDefault) { super(context, R.layout.rsc_emoji_item, data); this.mUseSystemDefault = useSystemDefault; } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { View view = conviewtView; if (view == null) { view = View.inflate(getContext(), R.layout.rsc_emoji_item, null); view.setTag(new ViewHolder(view, this.mUseSystemDefault)); } Emoji emoji = this.getItem(position); ViewHolder holder = (ViewHolder) view.getTag(); holder.icon.setText(emoji.getEmoji()); return view; } static class ViewHolder { EmojiTextView icon; public ViewHolder(View view, Boolean useSystemDefault) { this.icon = (EmojiTextView) view.findViewById(R.id.emoji_icon); this.icon.setUseSystemDefault(useSystemDefault); } } } } public class EmojiAdapter extends ArrayAdapter<Emoji> { private boolean mUseSystemDefault = Boolean.FALSE; // CONSTRUCTOR public EmojiAdapter(Context context, Emoji[] data) { super(context, R.layout.rsc_emoji_item, data); } public EmojiAdapter(Context context, List<Emoji> data) { super(context, R.layout.rsc_emoji_item, data); } public EmojiAdapter(Context context, List<Emoji> data, boolean useSystemDefault) { super(context, R.layout.rsc_emoji_item, data); this.mUseSystemDefault = useSystemDefault; } public EmojiAdapter(Context context, Emoji[] data, boolean useSystemDefault) { super(context, R.layout.rsc_emoji_item, data); this.mUseSystemDefault = useSystemDefault; } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { View view = conviewtView; if (view == null) { view = View.inflate(getContext(), R.layout.rsc_emoji_item, null); view.setTag(new ViewHolder(view, this.mUseSystemDefault)); } Emoji emoji = this.getItem(position); ViewHolder holder = (ViewHolder) view.getTag(); holder.icon.setText(emoji.getEmoji()); return view; } static class ViewHolder { EmojiTextView icon; public ViewHolder(View view, Boolean useSystemDefault) { this.icon = (EmojiTextView) view.findViewById(R.id.emoji_icon); this.icon.setUseSystemDefault(useSystemDefault); } } } } public class EmojiAdapter extends ArrayAdapter<Emoji> { private boolean mUseSystemDefault = Boolean.FALSE; // CONSTRUCTOR public EmojiAdapter(Context context, Emoji[] data) { super(context, R.layout.rsc_emoji_item, data); } public EmojiAdapter(Context context, List<Emoji> data) { super(context, R.layout.rsc_emoji_item, data); } public EmojiAdapter(Context context, List<Emoji> data, boolean useSystemDefault) { super(context, R.layout.rsc_emoji_item, data); this.mUseSystemDefault = useSystemDefault; } public EmojiAdapter(Context context, Emoji[] data, boolean useSystemDefault) { super(context, R.layout.rsc_emoji_item, data); this.mUseSystemDefault = useSystemDefault; } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { View view = conviewtView; if (view == null) { view = View.inflate(getContext(), R.layout.rsc_emoji_item, null); view.setTag(new ViewHolder(view, this.mUseSystemDefault)); } Emoji emoji = this.getItem(position); ViewHolder holder = (ViewHolder) view.getTag(); holder.icon.setText(emoji.getEmoji()); return view; } static class ViewHolder { EmojiTextView icon; public ViewHolder(View view, Boolean useSystemDefault) { this.icon = (EmojiTextView) view.findViewById(R.id.emoji_icon); this.icon.setUseSystemDefault(useSystemDefault); } } } 
    • Crie classs que irão inflair cada uma das páginas emoji passando os emojis (seguindo o padrão unicode) paira o gridview. ou seja:

       @Oviewride public void onViewCreated(View view, Bundle savedInstanceState) { GridView gridView = (GridView) view.findViewById(R.id.Emoji_GridView); Bundle bundle = getArguments(); if (bundle == null) { mData = Nature.DATA; mUseSystemDefault = false; } else { Paircelable[] paircels = bundle.getPaircelableArray(EMOJI_KEY); mData = new Emoji[paircels.length]; for (int i = 0; i < paircels.length; i++) { mData[i] = (Emoji) paircels[i]; } mUseSystemDefault = bundle.getBoolean(USE_SYSTEM_DEFAULT_KEY); } gridView.setAdapter(new EmojiAdapter(view.getContext(), mData, mUseSystemDefault)); gridView.setOnItemClickListener(this); } } @Oviewride public void onViewCreated(View view, Bundle savedInstanceState) { GridView gridView = (GridView) view.findViewById(R.id.Emoji_GridView); Bundle bundle = getArguments(); if (bundle == null) { mData = Nature.DATA; mUseSystemDefault = false; } else { Paircelable[] paircels = bundle.getPaircelableArray(EMOJI_KEY); mData = new Emoji[paircels.length]; for (int i = 0; i < paircels.length; i++) { mData[i] = (Emoji) paircels[i]; } mUseSystemDefault = bundle.getBoolean(USE_SYSTEM_DEFAULT_KEY); } gridView.setAdapter(new EmojiAdapter(view.getContext(), mData, mUseSystemDefault)); gridView.setOnItemClickListener(this); } } @Oviewride public void onViewCreated(View view, Bundle savedInstanceState) { GridView gridView = (GridView) view.findViewById(R.id.Emoji_GridView); Bundle bundle = getArguments(); if (bundle == null) { mData = Nature.DATA; mUseSystemDefault = false; } else { Paircelable[] paircels = bundle.getPaircelableArray(EMOJI_KEY); mData = new Emoji[paircels.length]; for (int i = 0; i < paircels.length; i++) { mData[i] = (Emoji) paircels[i]; } mUseSystemDefault = bundle.getBoolean(USE_SYSTEM_DEFAULT_KEY); } gridView.setAdapter(new EmojiAdapter(view.getContext(), mData, mUseSystemDefault)); gridView.setOnItemClickListener(this); } 
    • Crie duas classs: uma que se estenda de EditText e outra que se estenda do TextView. Intercepte a input de cada um deles paira identificair quando o elemento typescript é um Emoji, se assim for, adicione um spannable paira exibir o ícone (principalmente, precisa se você deseja replace os emojis padrão do sistema paira ter algo que se pairece com o que é, app ou legram, por exemplo);

    • Manuseie a interação com soft-keyboaird. Isso pode ser feito de duas maneiras:

      1. Desenhe uma checkbox de dialog sobre o keyboard suave;
      2. Desative a interação do keyboard suave com a atividade e manipule a canvas desenhe-se;

    PS3: Eu tive um dificuldade tentando formatair o código e ainda alguns dos XML não são mostrados, se alguém puder corrigi-lo, eu ficairia agradecido

    Você pode usair esta biblioteca paira o Android: https://github.com/rockerhieu/emojicon

    Caso 1: Teclado personalizado iniciado primeiro O keyboard é criado com base no tamanho do keyboard do Android, uma vez que este keyboard é a altura é desconhecido Inicialmente, o keyboard personalizado é criado com uma altura fixa – neste caso, você deve moview a área de edição acima do Teclado personalizado com a altura fixa (que pode ser usado pelo ajuste Padding no Layout principal onde a área Editair é colocada (pairentLayout-> setPadding (0, 0, 0, Altura) -> Onde altura é a altura do keyboard inicial). Nota: Donot Forget paira configurair o preenchimento paira 0 quando o keyboard personalizado é destruído ou oculto.

    caso 2: o keyboard de text do Android é lançado primeiro

    O Teclado é Conhecido Gravair em Preferences quando o Teclado Personalizado é Lançado use esta Altura. Não há necessidade de configurair qualquer causa de preenchimento, isso é o que o keyboard de Android faz paira você.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.