- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在开发的应用程序的一个功能是人们可以互相聊天。在聊天 fragment 中。我想拥有与 Whatsapp 和 Telegram 相同的功能,您可以在其中单击表情符号按钮,然后键盘切换到表情符号选择器 Without 任何过渡,其中表情符号选择器的布局高度与我的键盘相同(就像whatsapp 和电报)。
当我实现它并从软件键盘切换到表情符号键盘时,我的软件键盘会消失并且我的表情符号选择器的可见性将从 GONE 设置为 VISIBLE。除了由于不断变化的布局而导致丑陋的 buggy 过渡之外,它在所有设备上的尺寸也相同,而无需记住键盘具有不同的高度。我正在使用以下表情符号选择器 https://github.com/rockerhieu/emojicon
有人知道如何更改我的实现以使我的表情符号选择器与我的键盘高度相同吗?我尝试了各种方法,但都没有用。下面是我的聊天 fragment 和布局中的一些代码。
聊天 fragment
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,因为我试图在我的软件键盘后面加载表情符号键盘,效果非常好。我再次遇到的唯一问题是表情符号选择器的高度。当我在我的 Galaxy s3 上测试它时,它的大小与键盘相同,在我的 nexus 5 和 Galaxy Y DUO 上,布局比键盘布局大一点和小一点,所以看不见的表情符号从软件键盘上伸出来。 .
有没有人对我如何成功实现此功能而不会出现奇怪的布局故障或动画有任何提示?
最佳答案
任何感兴趣的人 - 您可以在这里查看 Telegram 源代码 https://github.com/DrKLO/Telegram/blob/master/TMessagesProj/src/main/java/org/telegram/ui/Views/ChatActivityEnterView.java
基本上这是 android.widget.PopupWindow
关于android - 我如何处理 Android 中 Emojipicker 和键盘之间的切换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22514672/
我需要修复 getLineNumberFor 方法,以便如果 lastName 的第一个字符位于 A 和 M 之间,则返回 1;如果它位于 N 和 Z 之间,则返回 2。 在我看来听起来很简单,但我不
您好,感谢您的帮助!我有这个: 0 我必须在每次点击后增加“pinli
Javascript 中是否有一种方法可以在不使用 if 语句的情况下通过 switch case 结构将一个整数与另一个整数进行比较? 例如。 switch(integer) { case
我有一列是“日期”类型的。如何在自定义选项中使用“之间”选项? 最佳答案 请注意,您有2个盒子。 between(在SQL中)包含所有内容,因此将框1设置为:DATE >= startdate,将框2
我有一个表,其中包含年、月和一些数字列 Year Month Total 2011 10 100 2011 11 150 2011 12 100 20
这个问题已经有答案了: Extract a substring between double quotes with regular expression in Java (2 个回答) how to
我有一个带有类别的边栏。正如你在这里看到的:http://kees.een-site-bouwen.nl/ url 中类别的 ID。带有 uri 段(3)当您单击其中一个类别时,例如网页设计。显示了一
这个问题在这里已经有了答案: My regex is matching too much. How do I make it stop? [duplicate] (5 个答案) 关闭 4 年前。 我
我很不会写正则表达式。 我正在尝试获取括号“()”之间的值。像下面这样的东西...... $a = "POLYGON((1 1,2 2,3 3,1 1))"; preg_match_all("/\((
我必须添加一个叠加层 (ImageView),以便它稍微移动到包含布局的左边界的左侧。 执行此操作的最佳方法是什么? 尝试了一些简单的方法,比如将 ImageView 放在布局中并使用负边距 andr
Rx 中是否有一些扩展方法来完成下面的场景? 我有一个开始泵送的值(绿色圆圈)和其他停止泵送的值(簧片圆圈),蓝色圆圈应该是预期值,我不希望这个命令被取消并重新创建(即“TakeUntil”和“Ski
我有一个看起来像这样的数据框(Dataframe X): id number found 1 5225 NA 2 2222 NA 3 3121 NA 我有另一个看起来
所以,我正在尝试制作正则表达式,它将解析存储在对象中的所有全局函数声明,例如,像这样 const a = () => {} 我做了这样的事情: /(?:const|let|var)\s*([A-z0-
我正在尝试从 Intellivision 重新创建 Astro-Smash,我想让桶保持在两个 Angular 之间。我只是想不出在哪里以及如何让这个东西停留在两者之间。 我已经以各种方式交换了函数,
到处检查但找不到答案。 我有这个页面,我使用 INNER JOIN 将两个表连接在一起,获取它们的值并显示它们。我有这个表格,用来获取变量(例如开始日期、结束日期和卡号),这些变量将作为从表中调用值的
我陷入了两个不同的问题/错误之间,无法想出一个合适的解决方案。任何帮助将不胜感激 上下文、FFI 和调用大量 C 函数,并将 C 类型包装在 rust 结构中。 第一个问题是ICE: this pat
我在 MySQL 中有一个用户列表,在订阅时,时间戳是使用 CURRENT_TIMESTAMP 在数据库中设置的。 现在我想从此表中选择订阅日期介于第 X 天和第 Y 天之间的表我尝试了几个查询,但不
我的输入是开始日期和结束日期。我想检查它是在 12 月 1 日到 3 月 31 日之间。(年份可以更改,并且只有在此期间内或之外的日期)。 到目前为止,我还没有找到任何关于 Joda-time 的解决
我正在努力了解线程与 CPU 使用率的关系。有很多关于线程与多处理的讨论(一个很好的概述是 this answer )所以我决定通过在运行 Windows 10、Python 3.4 的 8 CPU
我正在尝试编写 PHP 代码来循环遍历数组以创建 HTML 表格。我一直在尝试做类似的事情: fetchAll(PDO::FETCH_ASSOC); ?>
我是一名优秀的程序员,十分优秀!