Fragment實踐之聊天窗口
前幾天剛學了android的fragment,總是停留在簡單的demo,或許永遠都學不會。
今天,我要動手向我的聊天軟件開刀。今天,用Fragment來實現一個如下圖效果的聊天界麵。

從圖中可以看出,這個activity是由三部分組成:1)抬頭,包含一個返回按鈕,對話用戶的名字和一個對話好友的信息按鈕;2)一個聊天的曆史記錄;3)底部是輸入,包含更多豐富的輸入按鈕,文本輸入以及發送按鈕。
第一步:定義好資源文件
資源文件主要是布局文件,布局文件所用到的其他資源我們在此就不再做介紹了
new_chat_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:andro
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
</LinearLayout>
<LinearLayout
android:
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:background="@color/white3"
android:orientation="horizontal">
</LinearLayout>
<LinearLayout
android:
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
</LinearLayout>
<LinearLayout
android:
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
</LinearLayout>
</LinearLayout>其效果圖如下:空白的

接下來,我們創建抬頭的fagment的layout文件
frag_chat_title_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:andro
android:layout_width="match_parent"
android:layout_height="60dip"
android:background="@drawable/skinpic_blue"
android:gravity="center_vertical" >
<ImageButton
android:
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/title_btn_l_selector"
android:padding="0.0dip"
android:src="@drawable/title_btn_back" />
<TextView
android:
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:ellipsize="end"
android:gravity="center"
android:singleLine="true"
android:textColor="#ffffffff"
android:textSize="18.0sp"
android:text="張三"
android:textStyle="bold" />
<ImageButton
android:
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/title_btn_r_selector"
android:padding="0.0dip"
android:src="@drawable/popbar_icon_info" />
</LinearLayout>
其效果如下:

接下來我們定義聊天記錄的布局文件
frag_history_list_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:andro
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:background="@color/white3"
android:orientation="vertical" >
<ListView
android:
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:background="@color/white3"
android:divider="@null"
android:listSelector="@android:color/transparent"
/>
</LinearLayout>其效果如圖:

定義底部的輸入布局
frag_chat_bottom_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:andro
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#FFEEEEEE" >
<Button
android:
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginLeft="5dip"
android:background="@drawable/plus_btn"
android:text=" " />
<EditText
android:
android:textColor="#000000"
android:layout_width="wrap_content"
android:layout_height="45dip"
android:background="@anim/edit_text"
android:layout_weight="1.0"
android:hint="請輸入內容"
android:inputType="textWebEditText"
android:text="" />
<Button
android:
android:layout_marginLeft="5dip"
android:background="@drawable/button"
android:layout_width="wrap_content"
android:layout_height="45dip"
android:text=" 發送 " />
</LinearLayout>
其效果如圖所示

至此,我們的布局文件算是完成了。接下來,我們需要定義三個Fragment來關聯這三個碎片布局
1,抬頭
FragChatTitle.java
package com.sanliao.eim.activity.im;
import com.sanliao.eim.R;
import com.sanliao.eim.manager.ContacterManager;
import com.sanliao.eim.manager.XmppConnectionManager;
import com.sanliao.eim.model.User;
import com.sanliao.eim.util.StringUtil;
import android.app.Activity;
import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
public class FragChatTitle extends Fragment {
private final static String TAG="FragChatTitle";
NewChatActivity activity=null;
private ImageView titleBack;//返回按鈕
private TextView tvChatTitle;//對話用戶名
private ImageButton userInfo;//用戶信息按鈕
private User user;// 聊天人
private String to_name;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.d(TAG, "onCreateView");
return inflater.inflate(R.layout.frag_chat_title_layout, container, false);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
Log.d(TAG, "onAttach");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.d(TAG, "onActivityCreated");
activity=(NewChatActivity)getActivity();//獲得所在activity,並轉為newchatactivity
//返回按鈕
titleBack = (ImageView) getActivity().findViewById(R.id.title_back);
titleBack.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
getActivity().finish();
}
});
tvChatTitle = (TextView) getActivity().findViewById(R.id.to_chat_name);
user = ContacterManager.getByUserJid(activity.getTo(), XmppConnectionManager
.getInstance().getConnection());
if (null == user) {
to_name = StringUtil.getUserNameByJid(activity.getTo());
} else {
to_name = user.getName() == null ? user.getJID() : user.getName();
}
tvChatTitle.setText(to_name);//將用戶名設置到title
//用戶信息
userInfo = (ImageButton)activity. findViewById(R.id.user_info);
userInfo.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(activity, FriendInfoActivity.class);
startActivity(intent);
}
});
}
@Override
public void onStart() {
super.onStart();
Log.d(TAG, "onStart");
}
@Override
public void onResume() {
super.onResume();
Log.d(TAG, "onResume");
}
@Override
public void onPause() {
super.onPause();
Log.d(TAG, "onPause");
}
@Override
public void onStop() {
super.onStop();
Log.d(TAG, "onStop");
}
@Override
public void onDestroyView() {
super.onDestroyView();
Log.d(TAG, "onDestroyView");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
}
@Override
public void onDetach() {
super.onDetach();
Log.d(TAG, "onDetach");
}
}
定義聊天記錄的Fragment
FragChatHistory.java
package com.sanliao.eim.activity.im;
import java.util.List;
import com.sanliao.eim.R;
import com.sanliao.eim.manager.MessageManager;
import com.sanliao.eim.model.IMMessage;
import com.sanliao.eim.model.User;
import com.sanliao.eim.util.StringUtil;
import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
public class FragChatHistory extends Fragment {
private final static String TAG="FragChatHistory";
private MessageListAdapter adapter = null;
private ListView listView;
private int recordCount;
private View listHead;
private Button listHeadButton;
private User user;// 聊天人
private NewChatActivity activity=null;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.d(TAG, "onCreateView");
return inflater.inflate(R.layout.frag_history_list_layout, container, false);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
Log.d(TAG, "onAttach");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.d(TAG, "onActivityCreated");
activity=(NewChatActivity) getActivity();
listView = (ListView) activity.findViewById(R.id.chat_list);
listView.setCacheColorHint(0);
adapter = new MessageListAdapter(activity, activity.getMessages(),
listView);
// 頭
LayoutInflater mynflater = LayoutInflater.from(activity);
listHead = mynflater.inflate(R.layout.chatlistheader, null);
listHeadButton = (Button) listHead.findViewById(R.id.buttonChatHistory);
listHeadButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent in = new Intent(activity, ChatHistoryActivity.class);
in.putExtra("to", activity.getTo());
startActivity(in);
}
});
listView.addHeaderView(listHead);
listView.setAdapter(adapter);
}
@Override
public void onStart() {
super.onStart();
Log.d(TAG, "onStart");
}
@Override
public void onResume() {
super.onResume();
Log.d(TAG, "onResume");
recordCount = MessageManager.getInstance((NewChatActivity)getActivity())
.getChatCountWithSb(((NewChatActivity)getActivity()).getTo());
if (recordCount <= 0) {
listHead.setVisibility(View.GONE);
} else {
listHead.setVisibility(View.VISIBLE);
}
adapter.refreshList(((NewChatActivity)getActivity()).getMessages());
}
@Override
public void onPause() {
super.onPause();
Log.d(TAG, "onPause");
}
@Override
public void onStop() {
super.onStop();
Log.d(TAG, "onStop");
}
@Override
public void onDestroyView() {
super.onDestroyView();
Log.d(TAG, "onDestroyView");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
}
@Override
public void onDetach() {
super.onDetach();
Log.d(TAG, "onDetach");
}
public MessageListAdapter getAdapter()
{
return adapter ;
}
//////////////////////////////////////////////////////////////////
public class MessageListAdapter extends BaseAdapter {
private List<IMMessage> items;
private Context context;
private ListView adapterList;
private LayoutInflater inflater;
public MessageListAdapter(Context context, List<IMMessage> items,
ListView adapterList) {
this.context = context;
this.items = items;
this.adapterList = adapterList;
}
public void refreshList(List<IMMessage> items) {
this.items = items;
this.notifyDataSetChanged();
adapterList.setSelection(items.size() - 1);
}
@Override
public int getCount() {
return items == null ? 0 : items.size();
}
@Override
public Object getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
IMMessage message = items.get(position);
if (message.getMsgType() == 0) {
convertView = this.inflater.inflate(
R.layout.formclient_chat_in, null);
} else {
convertView = this.inflater.inflate(
R.layout.formclient_chat_out, null);
}
TextView useridView = (TextView) convertView
.findViewById(R.id.formclient_row_userid);
TextView dateView = (TextView) convertView
.findViewById(R.id.formclient_row_date);
TextView msgView = (TextView) convertView
.findViewById(R.id.formclient_row_msg);
if (message.getMsgType() == 0) {
if (null == user) {
useridView.setText(StringUtil.getUserNameByJid(((NewChatActivity)getActivity()).to));
} else {
useridView.setText(user.getName());
}
} else {
useridView.setText("我");
}
dateView.setText(message.getTime());
msgView.setText(message.getContent());
return convertView;
}
}
}
定義底部Fragment
FragChatBottom.java
package com.sanliao.eim.activity.im;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.sanliao.eim.R;
public class FragChatBottom extends Fragment {
private final static String TAG="FragChatBottom";
private EditText messageInput = null;
private Button messageSendBtn = null;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.d(TAG, "onCreateView");
return inflater.inflate(R.layout.frag_chat_bottom_layout, container, false);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
Log.d(TAG, "onAttach");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.d(TAG, "onActivityCreated");
messageInput = (EditText) getActivity().findViewById(R.id.chat_content);
messageSendBtn = (Button) getActivity().findViewById(R.id.chat_sendbtn);
messageSendBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String message = messageInput.getText().toString();
if ("".equals(message)) {
Toast.makeText(getActivity(), "不能為空",
Toast.LENGTH_SHORT).show();
} else {
try {
((NewChatActivity)getActivity()).sendMessage(message);
messageInput.setText("");
} catch (Exception e) {
((NewChatActivity)getActivity()).showToast("信息發送失敗");
messageInput.setText(message);
}
((NewChatActivity)getActivity()).closeInput();
}
}
});
}
@Override
public void onStart() {
super.onStart();
Log.d(TAG, "onStart");
}
@Override
public void onResume() {
super.onResume();
Log.d(TAG, "onResume");
}
@Override
public void onPause() {
super.onPause();
Log.d(TAG, "onPause");
}
@Override
public void onStop() {
super.onStop();
Log.d(TAG, "onStop");
}
@Override
public void onDestroyView() {
super.onDestroyView();
Log.d(TAG, "onDestroyView");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
}
@Override
public void onDetach() {
super.onDetach();
Log.d(TAG, "onDetach");
}
}
最後,我們需要在NewChatActivity中將這三個Fragment組裝起來。
NewChat.java
package com.sanliao.eim.activity.im;
import java.util.List;
import org.jivesoftware.smackx.InitStaticCode;
import com.sanliao.eim.R;
import com.sanliao.eim.model.IMMessage;
import android.app.Activity;
import android.os.Bundle;
public class NewChatActivity extends AChatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.new_chat_layout);
init();
}
public void init()
{
FragChatTitle fragChatTitle = new FragChatTitle();
getFragmentManager().beginTransaction().replace(R.id.chat_title_layout,fragChatTitle).commit();
FragChatHistory fragChatHistory=new FragChatHistory();
getFragmentManager().beginTransaction().replace(R.id.chat_history_layout,fragChatHistory).commit();
FragChatBottom fragChatBottom=new FragChatBottom();
getFragmentManager().beginTransaction().replace(R.id.chat_bottom_layout,fragChatBottom).commit();
}
@Override
protected void receiveNewMessage(IMMessage message) {
// TODO Auto-generated method stub
}
@Override
protected void refreshMessage(List<IMMessage> messages) {
// TODO Auto-generated method stub
FragChatHistory fragment = (FragChatHistory ) getFragmentManager().findFragmentById(R.id.chat_history_layout);
fragment.getAdapter().refreshList(messages);
}
}
https://blog.csdn.net/minimicall/article/details/38680087

好,跑起來。就會得到如圖1所示的效果。好,打完收工。
最後更新:2017-04-03 05:40:02
上一篇:
IDEA跑Tomcat異常
下一篇:
[Hibernate開發之路](4)ID生成策略
Storm源碼淺析之topology的提交
VxWorks下USB驅動總結2
MySQL · 實現分析 · HybridDB for MySQL 數據壓縮
Java中接口定義成員變量
JavaScript 對象總結
《可穿戴創意設計:技術與時尚的融合》一一1.5 眼鏡類可穿戴設備
Java IO--回退流PushbackInputStream
新鮮出爐關於2017年Java就業前景分析
存儲那些事兒(三):OpenStack的塊存儲Cinder與商業存儲的融合
2011????????????????????????????????????????????????Java????????????-??????-????????????-?????????