这篇文章主要为大家详细介绍了机器人实现聊天界面的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了机器人实现聊天界面的具体代码,供大家参考,具体内容如下
文件目录
在应用下的build.gradle中添加依赖库(RecyclerView)
应用插件:" com.android.application "
android {
编译版本24
buildToolsVersion '26.0.1 '
defaultConfig {
应用程序id ' com。举例。最佳实践
minSdkVersion 15
目标版本24
版本代码一
版本名称' 1.0 '
testInstrumentationRunner ' Android。支持。测试。奔跑者。“安卓朱尼特伦纳”
}
构建类型{
发布{
minifyEnabled false
proguardFiles getDefaultProguardFile(' proguard-Android。txt '),' proguarrules.pro '
}
}
}
依赖关系{
编译文件树(目录:' libs ',包含:['*。jar'])
Android测试编译(' com。安卓。支持。测试。浓缩咖啡:浓缩咖啡核心:2。2 .2 ',{
排除群组:' com.android.support ',模组:'支持-注释'
})
编译“通讯器。安卓。支持:app compat-V7:24。2 .1"
编译“通讯器。安卓。支持。约束:约束-布局:1。0 .2"
编译com。安卓。支持:回收器视图-V7:24。2 .1 '//添加回收视图依赖库
测试编译" junit:junit:4.12 "
}
编写主界面(activity_main.xml)
?可扩展标记语言版本='1.0 '编码='utf-8 '?
线性布局xmlns:Android=' http://模式。安卓。' com/apk/RES/Android '
安卓:方向='垂直'
Android:layout _ width=' match _ parent '
Android:layout _ height=' match _ parent '
android:background='#d8e0d8 '
安卓。支持。V7。小部件。回收视图
Android:id=' @ id/msg _ recycler _ view '
Android:layout _ width=' match _ parent '
android:layout_height='0dp '
android:layout_weight='1'/
线性布局
Android:layout _ width=' match _ parent '
Android:layout _ height=' wrap _ content '
编辑文本
android:id='@ id/input_text '
android:layout_width='0dp '
Android:layout _ height=' wrap _ content '
android:layout_weight='1 '
android:hint='在这里输入一些东西'
android:maxLines='2'/
纽扣
android:id='@ id/send '
Android:layout _ width=' wrap _ content '
Android:layout _ height=' wrap _ content '
android:text='Send'/
/线性布局
/线性布局
在主界面中放置的回收视图用于显示消息编辑文本用于编辑消息纽扣用于发送消息
定义消息的实体类味精
包com。举例。uibestpractivon;
公共类消息{
public static final int TYPE _ RECEIVED=0;
public static final int TYPE _ SENT=1;
私有字符串内容;
私有int类型;
公共消息(字符串内容,整型){
this.content=内容;
this.type=type
}
公共字符串getContent() {
返回内容;
}
public int getType() {
返回类型;
}
}
用两个常量来表示消息的类型(接收的还是发送的)
编写回收视图的子布局(msg_item.xml)
?可扩展标记语言版本='1.0 '编码='utf-8 '?
线性布局xmlns:Android=' http://模式。安卓。' com/apk/RES/Android '
安卓:方向='垂直'
Android:layout _ width=' match _ parent '
Android:layout _ height=' wrap _ content '
android:padding='10dp '
线性布局
android:id='@ id/left_layout '
Android:layout _ width=' wrap _ content '
Android:layout _ height=' wrap _ content '
android:layout_gravity='left '
Android:background=' @ drawable/message _ left '
文本视图
android:id='@ id/left_msg '
Android:layout _ width=' wrap _ content '
Android:layout _ height=' wrap _ content '
android:layout_gravity='center '
android:layout_margin='10dp '
android:textColor='#fff'/
/线性布局
线性布局
android:id='@ id/right_layout '
Android:layout _ width=' wrap _ content '
Android:layout _ height=' wrap _ content '
android:layout_gravity='right '
Android:background=' @ drawable/message _ right '
文本视图
android:id='@ id/right_msg '
Android:layout _ width=' wrap _ content '
Android:layout _ height=' wrap _ content '
android:layout_gravity='center '
android:layout_margin='10dp'/
/线性布局
/线性布局
将接收的消息居左对齐,发送的消息居右对齐
创建回收视图适配器类
包com。举例。uibestpractivon;
导入安卓。支持。V7。小部件。回收视图;
导入安卓。查看。layoutinflater
导入安卓。查看。查看;
导入安卓。查看。查看组;
导入安卓。小部件。线性布局;
导入安卓。小部件。textview
导入Java。util。列表;
公共类MsgAdapter扩展回收查看.AdapterMsgAdapter。取景框{
私人列表消息消息列表
静态类取景器扩展回收查看.取景框{
线性布局左布局;
线性布局右侧布局
TextView leftMsg
TextView rihgtMsg
公共视图持有者(视图视图){
超级(查看);
左布局=(线性布局)视图。findviewbyid(r . id。left _ layout);
右布局=(线性布局)视图。findviewbyid(r . id。右_布局);
left msg=(TextView)视图。findviewbyid(r . id。left _ msg);
rihgtMsg=(TextView)视图。findviewbyid(r . id。右_ msg);
}
}
公共消息适配器(ListMsg msgList){
mMsgList=msgList
}
@覆盖
public view holder oncreate view holder(视图组parent,int viewType) {
view view=layoutinflater。来自(父母。获取上下文()).inflate(R.layout.msg_item,parent,false);
返回新的取景框(视图);
}
@覆盖
public void onBindViewHolder(view holder holder,int position) {
msg=mmsg列表。get(位置);
if (msg.getType()==Msg .TYPE_RECEIVED) {
持有人。左侧布局。设置可见性(查看。可见);
持有人。右布局。设置可见性(查看。不见了);
持有人。左味精。settext(消息。get content());
} else if (msg.getType()==Msg .TYPE_SENT) {
持有人。右布局。设置可见性(查看。可见);
持有人。左侧布局。设置可见性(查看。不见了);
持有人。rihgtmsg。settext(消息。get content());
}
}
@覆盖
public int getItemCount() {
返回mmsg列表。size();
}
}
定义了一个内部类取景框,继承自回收查看.取景框。取景器的构造函数中传入一个视角参数,这个参数通常是RecyclerView子项的最外层布局,这样我们就可以通过findViewById()方法来获取布局中的接收和发送消息布局的实例了MsgAdapter中也有一个构造函数,将要展示的数据源传进来复制给短信列表。MsgAdapter继承自回收查看.适配器,必须重写onCreateViewHolder()、onBindViewHolder()、getItemCount()三个方法onCreateViewHolder()用于创建取景器实例,在这个方法中将消息_项目布局加载进来,然后创建一个取景器实例,并把加载出来的布局传到构造函数中,返回实例onBindViewHolder()用于对回收视图子项的数据进行赋值getItemCount()获得回收视图有多少个子项
使用回收查看(修改主要活动)
包com。举例。uibestpractivon;
导入安卓。支持。V7。app。app compat活动;
导入安卓。OS。捆绑;
导入安卓。支持。V7。小部件。linearrayoutmanager
导入安卓。支持。V7。小部件。回收视图;
导入安卓。查看。查看;
导入安卓。小部件。按钮;
导入安卓。小部件。编辑文本;
导入Java。util。ArrayList
导入Java。util。列表;
公共类主要活动扩展AppCompatActivity {
private ListMsg msgList=new ArrayList();
私有编辑文本输入文本
私人按钮发送;
私有RecyclerView msgRecyclerView
私有MsgAdapter适配器;
@覆盖
受保护的void onCreate(Bundle saved instancestate){
超级棒。oncreate(savedInstanceState);
setContentView(r . layout。活动_主);
init msgs();
输入文本=(EditText)findViewById(r . id。输入_文本);
send=(Button)findViewById(r . id。发送);
msgRecyclerView=(回收器视图)findViewById(r . id。msg _ recycler _ view);
LinearLayoutManager布局管理器=new LinearLayoutManager(this);
msgrecyclerview。setlayoutmanager(布局管理器);
adapter=新消息适配器(消息列表);
msgRecyclerView.setAdapter(适配器);
send.setOnClickListener(新视图OnClickListener() {
@覆盖
公共void onClick(视图五){
字符串内容=输入文本。gettext().toString();
如果(!''.等于(内容)){
消息消息=新消息(内容,消息. TYPE _ SENT);
msglist。添加(味精);
适配器。notifyiteminserted(邮件列表。size()-1);
msgrecyclerview。scrolltoposition(消息列表。size()-1);
输入文本。settext(');
}
}
});
}
私有void initMsgs() {
消息msg1=新消息(‘你好’,Msg .TYPE _ RECEIVED);
msglist。添加(msg 1);
消息msg2=新消息('我是约翰,味精.TYPE _ RECEIVED);
消息列表。添加(msg 2);
消息msg3=新消息(‘你好’,Msg .TYPE _ SENT);
msglist。添加(msg 3);
}
}
onCreate()方法中先获得了回收视图的实例,然后创建了LinearLayoutManager对象,并把它设置到回收视图的实例中去布局管理器用于指定RecyclerView的布局方式,这里使用是线性布局的意思,可以实现列表视图相同的效果。
设置了派遣按钮的响应事件,如果内容不为空则创建出一个新的味精对象,并添加到msgList中去,之后调用了适配器的方法notifyItemInserted()来通知列表有新数据插入,这样新增的消息才能在回收视图中显示。接着调用回收视图的scrollToPosition()方法,将显示的数据定位到最后一行,最后清空输入栏。
效果图:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。