2016-12-29 13 views
2

Я разработал клавиатуру и теперь мне нужно добавить смайлики к нему, от других вопросов, я понял, лучший способ с popupwindow,Реализовать смайлики в андроиде клавиатуры с popupwindow

Вот что я имею сделано:

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); 

Unfortunatly это не работает, showAsDropDown нужен вид как его первый вар, и если клавиатура находится в другом приложении я не имею представление, чтобы дать ему ...

Есть ли способ исправить это? или я собираюсь все это неправильно и есть лучший способ ...

вся помощь будет оценена!

+0

Попробуйте это [ссылка] (https://github.com/vanniktech/Emoji/blob/master/app/src/main/res/layout/adapter_chat.xml) –

+0

не работает, это только для приложений, Я пытаюсь реализовать его на клавиатуре, поэтому у меня нет rootView – yanivtwin

ответ

2

Учитывая, что вы используете официальный SoftKeyBoard implementation в качестве шаблона для клавиатуры:

//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); 

Используйте вид, что вы надувают для клавиатуры, в OFFICAL SoftKeyBoard и сниппет над ним называется mInputView.

+0

Попробуйте это [Ссылка] (https://www.numetriclabz.com/how-to-integrate-emoticons-using-emojicon-library-in -android /) –

0

вы можете обратиться по этой ссылке GitHub для полного кода

EmojiIcon

+0

ОК, я пытаюсь использовать его, и есть фрагмент, который подключит меня, но как мне его назвать с помощью клавиатуры? я его подтолкнул, но все-таки нужно его как-то запустить с клавиатуры – yanivtwin

0

привет я сделал то же самое. Я сделал одну пользовательскую клавиатуру в 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); 

} 

Чтобы уточнить цену, нажмите here.

Спасибо, что это поможет вам. Это немного устарело, но вы можете попробовать.

+0

. В этом примере ссылка показывает активность, будет ли это работать на клавиатуре? это не выглядит так – yanivtwin

+0

В действии я сделал пользовательскую клавиатуру, проверьте его. Я прокомментировал код. – Saveen