Как сделать переход между смайликами и софт клавиатурой?
Я работаю над приложением мгновенного чата Android. Я успешно реализовал основные функции этого. Теперь я добавил панель смайликов, используя библиотеку compile 'com.rockerhieu.emojicon:library:1.3.3'
, Я использую FrameLayout в своем XML-файле для отображения смайликов.
1. activity_chat.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FCAB26"
android:orientation="vertical"
android:weightSum="1">
<ListView
android:id="@+id/list_view_messages"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight=".60"
android:background="@null"
android:divider="@null"
android:stackFromBottom="true"
android:transcriptMode="alwaysScroll"></ListView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_weight=".10"
android:orientation="horizontal"
android:weightSum="1">
<ImageView
android:id="@+id/imgSmile"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight=".10"
android:src="@drawable/ic_msg_panel_smiles"
android:layout_gravity="center_vertical"
android:layout_marginRight="-10sp"/>
<com.rockerhieu.emojicon.EmojiconEditText
android:id="@+id/edtMessage"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:hint="Enter Message"
android:layout_weight=".60"></com.rockerhieu.emojicon.EmojiconEditText>
<Button
android:id="@+id/btnSendMessage"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_weight=".30"
android:gravity="center"
android:onClick="onClick"
android:text="Send Message" />
</LinearLayout>
<FrameLayout
android:id="@+id/emojicons"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight=".30"
android:visibility="gone" />
</LinearLayout>
Здесь даже после указания видимости как пропавшего, FrameLayout занимает некоторое место.
Код, который отображает панель смайликов через вышеупомянутую библиотеку, приведен ниже:
// This method will set a panel of emoticons in the fragment
private void setEmojiconFragment(boolean useSystemDefault) {
// Replacing the existing fragment having id emojicons with the fragment of emoticons library containing emoticons
getSupportFragmentManager().beginTransaction().replace(R.id.emojicons, EmojiconsFragment.newInstance(useSystemDefault)).commit();
}
3.Screenshot
Как вы можете видеть на скриншоте, у меня есть ImageView, EditText и кнопка отправки сообщения. При нажатии ImageView отображается панель " Emoji", а при нажатии "EditText" клавиатура "Emoji" скрывается и отображается программная клавиатура. Следующий код обрабатывает это.
Показываю эмодзи всплывающее окно:
public void showEmojiPopUp(boolean showEmoji) {
FrameLayout frameLayout = (FrameLayout) findViewById(R.id.emojicons);
frameLayout.setVisibility(View.VISIBLE);
}
скрытие softkeyboard:
public void hideKeyboard() {
InputMethodManager inputManager = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
Моя проблема в том, что я хочу, чтобы эмодзи-клавиатура и программная клавиатура занимали одинаковое пространство. За один раз должен быть виден только один. Я хочу сделать переход между клавиатурой Emoji и мягкой клавиатурой. Как вы можете видеть из кода, я добавляю клавиатуру Emoji в FrameLayout. Я не могу сделать размер мягкой клавиатуры и клавиатуры Emoji здесь равными. Пожалуйста, помогите мне решить проблему.
Отредактированный код: я внес некоторые изменения в свой код:
Метод showEmojiPopUp(): Здесь мы настраиваем высоту FrameLayout, содержащую панель смайликов, чтобы высота программных клавиш и клавиш смайликов была одинаковой.
public void showEmojiPopUp(boolean showEmoji) {
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
deviceHeight = size.y;
Log.e("Device Height", String.valueOf(deviceHeight));
frameLayout = (FrameLayout) findViewById(R.id.emojicons);
frameLayout.getLayoutParams().height = (int) (deviceHeight / 2.5); // Setting the height of FrameLayout
frameLayout.requestLayout();
frameLayout.setVisibility(View.VISIBLE);
hideKeyboard();
}
2. метод hideKryboard()
// Hiding the keyboard
public void hideKeyboard() {
InputMethodManager inputManager = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
Это работает для меня сейчас.
1 ответ
Я использую этот код, который я нашел здесь.... ссылка
public Spannable parse(String text) {
CharSequence fromCache = cache.get(text);
if (fromCache != null) {
return (Spannable) fromCache;
} else {
CharSequence parsed = emoji.replaceEmoji(text);
Matcher matcher = userReference.matcher(text);
Spannable s;
if (parsed instanceof Spannable) {
s = (Spannable) parsed;
} else {
s = Spannable.Factory.getInstance().newSpannable(parsed);
}
while (matcher.find()) {
s.setSpan(new ForegroundColorSpan(0xff427ab0), matcher.start(), matcher.end(), 0);
}
cache.put(text, s);
return s;
}
}