凌晨发帖不容易啊, 有一个问题,谁做过android的自定义表情啊?貌似还没有发现有客户端有,都是图片,如果能像在电脑上那样自定义表情的功能多好,那位大哥知道,麻烦告知一声,呵呵。写完,睡觉。

我们仔细来观察下腾讯微博的qq表情发送规律,由/开始,1到3个中文或者英文字符.

写个工具类来测试已测试正则表达式来匹配表情。



在上方输入框中可以输入查询 格式为 @你选择的列表值

这个是话题输入界面,格式为#话题#

表情选择页面,这个其实是一个每行5列的GridView


此界面可看到你写的微博的内容,点击发送,发送成功

哈哈,看到了吧,我的微博首页已经显示了我刚才发送的带有话题@person和表情的微博了。

接下来,上代码。
Java代码
  1. publicclassAddWeiboActivityextendsActivityimplementsOnClickListener{
  2. privateDataHelperdataHelper;
  3. privateUserInfouser;
  4. privateStringuser_default_name;
  5. privateMyWeiboSyncweibo;
  6. privateListViewlistView;
  7. privateEditTextweibo_content;
  8. privateButtonsend_btn;
  9. privateButtonadd_cmamera_btn;
  10. privateButtonadd_at_btn;
  11. privateButtonadd_topic_btn;
  12. privateButtonadd_expression_btn;
  13. privateButtonadd_location_btn;
  14. privateGridViewexpressionGrid;
  15. privateList<Map<String,Object>>expressionList;
  16. privateExpressionAdapterexpressionAdapter;
  17. privateFrameLayoutoperation_layout;
  18. privateRelativeLayoutadd_top_bar;
  19. privateListViewatListView;
  20. privateRelativeLayoutatRootLayout;
  21. privateEditTextatEditText;
  22. privateButtonatEnterBtn;
  23. privateTextViewtopic_tip;
  24. privateRelativeLayout.LayoutParamsatEdiLayoutParams,atEnterBtnLayoutParams,atListViewLayoutParams,topicTipViewLayoutParams;
  25. privateJSONArrayarray;
  26. privateHandlerhandler;
  27. privateArrayAdapteratAdapter;
  28. privateList<String>atList;
  29. privateAtThreadthread;
  30. privateList<String>matchStrList;//选择atList匹配的字符串
  31. privateintflag;
  32. privatestaticintFLAG_1=1;
  33. privatestaticintFLAG_2=2;//1和2代表atEnterBtn的父亲控件不同
  34. @Override
  35. protectedvoidonCreate(BundlesavedInstanceState){
  36. super.onCreate(savedInstanceState);
  37. setContentView(R.layout.add_weibo);
  38. setUpViews();
  39. setUpListeners();
  40. dataHelper=DataBaseContext.getInstance(getApplicationContext());
  41. weibo=WeiboContext.getInstance();
  42. SharedPreferencespreferences=getSharedPreferences("default_user",Activity.MODE_PRIVATE);
  43. user_default_name=preferences.getString("user_default_name","");//取得微博默认登录账号信息
  44. handler=newAtHandler();
  45. thread=newAtThread();
  46. thread.start();//开启一个线程获取数据
  47. }
  48. privatevoidsetUpViews(){
  49. weibo_content=(EditText)findViewById(R.id.weibo_content);
  50. send_btn=(Button)findViewById(R.id.send_btn);
  51. add_cmamera_btn=(Button)findViewById(R.id.add_cmamera_btn);
  52. add_at_btn=(Button)findViewById(R.id.add_at_btn);
  53. add_topic_btn=(Button)findViewById(R.id.add_topic_btn);
  54. add_expression_btn=(Button)findViewById(R.id.add_expression_btn);
  55. add_location_btn=(Button)findViewById(R.id.add_location_btn);
  56. add_top_bar=(RelativeLayout)findViewById(R.id.add_top_bar);
  57. operation_layout=(FrameLayout)findViewById(R.id.operation_layout);
  58. expressionGrid=newGridView(this);
  59. expressionGrid.setNumColumns(5);
  60. expressionList=buildExpressionsList();
  61. expressionAdapter=newExpressionAdapter(AddWeiboActivity.this,expressionList);
  62. expressionGrid.setAdapter(expressionAdapter);
  63. //以下代码至本方法setUpViews结束,是个人纯粹蛋疼联系纯代码布局,各位老大可以改成xml布局,淡定
  64. atRootLayout=newRelativeLayout(AddWeiboActivity.this);
  65. atEditText=newEditText(AddWeiboActivity.this);
  66. atEditText.setId(10000);
  67. atEnterBtn=newButton(AddWeiboActivity.this);
  68. atEnterBtn.setBackgroundDrawable(getResources().getDrawable(R.drawable.btn_enter_selector));
  69. atListView=newListView(AddWeiboActivity.this);
  70. atListView.setCacheColorHint(Color.TRANSPARENT);//防止滑屏时出现黑快,不信可以注释掉此句试一试
  71. atListView.setDivider(getResources().getDrawable(R.drawable.list_divider));//设置分割线
  72. atListView.setBackgroundColor(Color.argb(255,239,239,239));//alpha通道一定不要设置成透明的了,要不然textView什么也看不见,因为这个我找了很久,以为代码错了,最后才发现是透明的
  73. topic_tip=newTextView(AddWeiboActivity.this);
  74. topic_tip.setText("请输入话题");
  75. topic_tip.setTextSize(20);
  76. topic_tip.setTextColor(Color.argb(255,90,142,189));//alpha通道一定不要设置成透明的了,要不然textView什么也看不见,因为这个我找了很久,以为代码错了,最后才发现是透明的
  77. atRootLayout.setLayoutParams(newLayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));
  78. atEdiLayoutParams=newRelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,80);
  79. atEnterBtnLayoutParams=newRelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
  80. atListViewLayoutParams=newRelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
  81. topicTipViewLayoutParams=newRelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
  82. //添加布局约束
  83. atEdiLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
  84. atEnterBtnLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP,RelativeLayout.TRUE);
  85. atEnterBtnLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,RelativeLayout.TRUE);
  86. atEnterBtnLayoutParams.setMargins(0,10,10,0);//设置边距,分别代表左,上,右,下
  87. atListViewLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM,RelativeLayout.TRUE);
  88. atListViewLayoutParams.addRule(RelativeLayout.BELOW,atEditText.getId());
  89. topicTipViewLayoutParams.addRule(RelativeLayout.BELOW,atEditText.getId());
  90. }
  91. privatevoidsetUpListeners(){
  92. send_btn.setOnClickListener(this);
  93. add_cmamera_btn.setOnClickListener(this);
  94. add_at_btn.setOnClickListener(this);
  95. add_topic_btn.setOnClickListener(this);
  96. add_expression_btn.setOnClickListener(this);
  97. add_location_btn.setOnClickListener(this);
  98. expressionGrid.setOnItemClickListener(newGridItemClickListener());
  99. atListView.setOnItemClickListener(newAtListViewItemListener());
  100. atEditText.addTextChangedListener(newMyTextWatcher());
  101. atEnterBtn.setOnClickListener(newOnClickListener(){
  102. @Override
  103. publicvoidonClick(Viewv){
  104. add_top_bar.setVisibility(View.VISIBLE);
  105. weibo_content.setVisibility(View.VISIBLE);
  106. operation_layout.setVisibility(View.GONE);
  107. operation_layout.removeAllViews();//别忘记要移除掉
  108. if(flag==FLAG_1){
  109. weibo_content.setText(weibo_content.getText()+"@");
  110. }elseif(flag==FLAG_2){
  111. weibo_content.setText(weibo_content.getText()+"#"+atEditText.getText()+"#");
  112. }
  113. }
  114. });
  115. }
  116. classAtThreadextendsThread{
  117. @Override
  118. publicvoidrun(){
  119. StringjsonStr=weibo.getFans(weibo.getAccessTokenKey(),weibo.getAccessTokenSecrect(),20,0,user_default_name);
  120. try{
  121. JSONObjectdataObj=newJSONObject(jsonStr).getJSONObject("data");
  122. array=dataObj.getJSONArray("info");
  123. }catch(JSONExceptione){
  124. e.printStackTrace();
  125. }
  126. //通知handler处理数据
  127. Messagemsg=handler.obtainMessage();
  128. handler.sendMessage(msg);
  129. }
  130. }
  131. classAtHandlerextendsHandler{
  132. @Override
  133. publicvoidhandleMessage(Messagemsg){
  134. intsize=array.length();
  135. atList=newArrayList<String>();
  136. for(inti=0;i<size;i++){
  137. JSONObjectdata=array.optJSONObject(i);
  138. try{
  139. atList.add(data.getString("nick")+"("+data.getString("name")+")");
  140. }catch(JSONExceptione){
  141. e.printStackTrace();
  142. }
  143. }
  144. matchStrList=newArrayList<String>();
  145. matchStrList.addAll(atList);
  146. atAdapter=newArrayAdapter<String>(AddWeiboActivity.this,R.layout.at_list_item,R.id.at_nick_name,atList);
  147. atListView.setAdapter(atAdapter);
  148. }
  149. }
  150. classExpressionAdapterextendsBaseAdapter{
  151. privateContextcontext;
  152. privateLayoutInflaterinflater;
  153. privateList<Map<String,Object>>list;
  154. publicExpressionAdapter(Contextcontext,List<Map<String,Object>>list){
  155. super();
  156. this.context=context;
  157. this.list=list;
  158. this.inflater=LayoutInflater.from(context);
  159. }
  160. @Override
  161. publicintgetCount(){
  162. returnlist.size();
  163. }
  164. @Override
  165. publicObjectgetItem(intposition){
  166. returnlist.get(position);
  167. }
  168. @Override
  169. publiclonggetItemId(intposition){
  170. returnposition;
  171. }
  172. @Override
  173. publicViewgetView(finalintposition,ViewconvertView,ViewGroupparent){
  174. Map<String,Object>map=list.get(position);
  175. ImageViewimage=newImageView(context);
  176. image.setImageDrawable((Drawable)map.get("drawable"));
  177. returnimage;
  178. }
  179. }
  180. @Override
  181. publicvoidonClick(Viewv){
  182. if(operation_layout.getChildCount()>0){
  183. add_top_bar.setVisibility(View.VISIBLE);
  184. weibo_content.setVisibility(View.VISIBLE);
  185. operation_layout.setVisibility(View.GONE);
  186. operation_layout.removeAllViews();//别忘记要移除掉
  187. return;
  188. }
  189. switch(v.getId()){
  190. caseR.id.send_btn:{
  191. StringreturnStr=weibo.publishMsg(weibo.getAccessTokenKey(),weibo.getAccessTokenSecrect(),weibo_content.getText().toString());
  192. try{
  193. JSONObjectdataObj=newJSONObject(returnStr);
  194. if("ok".equals(dataObj.getString("msg"))){
  195. Toast.makeText(AddWeiboActivity.this,"发送成功",Toast.LENGTH_SHORT).show();//我日,记得要show,每次都搞忘记
  196. }
  197. }catch(JSONExceptione){
  198. e.printStackTrace();
  199. }
  200. }
  201. break;
  202. caseR.id.add_cmamera_btn:{
  203. }
  204. break;
  205. caseR.id.add_at_btn:{
  206. //动态的组装view
  207. atRootLayout.removeAllViews();//组装前先把所有的孩子拿掉
  208. atEditText.setText("@");
  209. flag=FLAG_1;//区分atEnterBtn是在哪个界面按的
  210. atRootLayout.addView(atEditText,atEdiLayoutParams);
  211. atRootLayout.addView(atEnterBtn,atEnterBtnLayoutParams);
  212. atRootLayout.addView(atListView,atListViewLayoutParams);
  213. operation_layout.addView(atRootLayout);
  214. add_top_bar.setVisibility(View.GONE);//隐藏上面的bar和文本编辑框,不让之与at选择相互影响
  215. weibo_content.setVisibility(View.GONE);
  216. operation_layout.setVisibility(View.VISIBLE);
  217. }
  218. break;
  219. caseR.id.add_topic_btn:{
  220. //动态的组装view
  221. atRootLayout.removeAllViews();//组装前先把所有的孩子拿掉
  222. atEditText.setText("");
  223. flag=FLAG_2;//区分atEnterBtn是在哪个界面按的
  224. atRootLayout.addView(atEditText,atEdiLayoutParams);
  225. atRootLayout.addView(atEnterBtn,atEnterBtnLayoutParams);
  226. atRootLayout.addView(topic_tip,topicTipViewLayoutParams);
  227. operation_layout.addView(atRootLayout);
  228. add_top_bar.setVisibility(View.GONE);//隐藏上面的bar和文本编辑框,不让之与at选择相互影响
  229. weibo_content.setVisibility(View.GONE);
  230. operation_layout.setVisibility(View.VISIBLE);
  231. }
  232. break;
  233. caseR.id.add_expression_btn:{
  234. add_top_bar.setVisibility(View.GONE);//隐藏上面的bar和文本编辑框,不让之与表情选择的gridView相互影响
  235. weibo_content.setVisibility(View.GONE);
  236. operation_layout.addView(expressionGrid);
  237. operation_layout.setVisibility(View.VISIBLE);
  238. }
  239. break;
  240. caseR.id.add_location_btn:{
  241. }
  242. break;
  243. default:
  244. break;
  245. }
  246. }
  247. privateList<Map<String,Object>>buildExpressionsList(){
  248. List<Map<String,Object>>list=newArrayList<Map<String,Object>>();
  249. DecimalFormatdf=newDecimalFormat("000");//格式化数字
  250. for(inti=0;i<105;i++){
  251. Map<String,Object>map=newHashMap<String,Object>();
  252. StringformatStr="h"+df.format(i);
  253. intdrawableId=0;
  254. try{
  255. drawableId=R.drawable.class.getDeclaredField(formatStr).getInt(this);//反射取得id,这个地方循环套反射,是不是很耗性能啊,我没测试过,麻烦有好办法的兄弟姐妹分享一下
  256. }catch(IllegalArgumentExceptione){
  257. e.printStackTrace();
  258. }catch(SecurityExceptione){
  259. e.printStackTrace();
  260. }catch(IllegalAccessExceptione){
  261. e.printStackTrace();
  262. }catch(NoSuchFieldExceptione){
  263. e.printStackTrace();
  264. }
  265. Drawabledrawable=getResources().getDrawable(drawableId);
  266. map.put("drawableId",formatStr);
  267. map.put("drawable",drawable);
  268. list.add(map);
  269. }
  270. returnlist;
  271. }
  272. classGridItemClickListenerimplementsOnItemClickListener{
  273. @Override
  274. publicvoidonItemClick(AdapterView<?>adapterView,Viewview,intposition,longarg3){
  275. Map<String,Object>map=expressionList.get(position);
  276. StringdrawableId=(String)map.get("drawableId");
  277. add_top_bar.setVisibility(View.VISIBLE);
  278. weibo_content.setVisibility(View.VISIBLE);
  279. operation_layout.setVisibility(View.GONE);
  280. operation_layout.removeAllViews();//别忘记要移除掉
  281. StringexpressionStr=null;
  282. expressionStr=TextUtil.drawableIdToFaceName.get(drawableId);
  283. expressionStr="/"+expressionStr;
  284. weibo_content.setText(weibo_content.getText().toString()+expressionStr);
  285. }
  286. }
  287. classMyTextWatcherimplementsTextWatcher{
  288. @Override
  289. publicvoidafterTextChanged(Editables){
  290. StringchangingStr=atEditText.getText().toString();
  291. if(changingStr.indexOf("@")!=-1){
  292. changingStr=changingStr.substring(1);
  293. }
  294. intsize=atList.size();
  295. matchStrList.clear();
  296. for(inti=0;i<size;i++){
  297. StringcurrentStr=atList.get(i);
  298. if(currentStr.indexOf(changingStr)!=-1){
  299. matchStrList.add(currentStr);
  300. }
  301. }
  302. atAdapter=newArrayAdapter<String>(AddWeiboActivity.this,R.layout.at_list_item,R.id.at_nick_name,matchStrList);
  303. atAdapter.notifyDataSetChanged();
  304. atListView.setAdapter(atAdapter);
  305. }
  306. @Override
  307. publicvoidbeforeTextChanged(CharSequences,intstart,intcount,
  308. intafter){
  309. }
  310. @Override
  311. publicvoidonTextChanged(CharSequences,intstart,intbefore,intcount){
  312. }
  313. }
  314. classAtListViewItemListenerimplementsOnItemClickListener{
  315. @Override
  316. publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intposition,longarg3){
  317. add_top_bar.setVisibility(View.VISIBLE);
  318. weibo_content.setVisibility(View.VISIBLE);
  319. operation_layout.setVisibility(View.GONE);
  320. operation_layout.removeAllViews();//别忘记要移除掉
  321. Stringstr=matchStrList.get(position);
  322. StringnickStr=str.substring(0,str.indexOf("("));
  323. weibo_content.setText(weibo_content.getText()+"@"+nickStr);
  324. }
  325. }
  326. }
public class AddWeiboActivity extends Activity implements OnClickListener{private DataHelper dataHelper;private UserInfo user;private String user_default_name;private MyWeiboSync weibo;private ListView listView;private EditText weibo_content;private Button send_btn;private Button add_cmamera_btn;private Button add_at_btn;private Button add_topic_btn;private Button add_expression_btn;private Button add_location_btn;private GridView expressionGrid;private List<Map<String,Object>> expressionList;private ExpressionAdapter expressionAdapter;private FrameLayout operation_layout;private RelativeLayout add_top_bar;private ListView atListView;private RelativeLayout atRootLayout;private EditText atEditText;private Button atEnterBtn;private TextView topic_tip;private RelativeLayout.LayoutParams atEdiLayoutParams,atEnterBtnLayoutParams,atListViewLayoutParams,topicTipViewLayoutParams;private JSONArray array;private Handler handler;private ArrayAdapter atAdapter;private List<String> atList;private AtThread thread;private List<String> matchStrList;//选择atList匹配的字符串private int flag;private static int FLAG_1 = 1;private static int FLAG_2 = 2;//1和2代表atEnterBtn的父亲控件不同@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.add_weibo);setUpViews();setUpListeners();dataHelper = DataBaseContext.getInstance(getApplicationContext());weibo = WeiboContext.getInstance();SharedPreferences preferences = getSharedPreferences("default_user",Activity.MODE_PRIVATE);user_default_name = preferences.getString("user_default_name", "");//取得微博默认登录账号信息handler = new AtHandler();thread = new AtThread();thread.start();//开启一个线程获取数据}private void setUpViews(){weibo_content = (EditText)findViewById(R.id.weibo_content);send_btn = (Button)findViewById(R.id.send_btn);add_cmamera_btn = (Button)findViewById(R.id.add_cmamera_btn);add_at_btn = (Button)findViewById(R.id.add_at_btn);add_topic_btn = (Button)findViewById(R.id.add_topic_btn);add_expression_btn = (Button)findViewById(R.id.add_expression_btn);add_location_btn = (Button)findViewById(R.id.add_location_btn);add_top_bar = (RelativeLayout)findViewById(R.id.add_top_bar);operation_layout = (FrameLayout)findViewById(R.id.operation_layout);expressionGrid = new GridView(this);expressionGrid.setNumColumns(5);expressionList = buildExpressionsList();expressionAdapter = new ExpressionAdapter(AddWeiboActivity.this, expressionList);expressionGrid.setAdapter(expressionAdapter);//以下代码至本方法setUpViews结束,是个人纯粹蛋疼联系纯代码布局,各位老大可以改成xml布局,淡定atRootLayout = new RelativeLayout(AddWeiboActivity.this);atEditText = new EditText(AddWeiboActivity.this);atEditText.setId(10000);atEnterBtn = new Button(AddWeiboActivity.this);atEnterBtn.setBackgroundDrawable(getResources().getDrawable(R.drawable.btn_enter_selector));atListView = new ListView(AddWeiboActivity.this);atListView.setCacheColorHint(Color.TRANSPARENT);//防止滑屏时出现黑快,不信可以注释掉此句试一试atListView.setDivider(getResources().getDrawable(R.drawable.list_divider));//设置分割线atListView.setBackgroundColor(Color.argb(255, 239, 239, 239));//alpha通道一定不要设置成透明的了,要不然textView什么也看不见,因为这个我找了很久,以为代码错了,最后才发现是透明的topic_tip = new TextView(AddWeiboActivity.this);topic_tip.setText("请输入话题");topic_tip.setTextSize(20);topic_tip.setTextColor(Color.argb(255, 90, 142, 189));//alpha通道一定不要设置成透明的了,要不然textView什么也看不见,因为这个我找了很久,以为代码错了,最后才发现是透明的atRootLayout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));atEdiLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,80);atEnterBtnLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);atListViewLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);topicTipViewLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);//添加布局约束atEdiLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);atEnterBtnLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP,RelativeLayout.TRUE);atEnterBtnLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,RelativeLayout.TRUE);atEnterBtnLayoutParams.setMargins(0, 10, 10, 0);//设置边距,分别代表左,上,右,下atListViewLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM,RelativeLayout.TRUE);atListViewLayoutParams.addRule(RelativeLayout.BELOW, atEditText.getId());topicTipViewLayoutParams.addRule(RelativeLayout.BELOW, atEditText.getId());}private void setUpListeners(){send_btn.setOnClickListener(this);add_cmamera_btn.setOnClickListener(this);add_at_btn.setOnClickListener(this);add_topic_btn.setOnClickListener(this);add_expression_btn.setOnClickListener(this);add_location_btn.setOnClickListener(this);expressionGrid.setOnItemClickListener(new GridItemClickListener());atListView.setOnItemClickListener(new AtListViewItemListener());atEditText.addTextChangedListener(new MyTextWatcher());atEnterBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {add_top_bar.setVisibility(View.VISIBLE);weibo_content.setVisibility(View.VISIBLE);operation_layout.setVisibility(View.GONE);operation_layout.removeAllViews();//别忘记要移除掉if(flag==FLAG_1){weibo_content.setText(weibo_content.getText()+"@");}else if(flag==FLAG_2){weibo_content.setText(weibo_content.getText()+"#"+atEditText.getText()+"#");}}});}class AtThread extends Thread {@Overridepublic void run() {String jsonStr = weibo.getFans(weibo.getAccessTokenKey(), weibo.getAccessTokenSecrect(), 20, 0, user_default_name);try {JSONObject dataObj = new JSONObject(jsonStr).getJSONObject("data");array = dataObj.getJSONArray("info");} catch (JSONException e) {e.printStackTrace();}//通知handler处理数据Message msg = handler.obtainMessage();handler.sendMessage(msg);}}class AtHandler extends Handler { @Overridepublic void handleMessage(Message msg){int size = array.length();atList = new ArrayList<String>();for(int i = 0;i<size;i++){JSONObject data = array.optJSONObject(i);try {atList.add(data.getString("nick")+"("+data.getString("name")+")");} catch (JSONException e) {e.printStackTrace();}}matchStrList = new ArrayList<String>();matchStrList.addAll(atList);atAdapter = new ArrayAdapter<String>(AddWeiboActivity.this,R.layout.at_list_item,R.id.at_nick_name,atList);atListView.setAdapter(atAdapter);}}class ExpressionAdapter extends BaseAdapter {private Context context;private LayoutInflater inflater;private List<Map<String,Object>> list;public ExpressionAdapter(Context context, List<Map<String,Object>> list) {super();this.context = context;this.list = list;this.inflater = LayoutInflater.from(context);}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(final int position, View convertView, ViewGroup parent){Map<String,Object> map = list.get(position);ImageView image = new ImageView(context);image.setImageDrawable((Drawable)map.get("drawable"));return image;}}@Overridepublic void onClick(View v) {if(operation_layout.getChildCount()>0){add_top_bar.setVisibility(View.VISIBLE);weibo_content.setVisibility(View.VISIBLE);operation_layout.setVisibility(View.GONE);operation_layout.removeAllViews();//别忘记要移除掉return;}switch (v.getId()) {case R.id.send_btn:{String returnStr = weibo.publishMsg(weibo.getAccessTokenKey(), weibo.getAccessTokenSecrect(), weibo_content.getText().toString());try {JSONObject dataObj = new JSONObject(returnStr);if("ok".equals(dataObj.getString("msg"))){Toast.makeText(AddWeiboActivity.this, "发送成功", Toast.LENGTH_SHORT).show();//我日,记得要show,每次都搞忘记}} catch (JSONException e) {e.printStackTrace();}}break;case R.id.add_cmamera_btn:{}break;case R.id.add_at_btn:{// 动态的组装viewatRootLayout.removeAllViews();// 组装前先把所有的孩子拿掉atEditText.setText("@");flag = FLAG_1;//区分atEnterBtn是在哪个界面按的atRootLayout.addView(atEditText, atEdiLayoutParams);atRootLayout.addView(atEnterBtn, atEnterBtnLayoutParams);atRootLayout.addView(atListView, atListViewLayoutParams);operation_layout.addView(atRootLayout);add_top_bar.setVisibility(View.GONE);// 隐藏上面的bar和文本编辑框,不让之与at选择相互影响weibo_content.setVisibility(View.GONE);operation_layout.setVisibility(View.VISIBLE);}break;case R.id.add_topic_btn:{//动态的组装viewatRootLayout.removeAllViews();//组装前先把所有的孩子拿掉atEditText.setText("");flag = FLAG_2;//区分atEnterBtn是在哪个界面按的atRootLayout.addView(atEditText,atEdiLayoutParams);atRootLayout.addView(atEnterBtn,atEnterBtnLayoutParams);atRootLayout.addView(topic_tip,topicTipViewLayoutParams);operation_layout.addView(atRootLayout);add_top_bar.setVisibility(View.GONE);// 隐藏上面的bar和文本编辑框,不让之与at选择相互影响weibo_content.setVisibility(View.GONE);operation_layout.setVisibility(View.VISIBLE);}break;case R.id.add_expression_btn:{add_top_bar.setVisibility(View.GONE);//隐藏上面的bar和文本编辑框,不让之与表情选择的gridView相互影响weibo_content.setVisibility(View.GONE);operation_layout.addView(expressionGrid);operation_layout.setVisibility(View.VISIBLE);}break;case R.id.add_location_btn:{}break;default:break;}}private List<Map<String,Object>> buildExpressionsList(){List<Map<String,Object>> list = new ArrayList<Map<String, Object>>();DecimalFormat df = new DecimalFormat("000");//格式化数字for(int i = 0;i<105;i++){Map<String,Object> map = new HashMap<String, Object>();String formatStr = "h"+df.format(i);int drawableId = 0 ;try {drawableId = R.drawable.class.getDeclaredField(formatStr).getInt(this);//反射取得id,这个地方循环套反射,是不是很耗性能啊,我没测试过,麻烦有好办法的兄弟姐妹分享一下} catch (IllegalArgumentException e) {e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();}Drawable drawable = getResources().getDrawable(drawableId);map.put("drawableId", formatStr);map.put("drawable",drawable);list.add(map);}return list;}class GridItemClickListener implements OnItemClickListener {@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int position,long arg3) {Map<String, Object> map = expressionList.get(position);String drawableId = (String)map.get("drawableId");add_top_bar.setVisibility(View.VISIBLE);weibo_content.setVisibility(View.VISIBLE);operation_layout.setVisibility(View.GONE);operation_layout.removeAllViews();//别忘记要移除掉String expressionStr=null;expressionStr = TextUtil.drawableIdToFaceName.get(drawableId);expressionStr="/"+expressionStr;weibo_content.setText(weibo_content.getText().toString()+expressionStr);}}class MyTextWatcher implements TextWatcher{@Overridepublic void afterTextChanged(Editable s){String changingStr = atEditText.getText().toString();if(changingStr.indexOf("@")!=-1){changingStr = changingStr.substring(1);}int size = atList.size();matchStrList.clear();for(int i = 0;i<size;i++){String currentStr = atList.get(i);if(currentStr.indexOf(changingStr)!=-1){matchStrList.add(currentStr);}}atAdapter = new ArrayAdapter<String>(AddWeiboActivity.this,R.layout.at_list_item,R.id.at_nick_name,matchStrList);atAdapter.notifyDataSetChanged();atListView.setAdapter(atAdapter);}@Overridepublic void beforeTextChanged(CharSequence s, int start, int count,int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before,int count) {}}class AtListViewItemListener implements OnItemClickListener{@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, int position,long arg3){add_top_bar.setVisibility(View.VISIBLE);weibo_content.setVisibility(View.VISIBLE);operation_layout.setVisibility(View.GONE);operation_layout.removeAllViews();//别忘记要移除掉String str = matchStrList.get(position);String nickStr = str.substring(0,str.indexOf("("));weibo_content.setText(weibo_content.getText()+"@"+nickStr);}}}


add_weibo.xml:
Java代码
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <RelativeLayoutandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:background="#ffffffff"xmlns:android="http://schemas.android.com/apk/res/android">
  3. <RelativeLayoutandroid:id="@+id/add_top_bar"android:background="@drawable/header"android:layout_width="fill_parent"android:layout_height="wrap_content">
  4. <Buttonandroid:text="发送"android:id="@+id/send_btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="5.0dip"android:layout_alignParentRight="true"/>
  5. <TextViewandroid:text="写广播"android:textSize="16.0sp"android:textColor="#ffffffff"android:ellipsize="middle"android:gravity="center_horizontal"android:layout_width="wrap_content"android:layout_height="wrap_content"android:singleLine="true"android:layout_alignParentLeft="true"android:layout_marginLeft="10.0dip"android:layout_centerVertical="true"/>
  6. </RelativeLayout>
  7. <EditTextandroid:id="@+id/weibo_content"android:gravity="top"android:layout_below="@id/add_top_bar"android:background="@null"android:textColor="@null"android:layout_weight="1"android:layout_width="fill_parent"android:layout_height="fill_parent"/>
  8. <RelativeLayoutandroid:id="@+id/add_bottom_bar"android:background="@drawable/header"android:layout_width="fill_parent"android:layout_height="50.0dip"android:layout_alignParentBottom="true"android:layout_marginTop="5.0dip">
  9. <Buttonandroid:id="@+id/add_cmamera_btn"android:background="@drawable/add_pic_selector"android:focusable="false"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="8.0dip"android:layout_marginRight="12.0dip"android:layout_alignParentLeft="true"android:layout_centerVertical="true"/>
  10. <Buttonandroid:id="@+id/add_at_btn"android:background="@drawable/add_at_selector"android:focusable="false"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginRight="12.0dip"android:layout_toRightOf="@id/add_cmamera_btn"android:layout_centerVertical="true"/>
  11. <Buttonandroid:id="@+id/add_topic_btn"android:background="@drawable/add_topic_selector"android:focusable="false"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginRight="12.0dip"android:layout_toRightOf="@id/add_at_btn"android:layout_centerVertical="true"/>
  12. <Buttonandroid:id="@+id/add_expression_btn"android:background="@drawable/add_emo_selector"android:focusable="false"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginRight="12.0dip"android:layout_toRightOf="@id/add_topic_btn"android:layout_centerVertical="true"/>
  13. <Buttonandroid:id="@+id/add_location_btn"android:background="@drawable/add_location_selector"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_toRightOf="@id/add_expression_btn"android:layout_centerVertical="true"/>
  14. <TextViewandroid:textSize="12.0sp"android:text="140"android:textColor="#c6cbce"android:id="@+id/remain_count"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginRight="12.0dip"android:layout_alignParentRight="true"android:layout_centerVertical="true"/>
  15. </RelativeLayout>
  16. <FrameLayoutandroid:layout_gravity="bottom"android:id="@+id/operation_layout"android:background="@android:color/transparent"android:paddingBottom="50.0dip"android:visibility="gone"android:layout_width="fill_parent"android:layout_height="fill_parent"/>
  17. </RelativeLayout>
<?xml version="1.0" encoding="UTF-8"?><RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffffff" xmlns:android="http://schemas.android.com/apk/res/android">   <RelativeLayout android:id="@+id/add_top_bar" android:background="@drawable/header" android:layout_width="fill_parent" android:layout_height="wrap_content">    <Button android:text="发送" android:id="@+id/send_btn"  android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5.0dip" android:layout_alignParentRight="true"/>    <TextView android:text="写广播" android:textSize="16.0sp" android:textColor="#ffffffff" android:ellipsize="middle" android:gravity="center_horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" android:layout_alignParentLeft="true" android:layout_marginLeft="10.0dip" android:layout_centerVertical="true"/></RelativeLayout>   <EditText android:id="@+id/weibo_content" android:gravity="top" android:layout_below="@id/add_top_bar" android:background="@null" android:textColor="@null" android:layout_weight="1" android:layout_width="fill_parent" android:layout_height="fill_parent"/>   <RelativeLayout android:id="@+id/add_bottom_bar" android:background="@drawable/header" android:layout_width="fill_parent" android:layout_height="50.0dip" android:layout_alignParentBottom="true" android:layout_marginTop="5.0dip">        <Button android:id="@+id/add_cmamera_btn" android:background="@drawable/add_pic_selector" android:focusable="false" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="8.0dip" android:layout_marginRight="12.0dip" android:layout_alignParentLeft="true" android:layout_centerVertical="true" />        <Button android:id="@+id/add_at_btn" android:background="@drawable/add_at_selector" android:focusable="false" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="12.0dip" android:layout_toRightOf="@id/add_cmamera_btn" android:layout_centerVertical="true" />        <Button android:id="@+id/add_topic_btn" android:background="@drawable/add_topic_selector" android:focusable="false" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="12.0dip" android:layout_toRightOf="@id/add_at_btn" android:layout_centerVertical="true" />        <Button android:id="@+id/add_expression_btn" android:background="@drawable/add_emo_selector" android:focusable="false" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="12.0dip" android:layout_toRightOf="@id/add_topic_btn" android:layout_centerVertical="true" />        <Button android:id="@+id/add_location_btn" android:background="@drawable/add_location_selector" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/add_expression_btn" android:layout_centerVertical="true" />        <TextView android:textSize="12.0sp" android:text="140" android:textColor="#c6cbce" android:id="@+id/remain_count" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="12.0dip" android:layout_alignParentRight="true" android:layout_centerVertical="true" />    </RelativeLayout>    <FrameLayout android:layout_gravity="bottom" android:id="@+id/operation_layout" android:background="@android:color/transparent" android:paddingBottom="50.0dip" android:visibility="gone" android:layout_width="fill_parent" android:layout_height="fill_parent" /></RelativeLayout>

表情解析先关 :下图是drawable文件下的表情文件


Java代码
  1. static{//表情文件和表情id的对应的HashMap<String,String>
  2. drawableIdToFaceName.put("h000","调皮");
  3. drawableIdToFaceName.put("h001","呲牙");
  4. drawableIdToFaceName.put("h002","惊讶");
  5. drawableIdToFaceName.put("h003","难过");
  6. drawableIdToFaceName.put("h004","酷");
  7. drawableIdToFaceName.put("h005","冷汗");
  8. drawableIdToFaceName.put("h006","抓狂");

http://helloandroid.iteye.com/blog/1131942

更多相关文章

  1. Android(安卓)弹无虚发之第四弹:你应该掌握的Notification(Notific
  2. 【Android(安卓)界面效果17】Android手机平板两不误,使用Fragment
  3. [置顶] Android(安卓)命名规范 (提高代码可以读性)
  4. 一个android显示远程txt的代码例子
  5. Android基站定位原理及实现代码
  6. Android:使用webview上传文件(支持相册和拍照) .
  7. Glide源码浅析
  8. Android——自定义顶部标题栏
  9. 精确获取android软键盘高度

随机推荐

  1. 服务器负载均衡(Server Load Balance,SLB)
  2. Non-UTF-8 code starting with '\xe4'
  3. 对象存储服务(Object Storage Service,OBS)
  4. 云关系型数据库(Relational Database Serv
  5. 云数据迁移(Cloud Data Migration,CDM)
  6. 弹性云服务器(Elastic Cloud Server,ECS)
  7. 云专线(Direct Connect,DC)
  8. 内容分发网络(Content Delivery Network,CD
  9. 虚拟私有云(Virtual Private Cloud,VPC)
  10. SpringMVC @Value注解无法获取值 报Illeg