请问安卓QQ从哪版起QQ聊天界面面有声音提示

新版安卓qq双击聊天界面就会。。_西安建筑科技大学吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:171,798贴子:
新版安卓qq双击聊天界面就会。。收藏
神牛摄影器材--为专业摄影者打造,你值得拥有!
就会开启摄像头,我会乱说?!
这下走路聊天可以看路了。。
同时也是一款偷窥神器。。
还没发现这个功能的。。。有木有
。。。。素真的/                     --糖醋里脊,红烧排骨,鱼香肉丝,家常豆腐。。。米饭两碗。。。     〖MX2  梦微〗 
然后呢   【time feeling so face】            -by  lsa  
怎么打开!我怎么不会!求教。
邻居家扩容了30㎡!现在才告诉我他的家装秘籍!
楼主傻逼       ~~  锄禾日当午,汗滴禾下土。  谁知盘中餐,粒粒皆辛苦。      
哇哦  血染江山的画,怎敌你眉间一点朱砂覆了天下也罢,始终不过一场繁华         ~来自小文艺的流氓兔   
楼主真的是傻逼不用多久我就会升职加薪,当上总经理,出任CEO,赢取白富美,走上人生巅峰!想想还有点小激动。    --32个赞哦
这个楼上真的说的对\(^o^)/        人生也许就是不断地放下好些事情,最令人痛心的,是没能好好地与他们道别。          --来自多多 独家发布
弄不了。。。   --来自小米土豪塑料款~~~小米,为发shao而生~✘♞【水军后勤部新人—龙猫】
就有背景啊就视频头就开了一只青蛙两张嘴三只眼睛四条腿。
露珠的意思是双击聊天界面,然后聊天背景就是你现在手机摄像头照出来的了,还是动态的
我竟然都不知道!!!
[滑稽] 听说朋友谈恋爱了,我问他感觉如何,他垂头丧气地说:“零花钱太多,不爽啊。”我非常惊讶,问道:“为什么零花钱多了你会不爽?”“呵呵,因为我是一啊。”:
早知道了          ——最美的不是下雨天,是与你躲过雨的屋檐。
谁在挖坟。。。
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或2984人阅读
Android 学习进阶(40)
好几天没动手了,感觉有点手懒了,干我们这行真的一点不能懈怠啊!
回来写了个仿扣扣聊天界面的实现,动态添加聊天内容等!
主体:RecylerView+LinearLayout
简单的模仿一下扣扣。
下面介绍一下怎么实现的
demo结构:
看起来没那么复杂哈。
主页面布局
&?xml version="1.0" encoding="utf-8"?&
xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#EEEEEE"
android:orientation="vertical"
tools:context=".activity.MainActivity"&
android:id="@+id/recylerView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" /&
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="#EEEEEE"
android:orientation="horizontal"
android:padding="4dp"&
android:id="@+id/et"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_margin="4dp"
android:layout_weight="5"
android:paddingLeft="4dp"
android:textSize="14sp"
android:background="@drawable/bg_et" /&
android:id="@+id/tvSend"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="4dp"
android:layout_weight="1"
android:background="@drawable/bg_send"
android:gravity="center"
android:padding="6dp"
android:text="发送"
android:textColor="#FFFFFF"
android:textSize="10sp" /&
就是一个RecylerView+LinearLayout
适配器主要实现
public ChatAdapter.BaseAdapter onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case ItemModel.CHAT_A:
return new ChatAViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.chat_a, parent, false));
case ItemModel.CHAT_B:
return new ChatBViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.chat_b, parent, false));
return null;
public void onBindViewHolder(ChatAdapter.BaseAdapter holder, int position) {
holder.setData(dataList.get(position).object);
public int getItemViewType(int position) {
return dataList.get(position).
public int getItemCount() {
return dataList != null ? dataList.size() : 0;
根据传递的不同viewType,创建两个viewHolder,对应两个不同布局。
看看数据是怎么传递的
package com.example.wangchang.testchat
import com.example.wangchang.testchat.model.ChatModel
import com.example.wangchang.testchat.model.ItemModel
import java.util.ArrayList
public class TestData {
public static ArrayList&ItemModel& getTestAdData() {
ArrayList&ItemModel& models = new ArrayList&&()
ChatModel model = new ChatModel()
model.setContent("你好?我们交个朋友吧!")
model.setIcon("http://img.my.csdn.net/uploads//_3497.jpg")
models.add(new ItemModel(ItemModel.CHAT_A, model))
ChatModel model2 = new ChatModel()
model2.setContent("我是隔壁小王,你是谁?")
model2.setIcon("http://img.my.csdn.net/uploads//_6667.jpg")
models.add(new ItemModel(ItemModel.CHAT_B, model2))
ChatModel model3 = new ChatModel()
model3.setContent("what?你真不知道我是谁吗?哭~")
model3.setIcon("http://img.my.csdn.net/uploads//_3497.jpg")
models.add(new ItemModel(ItemModel.CHAT_A, model3))
ChatModel model4 = new ChatModel()
model4.setContent("大哥,别哭,我真不知道")
model4.setIcon("http://img.my.csdn.net/uploads//_6667.jpg")
models.add(new ItemModel(ItemModel.CHAT_B, model4))
ChatModel model5 = new ChatModel()
model5.setContent("卧槽,你不知道你来撩妹?")
model5.setIcon("http://img.my.csdn.net/uploads//_3497.jpg")
models.add(new ItemModel(ItemModel.CHAT_A, model5))
ChatModel model6 = new ChatModel()
model6.setContent("你是妹子,卧槽,我怎么没看出来?")
model6.setIcon("http://img.my.csdn.net/uploads//_6667.jpg")
models.add(new ItemModel(ItemModel.CHAT_B, model6))
return models
这里很好理解,创建两个model,itemModel对应不同的数据类型,ChatModel是聊天内容实体类。
* Created by WangChang on .
public class ItemModel implements Serializable {
public static final int CHAT_A = 1001;
public static final int CHAT_B = 1002;
public int
public ItemModel(int type, Object object) {
this.type =
this.object =
圆形头像的实现,借助了CircleImageView ,其实Glide就可以实现各种圆角的图片的实现。
package com.example.wangchang.testchat.
import android.content.C
import android.content.res.TypedA
import android.graphics.B
import android.graphics.BitmapS
import android.graphics.C
import android.graphics.C
import android.graphics.ColorF
import android.graphics.M
import android.graphics.P
import android.graphics.RectF;
import android.graphics.S
import android.graphics.drawable.BitmapD
import android.graphics.drawable.ColorD
import android.graphics.drawable.D
import android.net.U
import android.support.annotation.ColorR
import android.support.annotation.DrawableR
import android.util.AttributeS
import android.widget.ImageV
import com.example.wangchang.testchat.R;
* 圆形图片
* Created by liyingfeng on .
public class CircleImageView extends ImageView {
private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;
private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;
private static final int COLORDRAWABLE_DIMENSION = 2;
private static final int DEFAULT_BORDER_WIDTH = 0;
private static final int DEFAULT_BORDER_COLOR = Color.BLACK;
private static final boolean DEFAULT_BORDER_OVERLAY = false;
private final RectF mDrawableRect = new RectF();
private final RectF mBorderRect = new RectF();
private final Matrix mShaderMatrix = new Matrix();
private final Paint mBitmapPaint = new Paint();
private final Paint mBorderPaint = new Paint();
private int mBorderColor = DEFAULT_BORDER_COLOR;
private int mBorderWidth = DEFAULT_BORDER_WIDTH;
private Bitmap mB
private BitmapShader mBitmapS
private int mBitmapW
private int mBitmapH
private float mDrawableR
private float mBorderR
private ColorFilter mColorF
private boolean mR
private boolean mSetupP
private boolean mBorderO
public CircleImageView(Context context) {
super(context);
public CircleImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
public CircleImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView, defStyle, 0);
mBorderWidth = a.getDimensionPixelSize(R.styleable.CircleImageView_border_width, DEFAULT_BORDER_WIDTH);
mBorderColor = a.getColor(R.styleable.CircleImageView_border_color, DEFAULT_BORDER_COLOR);
mBorderOverlay = a.getBoolean(R.styleable.CircleImageView_border_overlay, DEFAULT_BORDER_OVERLAY);
a.recycle();
private void init() {
super.setScaleType(SCALE_TYPE);
mReady = true;
if (mSetupPending) {
mSetupPending = false;
public ScaleType getScaleType() {
return SCALE_TYPE;
public void setScaleType(ScaleType scaleType) {
if (scaleType != SCALE_TYPE) {
throw new IllegalArgumentException(String.format("ScaleType %s not supported.", scaleType));
public void setAdjustViewBounds(boolean adjustViewBounds) {
if (adjustViewBounds) {
throw new IllegalArgumentException("adjustViewBounds not supported.");
protected void onDraw(Canvas canvas) {
if (getDrawable() == null) {
canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius, mBitmapPaint);
if (mBorderWidth != 0) {
canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius, mBorderPaint);
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
public int getBorderColor() {
return mBorderC
public void setBorderColor(int borderColor) {
if (borderColor == mBorderColor) {
mBorderColor = borderC
mBorderPaint.setColor(mBorderColor);
invalidate();
public void setBorderColorResource(@ColorRes int borderColorRes) {
setBorderColor(getContext().getResources().getColor(borderColorRes));
public int getBorderWidth() {
return mBorderW
public void setBorderWidth(int borderWidth) {
if (borderWidth == mBorderWidth) {
mBorderWidth = borderW
public boolean isBorderOverlay() {
return mBorderO
public void setBorderOverlay(boolean borderOverlay) {
if (borderOverlay == mBorderOverlay) {
mBorderOverlay = borderO
public void setImageBitmap(Bitmap bm) {
super.setImageBitmap(bm);
public void setImageDrawable(Drawable drawable) {
super.setImageDrawable(drawable);
mBitmap = getBitmapFromDrawable(drawable);
public void setImageResource(@DrawableRes int resId) {
super.setImageResource(resId);
mBitmap = getBitmapFromDrawable(getDrawable());
public void setImageURI(Uri uri) {
super.setImageURI(uri);
mBitmap = getBitmapFromDrawable(getDrawable());
public void setColorFilter(ColorFilter cf) {
if (cf == mColorFilter) {
mColorFilter =
mBitmapPaint.setColorFilter(mColorFilter);
invalidate();
private Bitmap getBitmapFromDrawable(Drawable drawable) {
if (drawable == null) {
return null;
if (drawable instanceof BitmapDrawable) {
return ((BitmapDrawable) drawable).getBitmap();
if (drawable instanceof ColorDrawable) {
bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG);
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
} catch (OutOfMemoryError e) {
return null;
private void setup() {
if (!mReady) {
mSetupPending = true;
if (mBitmap == null) {
mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
mBitmapPaint.setAntiAlias(true);
mBitmapPaint.setShader(mBitmapShader);
mBorderPaint.setStyle(Paint.Style.STROKE);
mBorderPaint.setAntiAlias(true);
mBorderPaint.setColor(mBorderColor);
mBorderPaint.setStrokeWidth(mBorderWidth);
mBitmapHeight = mBitmap.getHeight();
mBitmapWidth = mBitmap.getWidth();
mBorderRect.set(0, 0, getWidth(), getHeight());
mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2, (mBorderRect.width() - mBorderWidth) / 2);
mDrawableRect.set(mBorderRect);
if (!mBorderOverlay) {
mDrawableRect.inset(mBorderWidth, mBorderWidth);
mDrawableRadius = Math.min(mDrawableRect.height() / 2, mDrawableRect.width() / 2);
updateShaderMatrix();
invalidate();
private void updateShaderMatrix() {
float dx = 0;
float dy = 0;
mShaderMatrix.set(null);
if (mBitmapWidth * mDrawableRect.height() & mDrawableRect.width() * mBitmapHeight) {
scale = mDrawableRect.height() / (float) mBitmapH
dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f;
scale = mDrawableRect.width() / (float) mBitmapW
dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f;
mShaderMatrix.setScale(scale, scale);
mShaderMatrix.postTranslate((int) (dx + 0.5f) + mDrawableRect.left, (int) (dy + 0.5f) + mDrawableRect.top);
mBitmapShader.setLocalMatrix(mShaderMatrix);
布局我就不贴了
最终效果:
感兴趣的朋友可以下载源码:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:158019次
积分:2541
积分:2541
排名:第12510名
原创:92篇
评论:90条
(1)(2)(2)(1)(6)(3)(5)(10)(13)(22)(32)2127人阅读
Android(149)
一、登录界面
本来是只想仿一个qq的聊天界面的,顺便做了一个登录界面,熟悉下SharedPreferences(解释一下:SharedPreferences由于非常适合记录一些零散的简单的数据,因此登录界面的相关信息的记录就是通过它进行记录的)的使用,这里是自己设计的一个登录界面,实现了用户登录账户名和密码的记录。
这里的布局很简单就是一个头像(ImageView)、用户名、密码(EditText)、记住密码(CheckBox)、登录(Button)。
&?xml version="1.0" encoding="utf-8"?&
xmlns:android="/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:background="@drawable/background_logo"
android:orientation="vertical" &
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="50dp"
android:src="@drawable/myheadimg" /&
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:orientation="horizontal" &
android:id="@+id/useraccount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="QQ号/手机号/邮箱" /&
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" &
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="密码"
android:password="true"/&
android:layout_width="match_parent"
android:layout_height="wrap_content" &
android:id="@+id/button_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:background="#0000"
android:padding="20dp"
android:text="登录"
android:textColor="#ffffff"
android:textSize="18sp" /&
android:id="@+id/checkbox_remember"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:background="#0000"
android:padding="20dp"
android:text="记住密码"
android:textColor="#ffffff"
android:textSize="18sp" /&
package com.example.
import java.io.FileInputS
import java.io.InputStreamR
import android.app.A
import android.content.DialogI
import android.content.I
import android.content.SharedP
import android.content.SharedPreferences.E
import android.os.B
import android.os.E
import android.view.KeyE
import android.view.V
import android.view.View.OnClickL
import android.view.W
import android.widget.B
import android.widget.CheckB
import poundB
import poundButton.OnCheckedChangeL
import android.widget.EditT
import android.widget.T
public class Mylogin extends Activity implements OnClickListener,OnCheckedChangeListener{
private EditText medit_
private EditText medit_
private CheckBox mcheckbox_
private Button mbutton_
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.login_layout);
medit_useracount=(EditText) findViewById(R.id.useraccount);
medit_password=(EditText) findViewById(R.id.edittext_words);
mcheckbox_remember=(CheckBox) findViewById(R.id.checkbox_remember);
mbutton_login=(Button) findViewById(R.id.button_login);
mintent=new Intent(getApplicationContext(),MainActivity.class);
mbutton_login.setOnClickListener(this);
readaccount();
public void onClick(View v) {
switch(v.getId()){
case R.id.button_login:{
startActivity(mintent);
Toast.makeText(getApplicationContext(), "登录成功", Toast.LENGTH_SHORT).show();
default:break;
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked){
SharedPreferences sp=getSharedPreferences("info", MODE_PRIVATE);
Editor ed=sp.edit();
ed.putString("name", medit_useracount.getText().toString());
ed.putString("password", medit_password.getText().toString());
ed.commit();
public void readaccount() {
SharedPreferences sp=getSharedPreferences("info", MODE_PRIVATE);
String name=sp.getString("name","");
String password=sp.getString("password", "");
medit_useracount.setText(name);
medit_password.setText(password);
二聊天界面
聊天界面的注意点与小技巧比较多,主要有:
1、对主界面布局时就将GridView(用于弹出表情界面的布局)布局在主界面中,只是先设置其属性为GONE(不可见也不占空间),在点击表情按钮时以popupwindow形式弹出。
2、关于界面的左右显示问题,也是涉及到跟GridView相同的技巧,根据信息是谁传递的设置visibliti为GONE or VISIBLE
3、富文本的转换问题,将EditText的内容转换为CHarSequence类型的方法。medittext_words.getText().subSequence(0, medittext_words.getText().toString().length())转成富文本之后,TextView中是可以显示富文本的,将富文本放置TextView中,显示在界面中即可。
4、在这里我编写了一个可以简化FindViewById的BaseActivity类,其他需要用到FindViewById以后都可以直接继承BaseActivity,用generateFindViewById方法代替FindViewById,但是在这个仿聊天界面的例子中并未起到作用。这里作为优化代码的一种方式展示一下。
5、该例子中还涉及到了全屏的问题,这个问题不再详细介绍,有不会的可以参考我之前博客。
ListView布局
xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical"&
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@color/blue"
android:weightSum="6"
android:id="@+id/button_back"
android:layout_width="30dp"
android:layout_height="30dp"
android:background="@drawable/back"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_gravity="center"
android:layout_weight="5"
android:gravity="center_horizontal"
android:text="我的聊天室"
android:textColor="@color/withe"
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:divider="#0000"
android:transcriptMode="normal"&
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="5"
android:gravity="bottom"
android:id="@+id/leftsend"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="你说"/&
android:id="@+id/biaoqingsend"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_gravity="center_vertical"
android:background="@drawable/hi"/&
android:id="@+id/edittext_words"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="你想说的话语"
android:layout_weight="3"
android:maxLines="2"/&
android:id="@+id/rightsend"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="我说"
android:id="@+id/mygridview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:numColumns="5"
android:layout_weight="1"
android:visibility="gone"
message_layout
&?xml version="1.0" encoding="utf-8"?&
xmlns:android="/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" &
android:id="@+id/left_linear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginTop="5dp" &
android:id="@+id/img_you"
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/yourimg"
android:layout_weight="0"/&
android:id="@+id/textview_left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/yousend"
android:text="你说 "
android:gravity="left"
android:textSize="20sp"
android:layout_marginRight="10dp"
android:layout_gravity="center"
android:layout_weight="1"/&
android:id="@+id/right_linear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:layout_marginRight="5dp"
android:layout_marginTop="5dp" &
android:id="@+id/textview_right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/mysend"
android:text="我说"
android:layout_gravity="center"
android:textSize="20sp"
android:gravity="right"
android:layout_marginLeft="10dp"
android:layout_weight="1"/&
android:id="@+id/img_my"
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/myimg" /&
Message(类)
package com.example.
import android.text.S
public class Message {
public static final int TYPE_YOU=1;
public static final int TYPE_MY=0;
private CharS
private int
public Message(CharSequence words, int type) {
this.words =
this.type =
public CharSequence getWords() {
public void setWords(CharSequence words) {
this.words =
public int getType() {
public void setType(int type) {
this.type =
MessageAdapter
package com.example.mylittlechart
import java.util.List
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
public class MessageAdapter extends BaseAdapter{
private List&Message& mMessage
private LayoutInflater minfInflater
public MessageAdapter(List&Message& mMessage, LayoutInflater minfInflater) {
this.mMessage = mMessage
this.minfInflater = minfInflater
public int getCount() {
return mMessage.size()
public Object getItem(int position) {
return position
public long getItemId(int position) {
return position
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder vh
if(convertView==null){
convertView=minfInflater.inflate(R.layout.message_layout, null)
vh=new ViewHolder()
vh.textview_left=(TextView) convertView.findViewById(R.id.textview_left)
vh.textview_right=(TextView) convertView.findViewById(R.id.textview_right)
vh.img_you=(ImageView) convertView.findViewById(R.id.img_you)
vh.img_my=(ImageView) convertView.findViewById(R.id.img_my)
vh.left_linear=(LinearLayout) convertView.findViewById(R.id.left_linear)
vh.right_linear=(LinearLayout) convertView.findViewById(R.id.right_linear)
convertView.setTag(vh)
vh=(ViewHolder) convertView.getTag()
Message message=mMessage.get(position)
if(message.getType()==Message.TYPE_YOU){
vh.left_linear.setVisibility(View.VISIBLE)
vh.right_linear.setVisibility(View.GONE)
vh.textview_left.setText(message.getWords())
if(message.getType()==Message.TYPE_MY){
vh.left_linear.setVisibility(View.GONE)
vh.right_linear.setVisibility(View.VISIBLE)
vh.textview_right.setText(message.getWords())
return convertView
class ViewHolder{
TextView textview_left
TextView textview_right
ImageView img_you
ImageView img_my
LinearLayout left_linear
LinearLayout right_linear
MainActivity
package com.example.mylittlechart
import java.util.ArrayList
import java.util.List
import android.content.DialogInterface
import android.content.DialogInterface.OnClickListener
import android.content.Intent
import android.graphics.drawable.Drawable
import android.inputmethodservice.Keyboard
import android.os.Bundle
import android.text.Html
import android.text.Spanned
import android.text.Html.ImageGetter
import android.util.Log
import android.view.KeyEvent
import android.view.LayoutInflater
import android.view.Menu
import android.view.View
import android.view.ViewGroup
import android.view.Window
import android.widget.AdapterView
import android.widget.AdapterView.OnItemClickListener
import android.widget.Button
import android.widget.EditText
import android.widget.GridView
import android.widget.ImageButton
import android.widget.ListView
import android.widget.PopupWindow
import android.widget.TextView
public class MainActivity extends BaseAcitivity implements android.view.View.OnClickListener,OnItemClickListener{
private ListView mlistview_content
private Button mbtn_leftsend
private Button mbtn_rightsend
private EditText medittext_words
private Button mbutton_back
private Button mbutton_biaoqing
private List&Message& mMessage=new ArrayList&Message&()
private LayoutInflater minflater
private View mview
private MessageAdapter madapter
private PopupWindow mpopwindow
private ExpressionSend expressionsend
private GridView mgridview
private List&Myexpression& mMyexpressions
private MyexpressionAdapter madaptergrid
private boolean flag
private Spanned span
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
requestWindowFeature(Window.FEATURE_NO_TITLE)
setContentView(R.layout.activity_main)
mlistview_content=generateFindViewById(R.id.listview)
medittext_words=generateFindViewById(R.id.edittext_words)
mbtn_leftsend=generateFindViewById(R.id.leftsend)
mbtn_rightsend=generateFindViewById(R.id.rightsend)
mbutton_back=generateFindViewById(R.id.button_back)
mbutton_biaoqing=generateFindViewById(R.id.biaoqingsend)
mpopwindow=new PopupWindow()
mgridview=(GridView) findViewById(R.id.mygridview)
minflater=getLayoutInflater()
initData()
madaptergrid=new MyexpressionAdapter(mMyexpressions,minflater)
mgridview.setAdapter(madaptergrid)
mgridview.requestFocus()
mbtn_leftsend.setOnClickListener(this)
mbtn_rightsend.setOnClickListener(this)
mbutton_back.setOnClickListener(this)
mbutton_biaoqing.setOnClickListener(this)
mview=minflater.inflate(R.layout.message_layout, null)
madapter=new MessageAdapter(mMessage,minflater)
mlistview_content.setAdapter(madapter)
public void onClick(View v) {
switch(v.getId()){
case R.id.leftsend:{
leftmessage()
case R.id.rightsend:{
rightmessage()
case R.id.biaoqingsend:{
popwindow()
case R.id.button_back:{
MainActivity.this.finish()
default:break
public void leftmessage(){
Message message=new Message(medittext_words.getText().subSequence(0, medittext_words.getText().toString().length()), 1)
mMessage.add(message)
madapter.notifyDataSetChanged()
medittext_words.setText("")
public void rightmessage(){
Message message=new Message(medittext_words.getText().subSequence(0, medittext_words.getText().toString().length()), 0)
mMessage.add(message)
madapter.notifyDataSetChanged()
medittext_words.setText("")
private void popwindow() {
mgridview.setVisibility(View.VISIBLE)
flag=!flag
mgridview.setVisibility(View.GONE)
flag=!flag
mgridview.setOnItemClickListener(this)
LayoutInflater inflater=getLayoutInflater()
View popwindowview=inflater.inflate(R.layout.gridview, null)
mpopwindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT)
mpopwindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT)
mpopwindow.setContentView(popwindowview)
mpopwindow.setFocusable(false)
mpopwindow.setOutsideTouchable(true)
mpopwindow.showAsDropDown(mbutton_back)
public void onItemClick(AdapterView&?& parent, View view, int position,
long id) {
final int imggetterid=mMyexpressions.get(position).getImg_biaoqing()
ImageGetter imggetter=new ImageGetter() {
public Drawable getDrawable(String source) {
Drawable drawable=getResources().getDrawable(imggetterid)
drawable.setBounds(0,0,40,40)
return drawable
span=Html.fromHtml("&img src=''/&",imggetter,null)
medittext_words.append(span)
private void initData() {
mMyexpressions=new ArrayList&Myexpression&()
Myexpression myexpression0=new Myexpression(R.drawable.dianwo)
mMyexpressions.add(myexpression0)
Myexpression myexpression1=new Myexpression(R.drawable.a)
mMyexpressions.add(myexpression1)
Myexpression myexpression2=new Myexpression(R.drawable.apple)
mMyexpressions.add(myexpression2)
Myexpression myexpression3=new Myexpression(R.drawable.xihan)
mMyexpressions.add(myexpression3)
Myexpression myexpression4=new Myexpression(R.drawable.xihuan)
mMyexpressions.add(myexpression4)
Myexpression myexpression5=new Myexpression(R.drawable.liuhan)
mMyexpressions.add(myexpression5)
Myexpression myexpression6=new Myexpression(R.drawable.kelian)
mMyexpressions.add(myexpression6)
Myexpression myexpression7=new Myexpression(R.drawable.heng)
mMyexpressions.add(myexpression7)
Myexpression myexpression8=new Myexpression(R.drawable.ganga)
mMyexpressions.add(myexpression8)
Myexpression myexpression9=new Myexpression(R.drawable.kaixin)
mMyexpressions.add(myexpression9)
键盘界面的弹出设置
在我们的程序不进行设置时,当我们已进入聊天界面,软键盘将会自动弹出,下面是一种解决方法。
1、在Mainnifest中的Activity添加
android:windowSoftInputMode="adjustResize|stateHidden"
2、在ListView中添加
android:transcriptMode="normal"
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:141886次
积分:3779
积分:3779
排名:第7284名
原创:217篇
评论:169条
阅读:11188
阅读:9529
文章:12篇
阅读:7747
文章:30篇
阅读:18555
文章:17篇
阅读:17692
(1)(7)(4)(4)(12)(10)(11)(3)(9)(10)(1)(7)(5)(6)(5)(16)(60)(53)(2)

我要回帖

更多关于 QQ聊天界面 的文章

 

随机推荐