Как я могу переключаться между Emojipicker и Keyboard в Android?

Функцией приложения, над которым я работаю, является то, что люди могут общаться друг с другом. В ChatFragment. Я хотел бы иметь ту же функциональность, что и Whatsapp и Telegram, где вы можете нажать кнопку смайлика, а клавиатура переключается на Emojipicker. Без какого-либо перехода, где у emoticonpicker будет такая же высота макета, как и на моей клавиатуре (точно так же, как whatsapp и телеграмма).

Когда я его реализовал и переключился с клавиатуры на клавиатуру emoji, моя программная клавиатура исчезла бы, и видимость моего emojipicker была бы установлена ​​с GONE до VISIBLE. Помимо уродливого перехода на багги из-за меняющегося макета, он также имеет тот же размер на всех устройствах, не забывая, что клавиатура имеет разную высоту. Я использую следующий emojipicker https://github.com/rockerhieu/emojicon

Кто-нибудь знает, как изменить мою реализацию, чтобы мой emojipicker был того же самого роста, что и моя клавиатура? Я пробовал разные вещи, но никто из них не работал. Ниже некоторого кода из моего чата и фрагмента.

ChatFragment

public class ChatFragment extends W3SFragment implements IResultListener { private int chatContactId; private Context context; private DatabaseHelper databaseHelper; private InputMethodManager inputManager; private View fragmentView; private TextView statusText; private ImageView emojiconIconImageView; private View emojiconViewContainer; private ChatContact chatContact; public EmojiconEditText emojiconEditText; public ChatFragment(int chatContactId) { this.chatContactId = chatContactId; databaseHelper = new DatabaseHelper(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.context = getActivity(); getSherlockActivity().getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); inputManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { fragmentView = inflater.inflate(R.layout.chat_main, null); FragmentManager fm = getChildFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); Fragment emojiconsFragment = new EmojiconsFragment(); ft.replace(R.id.emojiconsContainer, emojiconsFragment); ft.commit(); return fragmentView; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); statusText = (TextView) fragmentView.findViewById(R.id.ChatStatusText); emojiconEditText = (EmojiconEditText) fragmentView.findViewById(R.id.editMessage); emojiconEditText.requestFocus(); emojiconIconImageView = (ImageView) fragmentView.findViewById(R.id.chatSmileyIcon); emojiconIconImageView.setOnClickListener(new OnEmojiconIconClickListener()); emojiconViewContainer = fragmentView.findViewById(R.id.emojiconsContainer); emojiconViewContainer.setVisibility(View.GONE); setkeyboardLayoutListeners(); setContactLayout(); } public void setContactLayout() { ChatContact chatContact = databaseHelper.getContact(chatContactId); if(chatContact != null) { setStatusMessage(chatContact.Status); getSherlockActivity().setTitle(chatContact.Name); if(chatContact.Picture != null) { Bitmap l_bTmp = CommonUtilities.getSquareImage(CommonUtilities.createBitmapFromImageLocation(mStrBasePath + chatContact.Picture)); Bitmap l_bmpOverlay = BitmapFactory.decodeResource(context.getResources(), R.drawable.image_round_overlay_darkgrey); getSherlockActivity().getSupportActionBar().setIcon(CommonUtilities.createDrawableFromBitmap(getSherlockActivity().getApplicationContext(), CommonUtilities.overlay(l_bTmp, l_bmpOverlay))); } } } public void setStatusMessage(String message) { if(message != null && message.equals("")) message = getResources().getString(R.string.chat_status_default); statusText.setText(message); } @Override public void onResultSucceeded(String p_strResult) { // TODO Auto-generated method stub } @Override public void onProgress(Integer p_IntProgress) { // TODO Auto-generated method stub } @Override public void GotInternetBack() { // TODO Auto-generated method stub } public static void onAttachmentclick(MainActivity mainActivity) { // TODO Auto-generated method stub } private void changeKeyboardLayout(boolean showEmoticons) { if(showEmoticons) { inputManager.hideSoftInputFromWindow(emojiconEditText.getWindowToken(), 0); emojiconViewContainer.setVisibility(View.VISIBLE); emojiconIconImageView.setImageResource(R.drawable.ic_action_keyboard); } else { inputManager.showSoftInput(emojiconEditText, 0); emojiconViewContainer.setVisibility(View.INVISIBLE); emojiconIconImageView.setImageResource(R.drawable.smiley_icon); } } private void setkeyboardLayoutListeners() { emojiconEditText.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { changeKeyboardLayout(false); return false; } }); emojiconEditText.setKeyImeChangeListener(new KeyImeChange() { @Override public void onKeyIme(int keyCode, KeyEvent keyEvent) { if(keyEvent.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) { closeKeyboardLayout(); } } }); } private void closeKeyboardLayout() { inputManager.hideSoftInputFromWindow(emojiconEditText.getWindowToken(), 0); emojiconViewContainer.setVisibility(View.GONE); emojiconIconImageView.setImageResource(R.drawable.smiley_icon); } private class OnEmojiconIconClickListener implements OnClickListener { @Override public void onClick(View arg0) { if(emojiconViewContainer.getVisibility() == View.VISIBLE) { changeKeyboardLayout(false); } else { changeKeyboardLayout(true); } } } } 

chat_main.xml

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:emojicon="http://schemas.android.com/apk/res-auto" android:id="@+id/chatMainRoot" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:id="@+id/statusHold" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:background="@color/lightgrey" android:gravity="center" > <TextView android:id="@+id/ChatStatusText" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="left" android:text="@string/chat_status_default" android:textStyle="italic" android:textColor="#777777" android:maxLines="1" android:ellipsize="end" android:padding="10dp" /> </LinearLayout> <ListView android:id="@+id/Messages" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/statusHold" android:layout_above="@+id/writerLayout" /> <LinearLayout android:id="@+id/writerLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:orientation="vertical" > <LinearLayout android:id="@+id/chatSentMessageHolder" android:layout_width="match_parent" android:layout_height="50dp" android:background="@drawable/border_grey" android:orientation="horizontal" android:padding="5dp" > <ImageView android:id="@+id/chatSmileyIcon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:src="@drawable/smiley_icon" /> <com.rockerhieu.emojicon.EmojiconEditText android:id="@+id/editMessage" android:layout_width="0dip" android:layout_height="match_parent" android:layout_marginLeft="5dp" android:layout_marginRight="10dp" android:layout_marginTop="1dp" android:layout_weight="0.1" android:background="@drawable/et_selector" emojicon:emojiconSize="28sp" android:ems="10" android:hint="@string/chat_default_message_sent_text" android:inputType="text"/> <ImageView android:id="@+id/chatSentMessageIcon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="@drawable/chat_sent_icon" /> </LinearLayout> <!-- Layout to inflate the emojicons in --> <LinearLayout android:id="@+id/emojiconsContainer" android:layout_width="match_parent" android:layout_height="220dp" android:orientation="vertical"/> </LinearLayout> </RelativeLayout> - <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:emojicon="http://schemas.android.com/apk/res-auto" android:id="@+id/chatMainRoot" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:id="@+id/statusHold" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:background="@color/lightgrey" android:gravity="center" > <TextView android:id="@+id/ChatStatusText" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="left" android:text="@string/chat_status_default" android:textStyle="italic" android:textColor="#777777" android:maxLines="1" android:ellipsize="end" android:padding="10dp" /> </LinearLayout> <ListView android:id="@+id/Messages" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/statusHold" android:layout_above="@+id/writerLayout" /> <LinearLayout android:id="@+id/writerLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:orientation="vertical" > <LinearLayout android:id="@+id/chatSentMessageHolder" android:layout_width="match_parent" android:layout_height="50dp" android:background="@drawable/border_grey" android:orientation="horizontal" android:padding="5dp" > <ImageView android:id="@+id/chatSmileyIcon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:src="@drawable/smiley_icon" /> <com.rockerhieu.emojicon.EmojiconEditText android:id="@+id/editMessage" android:layout_width="0dip" android:layout_height="match_parent" android:layout_marginLeft="5dp" android:layout_marginRight="10dp" android:layout_marginTop="1dp" android:layout_weight="0.1" android:background="@drawable/et_selector" emojicon:emojiconSize="28sp" android:ems="10" android:hint="@string/chat_default_message_sent_text" android:inputType="text"/> <ImageView android:id="@+id/chatSentMessageIcon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="@drawable/chat_sent_icon" /> </LinearLayout> <!-- Layout to inflate the emojicons in --> <LinearLayout android:id="@+id/emojiconsContainer" android:layout_width="match_parent" android:layout_height="220dp" android:orientation="vertical"/> </LinearLayout> </RelativeLayout> 1 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:emojicon="http://schemas.android.com/apk/res-auto" android:id="@+id/chatMainRoot" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:id="@+id/statusHold" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:background="@color/lightgrey" android:gravity="center" > <TextView android:id="@+id/ChatStatusText" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="left" android:text="@string/chat_status_default" android:textStyle="italic" android:textColor="#777777" android:maxLines="1" android:ellipsize="end" android:padding="10dp" /> </LinearLayout> <ListView android:id="@+id/Messages" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/statusHold" android:layout_above="@+id/writerLayout" /> <LinearLayout android:id="@+id/writerLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:orientation="vertical" > <LinearLayout android:id="@+id/chatSentMessageHolder" android:layout_width="match_parent" android:layout_height="50dp" android:background="@drawable/border_grey" android:orientation="horizontal" android:padding="5dp" > <ImageView android:id="@+id/chatSmileyIcon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:src="@drawable/smiley_icon" /> <com.rockerhieu.emojicon.EmojiconEditText android:id="@+id/editMessage" android:layout_width="0dip" android:layout_height="match_parent" android:layout_marginLeft="5dp" android:layout_marginRight="10dp" android:layout_marginTop="1dp" android:layout_weight="0.1" android:background="@drawable/et_selector" emojicon:emojiconSize="28sp" android:ems="10" android:hint="@string/chat_default_message_sent_text" android:inputType="text"/> <ImageView android:id="@+id/chatSentMessageIcon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="@drawable/chat_sent_icon" /> </LinearLayout> <!-- Layout to inflate the emojicons in --> <LinearLayout android:id="@+id/emojiconsContainer" android:layout_width="match_parent" android:layout_height="220dp" android:orientation="vertical"/> </LinearLayout> </RelativeLayout> 

В ChatFragment я установил SoftInputMode в SOFT_INPUT_ADJUST_NOTHING, потому что я попытался загрузить клавиатуру emotoji за моей программной клавиатурой, которая работает очень хорошо. Единственная проблема, с которой я столкнулся, – это высота emojipicker. Когда я тестировал его на своей Галактике s3, размер был таким же, как у клавиатуры, на моей связи 5 и Galaxy Y DUO макет был немного больше и меньше, чем раскладка клавиатуры, чтобы невидимый emojipicker торчал из программной клавиатуры .. ,

Есть ли у кого-нибудь советы о том, как я могу успешно реализовать это, не получая странных макетов или анимаций?

Для всех, кого это интересует – вы можете посмотреть исходный код Telegram здесь https://github.com/DrKLO/Telegram/blob/master/TMessagesProj/src/main/java/org/telegram/ui/Views/ChatActivityEnterView.java

В основном это android.widget.PopupWindow

Intereting Posts