我正在工作的應用程序的功能是人們可以與海誓山盟聊天。在ChatFragment中。我想有相同的功能WhatsApp的和電報,您可以點擊表情按鈕和鍵盤切換到Emojipicker 沒有其中emoticonpicker具有相同的佈局的高度,我的鍵盤(就像WhatsApp的和電報)任何過渡。如何在Android中處理Emojipicker和鍵盤之間的切換?
當我實現它,並從softwarekeyboard切換到表情符號鍵盤我softwarekeyboard將dissapear和去可見我emojipicker的可見性將被設置。除了由於佈局變化而導致的醜陋的錯誤過渡之外,所有設備的尺寸也相同,因此不必牢記鍵盤具有不同的高度。我正在使用以下emojipicker https://github.com/rockerhieu/emojicon
任何人都知道如何更改我的實現,以便我的emojipicker與我的鍵盤具有相同的高度?我嘗試了各種各樣的東西,但沒有一個工作..在我的chatfragment和layout下面的一些代碼。
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因爲我tryed加載我softwarekeyboard背後的emotoji鍵盤,其工作非常非常好。我再次遇到的唯一問題是emojipicker的高度。當我測試了我的Galaxy S3的大小是一樣的鍵盤,我的Nexus 5和GalaxyŸDUO佈局有點大縮小,然後在鍵盤佈局,使無形的emojipicker貼出來的軟件鍵盤的.. 。
有沒有人對我怎樣才能成功地實現這個沒有得到怪異的佈局毛刺或動畫任何提示?
嘿。你有沒有用這個解決方案寫博客?我對它很感興趣。謝謝。 – Stanete
是的,我希望看到你的解決方案。 – Dave
在哪裏博客文章 –