15158846557 在线咨询 在线咨询
15158846557 在线咨询
所在位置: 首页 > 营销资讯 > 网站运营 > Android学习--制作ui界面

Android学习--制作ui界面

时间:2023-07-24 23:00:02 | 来源:网站运营

时间:2023-07-24 23:00:02 来源:网站运营

Android学习--制作ui界面:用Android制作一个简单的聊天界面,大概像微信聊天那样的界面

第一步,activity_main_xml的布局

这里用RecycleView安排消息的位置存放

值得注意的是RecycleView这个滚动控件 需要在build.gradle中添加依赖库(红框框出的那行)版本与appcompat一样。

所以,activity_main中的布局大致是 上面为RecycleView存放的消息条目,最底下有一行输入框和发送按钮。如图所示

以下是代码

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#d8e0e8"> <android.support.v7.widget.RecyclerView android:id="@+id/msg_recycle_view" android:layout_height="0dp" android:layout_width="match_parent" android:layout_weight="1" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:id="@+id/input_text" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:hint="type somethin here" android:maxLines="2"/> <Button android:id="@+id/send" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Send" /> </LinearLayout></LinearLayout>

第二步:msg_item_xml 的布局

这个布局是对activity_main布局的补充,是对发送消息和接受消息进行处理。

发送的消息在右边显示,接受的消息在左边显示。 并且双方的对话框背景不同。

大致效果如图 (对话框背景图片是我自己截图找的,比较丑,大家可以自己制作 )

试想:这样的对话框放到上面布局各个条目中,是不是就是微信的聊天界面啦?

以下是代码

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp"> <LinearLayout android:id="@+id/left_layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="left" android:background="@drawable/left"> <TextView 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"/> </LinearLayout> <LinearLayout android:id="@+id/right_layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right" android:background="@drawable/right"> <TextView android:id="@+id/right_msg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="10dp" /> </LinearLayout></LinearLayout>

第三步:Msg类

消息类 主要是封装 消息内容与 消息类型的类。

public class Msg { public static final int receive=0; public static final int send=1; private String content; private int type;//构造方法 public Msg(String content,int type){ this.content=content; this.type=type; }//get方法 获取内容与消息类型 public String getContent(){ return content; } public int getType(){ return type; }}

第四步:MsgAdapter类

这个类主要是RecycleView的适配器类

实现RecycleView 各个子项的内容 ,也就是接受消息还是发送消息的后台处理与前端显示。

public class MsgAdapter extends RecyclerView.Adapter<MsgAdapter.ViewHolder> { private List<Msg> mMsgList;//内部类 ViewHoleder 继承RecyclerView.ViewHoleder public class ViewHolder extends RecyclerView.ViewHolder{ TextView leftMsg; TextView righyMsg; LinearLayout leftlayout; LinearLayout rightlayout;//ViewHolder构造函数 传入参数view (这个参数是RecyclerView 子项的最外层布局)//这样便可以用findViewById()方法获取linelayout和 TextView public ViewHolder(View view){ super(view); leftlayout=(LinearLayout) view.findViewById(R.id.left_layout); rightlayout=(LinearLayout)view.findViewById(R.id.right_layout); leftMsg=(TextView)view.findViewById(R.id.left_msg); righyMsg=(TextView)view.findViewById(R.id.right_msg); } }//MsgAdapter构造函数 把数据源传进来 赋值给新变量mMsgList 后续操作用mMsgList public MsgAdapter(List<Msg> msgList){ mMsgList=msgList; }//重写RecyclerView.Adapter 的三个方法 @Override//这个方法是用于创建ViewHolder实例的 //加载 msg_item的布局 并传入ViewHolder实例中 public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.msg_item,parent,false); return new ViewHolder(view); } @Override //这个方法用于对子项的数据进行操作 判断 赋值等。 public void onBindViewHolder(ViewHolder holder, int position) { Msg msg =mMsgList.get(position); if(msg.getType()==Msg.receive){//接受消息 在左边布局显示 holder.leftlayout.setVisibility(View.VISIBLE); holder.rightlayout.setVisibility(View.GONE); holder.leftMsg.setText(msg.getContent()); }else if(msg.getType()==Msg.send){ //发送消息 在右边布局显示 holder.rightlayout.setVisibility(View.VISIBLE); holder.leftMsg.setVisibility(View.GONE); holder.righyMsg.setText(msg.getContent()); } } @Override//获取RecycleView的子项的个数 public int getItemCount() { return mMsgList.size(); }}

第五步:MainActivity类

1.创建消息的数组队列,用于存放消息

2.设置初始化消息

3.实例化输入文本框,按钮 的对象

4.创建RecyclerView滚动控件的实例化对象,并实现这个对象的布局方式和关联数据。

public class MainActivity extends AppCompatActivity { private List<Msg> msgList = new ArrayList<>(); private EditText inputText; private Button send; private RecyclerView msgRecyclerView; private MsgAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化消息数据 initMsgs(); //创建 输入框与发送按钮 的实例化对象 inputText = (EditText) findViewById(R.id.input_text); send = (Button) findViewById(R.id.send); //创建 RecyclerView 滚动控件的实例化对象 msgRecyclerView = (RecyclerView) findViewById(R.id.msg_recycle_view); //RecyclerView设置 LineLayout 的布局方式 LinearLayoutManager layoutManager = new LinearLayoutManager(this); msgRecyclerView.setLayoutManager(layoutManager); //RecyclerView设置适配器 并将消息的数据传入适配器中 实现和数据的关联 adapter = new MsgAdapter(msgList); msgRecyclerView.setAdapter(adapter); //按钮点击事件 send.setOnClickListener(new View.OnClickListener() { @Override //按钮点击发送消息 public void onClick(View view) { String content =inputText.getText().toString(); if(!"".equals(content)){ Msg msg=new Msg(content,Msg.send); msgList.add(msg); adapter.notifyItemInserted(msgList.size()-1); //当有新消息时 刷新ListView中的显示 msgRecyclerView.scrollToPosition(msgList.size()-1);//将ListView 定位到最后一行 inputText.setText("");//清空输入框的内容 } } }); } //初始的三条消息 private void initMsgs() { Msg msg1 = new Msg("Hello .", Msg.receive); msgList.add(msg1); Msg msg2 = new Msg("Hello who are you? ", Msg.send); msgList.add(msg2); Msg msg3 = new Msg("haha This is stinglog", Msg.receive); msgList.add(msg3); }}最终的效果大概是这样的,我的也实现了 但是消息的背景图片选的太丑了,就不在此献丑了。

出现的问题:

一:

Error:java.lang.RuntimeException: Crunching Cruncher right.9.png failed, see log 问题解决。

这个问题是在前端界面上使用的.9.png 图片有问题

存在这个问题的原因:

1.图片非正规的.9.png格式,只是随手将一张图片改改尾缀,这样会出现这个问题

2.通过draw9patch.bat(这个东西在android->sdk->tools->draw9patch.bat)制作后仍有此问题的原因是:制作不规范。点击show bad patches 还会出现红线的图片就是不规范的

如图。

3.9.png格式的图片只能放在drawable文件中,放在其他地方会出错。

解决方法:

改成正规格式,没有错误的.9.png图片即可。https://blog.csdn.net/u013472738/article/details/54619546

二:

编译后安装apk报错:Error while Installing APK

解决方法:

找到app中的gradle的配置 刷新一下 再编译即可。

具体原因看参考https://blog.csdn.net/qq_36525622/article/details/78996791

小结:

Android学习到现在为止 已经差不多掌握清楚了如何实现一个UI界面,以及掌握了其中的大部分控件和布局方式。

关键词:界面,学习

74
73
25
news

版权所有© 亿企邦 1997-2025 保留一切法律许可权利。

为了最佳展示效果,本站不支持IE9及以下版本的浏览器,建议您使用谷歌Chrome浏览器。 点击下载Chrome浏览器
关闭