(转摘)Android腾讯微博客户端开发四:微博发送篇(QQ表情,@搜索)
16lz
2021-01-26
凌晨发帖不容易啊, 有一个问题,谁做过android的自定义表情啊?貌似还没有发现有客户端有,都是图片,如果能像在电脑上那样自定义表情的功能多好,那位大哥知道,麻烦告知一声,呵呵。写完,睡觉。
我们仔细来观察下腾讯微博的qq表情发送规律,由/开始,1到3个中文或者英文字符.
写个工具类来测试已测试正则表达式来匹配表情。
在上方输入框中可以输入查询 格式为 @你选择的列表值
这个是话题输入界面,格式为#话题#
表情选择页面,这个其实是一个每行5列的GridView
此界面可看到你写的微博的内容,点击发送,发送成功
哈哈,看到了吧,我的微博首页已经显示了我刚才发送的带有话题@person和表情的微博了。
接下来,上代码。
Java代码
add_weibo.xml:
Java代码
表情解析先关 :下图是drawable文件下的表情文件
Java代码
我们仔细来观察下腾讯微博的qq表情发送规律,由/开始,1到3个中文或者英文字符.
写个工具类来测试已测试正则表达式来匹配表情。
在上方输入框中可以输入查询 格式为 @你选择的列表值
这个是话题输入界面,格式为#话题#
表情选择页面,这个其实是一个每行5列的GridView
此界面可看到你写的微博的内容,点击发送,发送成功
哈哈,看到了吧,我的微博首页已经显示了我刚才发送的带有话题@person和表情的微博了。
接下来,上代码。
Java代码
- publicclassAddWeiboActivityextendsActivityimplementsOnClickListener{
- privateDataHelperdataHelper;
- privateUserInfouser;
- privateStringuser_default_name;
- privateMyWeiboSyncweibo;
- privateListViewlistView;
- privateEditTextweibo_content;
- privateButtonsend_btn;
- privateButtonadd_cmamera_btn;
- privateButtonadd_at_btn;
- privateButtonadd_topic_btn;
- privateButtonadd_expression_btn;
- privateButtonadd_location_btn;
- privateGridViewexpressionGrid;
- privateList<Map<String,Object>>expressionList;
- privateExpressionAdapterexpressionAdapter;
- privateFrameLayoutoperation_layout;
- privateRelativeLayoutadd_top_bar;
- privateListViewatListView;
- privateRelativeLayoutatRootLayout;
- privateEditTextatEditText;
- privateButtonatEnterBtn;
- privateTextViewtopic_tip;
- privateRelativeLayout.LayoutParamsatEdiLayoutParams,atEnterBtnLayoutParams,atListViewLayoutParams,topicTipViewLayoutParams;
- privateJSONArrayarray;
- privateHandlerhandler;
- privateArrayAdapteratAdapter;
- privateList<String>atList;
- privateAtThreadthread;
- privateList<String>matchStrList;//选择atList匹配的字符串
- privateintflag;
- privatestaticintFLAG_1=1;
- privatestaticintFLAG_2=2;//1和2代表atEnterBtn的父亲控件不同
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.add_weibo);
- setUpViews();
- setUpListeners();
- dataHelper=DataBaseContext.getInstance(getApplicationContext());
- weibo=WeiboContext.getInstance();
- SharedPreferencespreferences=getSharedPreferences("default_user",Activity.MODE_PRIVATE);
- user_default_name=preferences.getString("user_default_name","");//取得微博默认登录账号信息
- handler=newAtHandler();
- thread=newAtThread();
- thread.start();//开启一个线程获取数据
- }
- privatevoidsetUpViews(){
- 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=newGridView(this);
- expressionGrid.setNumColumns(5);
- expressionList=buildExpressionsList();
- expressionAdapter=newExpressionAdapter(AddWeiboActivity.this,expressionList);
- expressionGrid.setAdapter(expressionAdapter);
- //以下代码至本方法setUpViews结束,是个人纯粹蛋疼联系纯代码布局,各位老大可以改成xml布局,淡定
- atRootLayout=newRelativeLayout(AddWeiboActivity.this);
- atEditText=newEditText(AddWeiboActivity.this);
- atEditText.setId(10000);
- atEnterBtn=newButton(AddWeiboActivity.this);
- atEnterBtn.setBackgroundDrawable(getResources().getDrawable(R.drawable.btn_enter_selector));
- atListView=newListView(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=newTextView(AddWeiboActivity.this);
- topic_tip.setText("请输入话题");
- topic_tip.setTextSize(20);
- topic_tip.setTextColor(Color.argb(255,90,142,189));//alpha通道一定不要设置成透明的了,要不然textView什么也看不见,因为这个我找了很久,以为代码错了,最后才发现是透明的
- atRootLayout.setLayoutParams(newLayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));
- atEdiLayoutParams=newRelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,80);
- atEnterBtnLayoutParams=newRelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
- atListViewLayoutParams=newRelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
- topicTipViewLayoutParams=newRelativeLayout.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());
- }
- privatevoidsetUpListeners(){
- 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(newGridItemClickListener());
- atListView.setOnItemClickListener(newAtListViewItemListener());
- atEditText.addTextChangedListener(newMyTextWatcher());
- atEnterBtn.setOnClickListener(newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- 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()+"@");
- }elseif(flag==FLAG_2){
- weibo_content.setText(weibo_content.getText()+"#"+atEditText.getText()+"#");
- }
- }
- });
- }
- classAtThreadextendsThread{
- @Override
- publicvoidrun(){
- StringjsonStr=weibo.getFans(weibo.getAccessTokenKey(),weibo.getAccessTokenSecrect(),20,0,user_default_name);
- try{
- JSONObjectdataObj=newJSONObject(jsonStr).getJSONObject("data");
- array=dataObj.getJSONArray("info");
- }catch(JSONExceptione){
- e.printStackTrace();
- }
- //通知handler处理数据
- Messagemsg=handler.obtainMessage();
- handler.sendMessage(msg);
- }
- }
- classAtHandlerextendsHandler{
- @Override
- publicvoidhandleMessage(Messagemsg){
- intsize=array.length();
- atList=newArrayList<String>();
- for(inti=0;i<size;i++){
- JSONObjectdata=array.optJSONObject(i);
- try{
- atList.add(data.getString("nick")+"("+data.getString("name")+")");
- }catch(JSONExceptione){
- e.printStackTrace();
- }
- }
- matchStrList=newArrayList<String>();
- matchStrList.addAll(atList);
- atAdapter=newArrayAdapter<String>(AddWeiboActivity.this,R.layout.at_list_item,R.id.at_nick_name,atList);
- atListView.setAdapter(atAdapter);
- }
- }
- classExpressionAdapterextendsBaseAdapter{
- privateContextcontext;
- privateLayoutInflaterinflater;
- privateList<Map<String,Object>>list;
- publicExpressionAdapter(Contextcontext,List<Map<String,Object>>list){
- super();
- this.context=context;
- this.list=list;
- this.inflater=LayoutInflater.from(context);
- }
- @Override
- publicintgetCount(){
- returnlist.size();
- }
- @Override
- publicObjectgetItem(intposition){
- returnlist.get(position);
- }
- @Override
- publiclonggetItemId(intposition){
- returnposition;
- }
- @Override
- publicViewgetView(finalintposition,ViewconvertView,ViewGroupparent){
- Map<String,Object>map=list.get(position);
- ImageViewimage=newImageView(context);
- image.setImageDrawable((Drawable)map.get("drawable"));
- returnimage;
- }
- }
- @Override
- publicvoidonClick(Viewv){
- 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()){
- caseR.id.send_btn:{
- StringreturnStr=weibo.publishMsg(weibo.getAccessTokenKey(),weibo.getAccessTokenSecrect(),weibo_content.getText().toString());
- try{
- JSONObjectdataObj=newJSONObject(returnStr);
- if("ok".equals(dataObj.getString("msg"))){
- Toast.makeText(AddWeiboActivity.this,"发送成功",Toast.LENGTH_SHORT).show();//我日,记得要show,每次都搞忘记
- }
- }catch(JSONExceptione){
- e.printStackTrace();
- }
- }
- break;
- caseR.id.add_cmamera_btn:{
- }
- break;
- caseR.id.add_at_btn:{
- //动态的组装view
- atRootLayout.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;
- caseR.id.add_topic_btn:{
- //动态的组装view
- atRootLayout.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;
- caseR.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;
- caseR.id.add_location_btn:{
- }
- break;
- default:
- break;
- }
- }
- privateList<Map<String,Object>>buildExpressionsList(){
- List<Map<String,Object>>list=newArrayList<Map<String,Object>>();
- DecimalFormatdf=newDecimalFormat("000");//格式化数字
- for(inti=0;i<105;i++){
- Map<String,Object>map=newHashMap<String,Object>();
- StringformatStr="h"+df.format(i);
- intdrawableId=0;
- try{
- drawableId=R.drawable.class.getDeclaredField(formatStr).getInt(this);//反射取得id,这个地方循环套反射,是不是很耗性能啊,我没测试过,麻烦有好办法的兄弟姐妹分享一下
- }catch(IllegalArgumentExceptione){
- e.printStackTrace();
- }catch(SecurityExceptione){
- e.printStackTrace();
- }catch(IllegalAccessExceptione){
- e.printStackTrace();
- }catch(NoSuchFieldExceptione){
- e.printStackTrace();
- }
- Drawabledrawable=getResources().getDrawable(drawableId);
- map.put("drawableId",formatStr);
- map.put("drawable",drawable);
- list.add(map);
- }
- returnlist;
- }
- classGridItemClickListenerimplementsOnItemClickListener{
- @Override
- publicvoidonItemClick(AdapterView<?>adapterView,Viewview,intposition,longarg3){
- Map<String,Object>map=expressionList.get(position);
- StringdrawableId=(String)map.get("drawableId");
- add_top_bar.setVisibility(View.VISIBLE);
- weibo_content.setVisibility(View.VISIBLE);
- operation_layout.setVisibility(View.GONE);
- operation_layout.removeAllViews();//别忘记要移除掉
- StringexpressionStr=null;
- expressionStr=TextUtil.drawableIdToFaceName.get(drawableId);
- expressionStr="/"+expressionStr;
- weibo_content.setText(weibo_content.getText().toString()+expressionStr);
- }
- }
- classMyTextWatcherimplementsTextWatcher{
- @Override
- publicvoidafterTextChanged(Editables){
- StringchangingStr=atEditText.getText().toString();
- if(changingStr.indexOf("@")!=-1){
- changingStr=changingStr.substring(1);
- }
- intsize=atList.size();
- matchStrList.clear();
- for(inti=0;i<size;i++){
- StringcurrentStr=atList.get(i);
- if(currentStr.indexOf(changingStr)!=-1){
- matchStrList.add(currentStr);
- }
- }
- atAdapter=newArrayAdapter<String>(AddWeiboActivity.this,R.layout.at_list_item,R.id.at_nick_name,matchStrList);
- atAdapter.notifyDataSetChanged();
- atListView.setAdapter(atAdapter);
- }
- @Override
- publicvoidbeforeTextChanged(CharSequences,intstart,intcount,
- intafter){
- }
- @Override
- publicvoidonTextChanged(CharSequences,intstart,intbefore,intcount){
- }
- }
- classAtListViewItemListenerimplementsOnItemClickListener{
- @Override
- publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intposition,longarg3){
- add_top_bar.setVisibility(View.VISIBLE);
- weibo_content.setVisibility(View.VISIBLE);
- operation_layout.setVisibility(View.GONE);
- operation_layout.removeAllViews();//别忘记要移除掉
- Stringstr=matchStrList.get(position);
- StringnickStr=str.substring(0,str.indexOf("("));
- weibo_content.setText(weibo_content.getText()+"@"+nickStr);
- }
- }
- }
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代码
- <?xmlversion="1.0"encoding="UTF-8"?>
- <RelativeLayoutandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:background="#ffffffff"xmlns:android="http://schemas.android.com/apk/res/android">
- <RelativeLayoutandroid:id="@+id/add_top_bar"android:background="@drawable/header"android:layout_width="fill_parent"android:layout_height="wrap_content">
- <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"/>
- <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"/>
- </RelativeLayout>
- <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"/>
- <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">
- <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"/>
- <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"/>
- <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"/>
- <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"/>
- <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"/>
- <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"/>
- </RelativeLayout>
- <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"/>
- </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代码
- static{//表情文件和表情id的对应的HashMap<String,String>
- drawableIdToFaceName.put("h000","调皮");
- drawableIdToFaceName.put("h001","呲牙");
- drawableIdToFaceName.put("h002","惊讶");
- drawableIdToFaceName.put("h003","难过");
- drawableIdToFaceName.put("h004","酷");
- drawableIdToFaceName.put("h005","冷汗");
- drawableIdToFaceName.put("h006","抓狂");
http://helloandroid.iteye.com/blog/1131942
更多相关文章
- Android(安卓)弹无虚发之第四弹:你应该掌握的Notification(Notific
- 【Android(安卓)界面效果17】Android手机平板两不误,使用Fragment
- [置顶] Android(安卓)命名规范 (提高代码可以读性)
- 一个android显示远程txt的代码例子
- Android基站定位原理及实现代码
- Android:使用webview上传文件(支持相册和拍照) .
- Glide源码浅析
- Android——自定义顶部标题栏
- 精确获取android软键盘高度
随机推荐
- 服务器负载均衡(Server Load Balance,SLB)
- Non-UTF-8 code starting with '\xe4'
- 对象存储服务(Object Storage Service,OBS)
- 云关系型数据库(Relational Database Serv
- 云数据迁移(Cloud Data Migration,CDM)
- 弹性云服务器(Elastic Cloud Server,ECS)
- 云专线(Direct Connect,DC)
- 内容分发网络(Content Delivery Network,CD
- 虚拟私有云(Virtual Private Cloud,VPC)
- SpringMVC @Value注解无法获取值 报Illeg