100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 自定义表情输入键盘

自定义表情输入键盘

时间:2020-10-25 15:56:54

相关推荐

自定义表情输入键盘

最近,在项目中集成了环信的即时通讯,其中使用到了他的easeUI库,这里集成了一些聊天界面和联系人界面,出于好奇,我便去看了看其中的代码,发现比较复杂,于是想自己做一个表情输入的键盘,easeui项目中的国语复杂,所以我先找了一个比较简单的项目来练手。项目github地址:/shinezejian/emotionkeyboard/blob/master/src/main/res/layout/include_emotion_bar.xml

这个项目实现的功能就是表情软键盘的开发

主界面

edittext界面

其实项目开发的难点就是下面的自定义表情软键盘,我想要实现这个效果,首先要考虑下面的问题

1.下方的表情组的显示隐藏问题

2.其中表情的摆放问题

3.最底部的分页器如何实现

4.点击表情在edittext的输入问题

这里需要一层层的进行嵌套实现,在EditTextActivity的布局中,可以先让一个EditText填充整个布局,底部使用一个FrameLayout作为表情键盘的容器,接下来,就是怎样在FrameLayout中去填充界面。

FrameLayout中需要装载底部的表情键盘的所有元素,包含的东西比较多,大致三部分,顶部的控制框,中间的表情框,底部的分页器,

控制框比较好做,单纯的就EditTextActivity来说,整体是一个LinearLayout,最左侧一个ImageButton来控制表情键盘的显示隐藏,

中间的表情框比较麻烦,我们从需求来考虑,首先表情组不止一组,底部的分页器就是用来控制显示不同的表情组,而且一个表情组不一定只在一页显示,那么就需要两个ViewPager了,最外层的ViewPager不允许左右滑动,只能依靠底部的分页器的点击来控制切换,这个ViewPager里面存储的是一个个Fragment,当点击底部的分页Item时,控制Fragment切换,来达到表情组的切换,内层的ViewPager用来显示一个表情组的各个表情元素,它里面存储的是GridView,表情就是里面的一个个Item,这个viewPager是允许左右滑动来达到浏览一个表情组的所有表情。

底部分页器就是一个RecycleView,Item的点击事件就是切换表情组的Fragment,来达到浏览所有表情组的效果。

在EditTextActivity的布局文件中,我们预留了一个FrameLayout用来装载表情键盘,现在表情键盘分析完成了,现在就需要将这个表情键盘插入到FrameLayout中,我们可以新建一个View,通过FrameLayout的addView方法将其插入进去,但是这里我们不这么做,因为如果将表情键盘整个看做一个View的话,后面的开发会有困难,我需要控制中间表情框和底部分页器不断的显示隐藏,而且还需要传一些数据来控制其显示的高度,所以这里采用Fragment,将整个表情框装到一个Fragment中,再讲Fragment去装到FrameLayout中,层层嵌套来达到显示效果。

这里涉及到Fragment之间的传递数据,我之间一直使用构造方法去传数据,今天才知道这可能会导致问题,因为Fragment如果会因为意外情况导致重新加载,会调用默认的构造方法去初始化,因此数据可能会丢失,所以Fragment之间传递数据需要使用setArguments()和getArguments()两个方法,这里我们写一个BaseFragment作为所有Fragment的父类,在这里来传递的数据可以让子类选择性去使用。

public class BaseFragment extends Fragment{//传递过来的参数Bundle,供子类使用 protected Bundle args; /*** 创建fragment的静态方法,方便传递参数* @param args 传递的参数* @return*/ public static <T extends Fragment>T newInstance(Class clazz,Bundle args) {T mFragment=null; try {mFragment= (T) clazz.newInstance(); } catch (java.lang.InstantiationException e) {e.printStackTrace(); } catch (IllegalAccessException e) {e.printStackTrace(); }mFragment.setArguments(args); return mFragment; }/*** 初始创建Fragment对象时调用* @param savedInstanceState*/ @Override public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); args = getArguments(); }}

其他细节可以查看这篇博客/javazejian/article/details/52126391

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。