He desarrollado un teclado y ahora necesito agregarle emojis, de otras preguntas me he dado cuenta de que la mejor manera es con una ventana emergente,

Esto es lo que he hecho:

  case -102:
            LayoutInflater layoutInflater
                    = (LayoutInflater)getBaseContext()
                    .getSystemService(LAYOUT_INFLATER_SERVICE);
            View popupView = layoutInflater.inflate(R.layout.emoji_view, null);
            final PopupWindow popupWindow = new PopupWindow(
                    popupView,
                    LinearLayout.LayoutParams.MATCH_PARENT,
                    LinearLayout.LayoutParams.MATCH_PARENT);
            popupWindow.showAsDropDown(getWindow().getOwnerActivity().getCurrentFocus(),50, -30);

Desafortunadamente, esto no funciona, showAsDropDown necesita una vista como su primera variable, y si el teclado está en otra aplicación, no tengo una vista para darle ...

¿Hay alguna manera de arreglar eso? o estoy haciendo todo mal y hay una mejor manera ...

¡Toda ayuda será apreciada!

2
yanivtwin 29 dic. 2016 a las 14:12

3 respuestas

La mejor respuesta

Dado que está utilizando el Implementación de SoftKeyBoard como plantilla para su teclado:

//Cut some pieces of the code for clarity
case -102:
    LayoutInflater layoutInflater = (LayoutInflater)getBaseContext()
        .getSystemService(LAYOUT_INFLATER_SERVICE);
    View popupView = layoutInflater.inflate(R.layout.emoji_view, null);
    PopupWindow popupWindow = new PopupWindow(popupView, MATCH_PARENT, MATCH_PARENT);
    popupWindow.showAsDropDown(mInputView);

Use la vista que ha inflado para su teclado, en el Soft Keyboard oficial y el fragmento de arriba se llama mInputView.

2
Pär Nils Amsen 5 ene. 2017 a las 15:22

Puedes consultar este enlace de github para obtener el código completo

EmojiIcon

0
Rudresh 6 ene. 2017 a las 04:10

Hola he hecho lo mismo He hecho un teclado personalizado en Android.

EmoticonsPagerAdapter emojiAdapter;

/**
 * Defining all components of emoticons keyboard
 */
private void enablePopUpView() {

    final ViewPager pager = (ViewPager) popUpView
            .findViewById(R.id.emoticons_pager);
    pager.setOffscreenPageLimit(3);

    final ArrayList<EmojiItem> paths = EmojiUtil.getInstance(acitiviy)
            .getAllEmojis();
    final ArrayList<EmojiItem>[] groups = new ArrayList[5];
    for (EmojiItem emoji : paths) {
        if (groups[emoji.emojiGroup] == null) {
            groups[emoji.emojiGroup] = new ArrayList<EmojiItem>();
        }
        groups[emoji.emojiGroup].add(emoji);
    }
    final ArrayList<EmojiItem> history = new ArrayList<EmojiItem>();
    ArrayList<Integer> historyIds = SettingsUtil.getHistoryItems(acitiviy);
    for (Integer his : historyIds) {
        for (EmojiItem emoji : paths) {
            if (emoji.id == his) {
                history.add(emoji);
                break;
            }
        }
    }
    history.add(paths.get(0));

    final KeyClickListener onEmojiClick = new KeyClickListener() {

        @Override
        public void keyClickedIndex(EmojiItem index) {

            int cursorPosition = editMessage.getSelectionStart();
            editMessage.getText().insert(cursorPosition, index.emojiText);
            try {
                editMessage.getText().setSpan(
                        new ImageSpan(index.emojiDrawable), cursorPosition,
                        cursorPosition + 1,
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            } catch (Exception e) {
            }
            if (history.get(0) != index)
                history.add(0, index);
            SettingsUtil.setHistoryItems(acitiviy, history);
            emojiAdapter.notifyDataSetChanged();
            pager.setAdapter(emojiAdapter);
        }
    };

    ((ImageButton) popUpView.findViewById(R.id.emoji2))
            .setImageDrawable(groups[0].get(0).emojiDrawable);
    ((ImageButton) popUpView.findViewById(R.id.emoji3))
            .setImageDrawable(groups[1].get(0).emojiDrawable);
    ((ImageButton) popUpView.findViewById(R.id.emoji4))
            .setImageDrawable(groups[2].get(0).emojiDrawable);
    ((ImageButton) popUpView.findViewById(R.id.emoji5))
            .setImageDrawable(groups[3].get(0).emojiDrawable);
    ((ImageButton) popUpView.findViewById(R.id.emoji6))
            .setImageDrawable(groups[4].get(0).emojiDrawable);
    popUpView.findViewById(R.id.emoji1).setOnClickListener(
            new OnClickListener() {

                @Override
                public void onClick(View v) {
                    emojiAdapter.emojis = history;
                    emojiAdapter.notifyDataSetChanged();
                    pager.setAdapter(emojiAdapter);
                }
            });
    popUpView.findViewById(R.id.emoji2).setOnClickListener(
            new OnClickListener() {

                @Override
                public void onClick(View v) {
                    emojiAdapter.emojis = groups[0];
                    emojiAdapter.notifyDataSetChanged();
                    pager.setAdapter(emojiAdapter);
                }
            });
    popUpView.findViewById(R.id.emoji3).setOnClickListener(
            new OnClickListener() {

                @Override
                public void onClick(View v) {
                    emojiAdapter.emojis = groups[1];
                    emojiAdapter.notifyDataSetChanged();
                    pager.setAdapter(emojiAdapter);
                }
            });
    popUpView.findViewById(R.id.emoji4).setOnClickListener(
            new OnClickListener() {

                @Override
                public void onClick(View v) {
                    emojiAdapter.emojis = groups[2];
                    emojiAdapter.notifyDataSetChanged();
                    pager.setAdapter(emojiAdapter);
                }
            });
    popUpView.findViewById(R.id.emoji5).setOnClickListener(
            new OnClickListener() {

                @Override
                public void onClick(View v) {
                    emojiAdapter.emojis = groups[3];
                    emojiAdapter.notifyDataSetChanged();
                    pager.setAdapter(emojiAdapter);
                }
            });
    popUpView.findViewById(R.id.emoji6).setOnClickListener(
            new OnClickListener() {

                @Override
                public void onClick(View v) {
                    emojiAdapter.emojis = groups[4];
                    emojiAdapter.notifyDataSetChanged();
                    pager.setAdapter(emojiAdapter);
                }
            });

    emojiAdapter = new EmoticonsPagerAdapter(acitiviy, groups[0],
            onEmojiClick);
    pager.setAdapter(emojiAdapter);

    // Creating a pop window for emoticons keyboard
    popupWindow = new PopupWindow(popUpView, LayoutParams.MATCH_PARENT,
            (int) keyboardHeight, false);

    View backSpace = (View) popUpView.findViewById(R.id.imageBackspace);
    backSpace.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            KeyEvent event = new KeyEvent(0, 0, 0, KeyEvent.KEYCODE_DEL, 0,
                    0, 0, 0, KeyEvent.KEYCODE_ENDCALL);
            editMessage.dispatchKeyEvent(event);
        }
    });

    popupWindow.setOnDismissListener(new OnDismissListener() {

        @Override
        public void onDismiss() {
            emoticonsCover.setVisibility(LinearLayout.GONE);
        }
    });

    ViewPager pagerStickers = (ViewPager) popUpView
            .findViewById(R.id.stickers_pager);
    pagerStickers.setOffscreenPageLimit(3);

}

private void showKeyboardPopup(View root, boolean attaches) {
    if (!popupWindow.isShowing()) {
        popupWindow.setHeight((int) (keyboardHeight));

        if (isKeyBoardVisible) {
            imageEmoji.setImageResource(R.drawable.emoji_kbd);
            emoticonsCover.setVisibility(LinearLayout.GONE);

        } else {
            imageEmoji.setImageResource(R.drawable.ic_down);
            emoticonsCover.setVisibility(LinearLayout.VISIBLE);
        }
        try {
            popupWindow.showAtLocation(root, Gravity.BOTTOM, 0, 0);
        } catch (Exception e) {
        }
    } else {
        imageEmoji.setImageResource(R.drawable.emoji_btn_normal);
        popupWindow.dismiss();
        return;
    }

    imageAttaches.setBackgroundColor(attaches ? 0xFF808080 : 0x00000000);
    imageEmojis.setBackgroundColor(attaches ? 0x00000000 : 0xFF808080);
    imageStickers.setBackgroundColor(0x00000000);
    layoutEmojis.setVisibility(attaches ? View.GONE : View.VISIBLE);
    layoutStickers.setVisibility(View.GONE);

}

Para obtener más detalles, haga clic en aquí.

Gracias, espero que esto te ayude. Es un poco viejo pero puedes probarlo.

1
Saveen 8 ene. 2017 a las 09:20