如何在Android中处理Emojipicker和键盘之间的切换?

时间:2014-03-19 18:14:10

标签: android android-layout keyboard emoji

我正在处理的应用程序的功能是人们可以互相聊天。在ChatFragment中。我想拥有与Whatsapp和Telegram相同的功能,你可以点击表情符号按钮,键盘切换到Emojipicker 没有任何过渡,其中表情符号拾取器具有与键盘相同的布局高度(就像whatsapp和电报)。

当我实现它并从软件键盘切换到表情符号键盘时,我的软件键盘会消失,我的表情符号的可见性将从GONE设置为VISIBLE。除了丑陋的越野车过渡,因为布局的变化,所有设备的尺寸也相同,而不记住键盘有不同的高度。我使用以下emojipicker https://github.com/rockerhieu/emojicon

任何人都知道如何更改我的实现,以使我的表情符号与键盘的高度相同?我尝试了各种各样的东西,但没有一个工作..从我的chatfragment和布局下面的一些代码。

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>

在ChatFragment中我将SoftInputMode设置为SOFT_INPUT_ADJUST_NOTHING,因为我试图在我的软件键盘后面加载emotoji键盘,效果非常好。我唯一遇到的问题是表情符号的高度。当我在我的Galaxy s3上测试它的大小和键盘相同时,在我的nexus 5和Galaxy Y DUO上,布局比键盘布局更大更小,这样隐形的emojipicker就会从软件键盘中弹出来。

有没有人知道如何在不会​​出现奇怪的布局故障或动画的情况下成功实现这一点?

1 个答案:

答案 0 :(得分:0)

对任何感兴趣的人 - 您可以在这里查看Telegram源代码https://github.com/DrKLO/Telegram/blob/master/TMessagesProj/src/main/java/org/telegram/ui/Views/ChatActivityEnterView.java

基本上这是android.widget.PopupWindow