Как сделать переход между клавиатурой emoji и программной клавиатурой?

Я работаю над приложением мгновенного чата для 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. Скриншот

введите здесь описание изображения

Как вы можете видеть на снимке экрана, у меня есть ImageView, EditText и кнопка отправки сообщения. При нажатии ImageView отображается панель эмодзи, а при нажатии кнопки EditText клавиатура эмодзи скрывается и отображается программная клавиатура. Следующий код обрабатывает это.

Отображение всплывающего окна со смайликами:

public void showEmojiPopUp(boolean showEmoji) {
    FrameLayout frameLayout = (FrameLayout) findViewById(R.id.emojicons);
    frameLayout.setVisibility(View.VISIBLE);
}

скрытие экранной клавиатуры:

public void hideKeyboard() {
        InputMethodManager inputManager = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
        inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }

Моя проблема в том, что я хочу, чтобы клавиатура emoji и программная клавиатура занимали одинаковое пространство. Одновременно должен быть виден только один. Я хочу сделать переход между клавиатурой emoji и программной клавиатурой. Как видно из кода, я добавляю клавиатуру эмодзи в FrameLayout. Я не могу сделать размер программной клавиатуры и клавиатуры смайликов равными здесь. Пожалуйста, помогите мне решить проблему.

Отредактированный код: я внес некоторые изменения в свой код:

Метод 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);
}

Это работает для меня сейчас.


person Deepak Rattan    schedule 20.01.2016    source источник
comment
привет ... вы нашли какое-либо решение? У меня точно такая же проблема   -  person H Raval    schedule 16.02.2016
comment
Пожалуйста, скажите мне, работает ли это для вас или нет.   -  person Deepak Rattan    schedule 16.02.2016
comment
ну, я использовал другой код... но логика такая же   -  person H Raval    schedule 16.02.2016
comment
@HRaval: Вы можете отправлять смайлики на другое устройство. Я кодирую смайлик в символ Юникода, используя String toServer = StringEscapeUtils.escapeJava(message); я декодирую, используя String messageReceived = StringEscapeUtils.unescapeJava(unicodeMessageReceived); Теперь я показываю юникод через EmojiconTextView. Но он не преобразует юникод в соответствующее изображение. Можете ли вы помочь мне это исправить?   -  person Deepak Rattan    schedule 17.02.2016
comment
Давайте продолжим это обсуждение в чате.   -  person H Raval    schedule 17.02.2016


Ответы (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;
        }
    }
person H Raval    schedule 17.02.2016