首頁 收藏 QQ群
 網(wǎng)站導(dǎo)航

ZNDS智能電視網(wǎng) 推薦當(dāng)貝市場(chǎng)

TV應(yīng)用下載 / 資源分享區(qū)

軟件下載 | 游戲 | 討論 | 電視計(jì)算器

綜合交流 / 評(píng)測(cè) / 活動(dòng)區(qū)

交流區(qū) | 測(cè)硬件 | 網(wǎng)站活動(dòng) | Z幣中心

新手入門 / 進(jìn)階 / 社區(qū)互助

新手 | 你問我答 | 免費(fèi)刷機(jī)救磚 | ROM固件

查看: 10038|回復(fù): 0
上一主題 下一主題
[教程]

Android騰訊微博客戶端開發(fā)四:微博發(fā)送篇(QQ表情,@搜索)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2013-8-28 16:28 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
有一個(gè)問題,誰做過android的自定義表情?。棵菜七€沒有發(fā)現(xiàn)有客戶端有,都是圖片,如果能像在電腦上那樣自定義表情的功能多好,那位大哥知道,麻煩告知一聲,呵呵。寫完,睡覺。   
      
我們仔細(xì)來觀察下騰訊微博的qq表情發(fā)送規(guī)律,由/開始,1到3個(gè)中文或者英文字符.   
      
寫個(gè)工具類來測(cè)試已測(cè)試正則表達(dá)式來匹配表情。   
      
   
      
在上方輸入框中可以輸入查詢 格式為 @你選擇的列表值   
      
這個(gè)是話題輸入界面,格式為#話題#   
      
表情選擇頁面,這個(gè)其實(shí)是一個(gè)每行5列的GridView   
   
      
此界面可看到你寫的微博的內(nèi)容,點(diǎn)擊發(fā)送,發(fā)送成功   
      
哈哈,看到了吧,我的微博首頁已經(jīng)顯示了我剛才發(fā)送的帶有話題@person和表情的微博了。   
   
接下來,上代碼。   
Java代碼   
   
  1. 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的父親控件不同   
       
            @Override   
            protected 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", "");//取得微博默認(rèn)登錄賬號(hào)信息   
                      
                    handler = new AtHandler();   
                    thread = new AtThread();   
                    thread.start();//開啟一個(gè)線程獲取數(shù)據(jù)   
            }   
               
            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結(jié)束,是個(gè)人純粹蛋疼聯(lián)系純代碼布局,各位老大可以改成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);//防止滑屏?xí)r出現(xiàn)黑快,不信可以注釋掉此句試一試   
                    atListView.setDivider(getResources().getDrawable(R.drawable.list_divider));//設(shè)置分割線   
                    atListView.setBackgroundColor(Color.argb(255, 239, 239, 239));//alpha通道一定不要設(shè)置成透明的了,要不然textView什么也看不見,因?yàn)檫@個(gè)我找了很久,以為代碼錯(cuò)了,最后才發(fā)現(xiàn)是透明的   
                      
                    topic_tip = new TextView(AddWeiboActivity.this);   
                    topic_tip.setText("請(qǐng)輸入話題");   
                    topic_tip.setTextSize(20);   
                    topic_tip.setTextColor(Color.argb(255, 90, 142, 189));//alpha通道一定不要設(shè)置成透明的了,要不然textView什么也看不見,因?yàn)檫@個(gè)我找了很久,以為代碼錯(cuò)了,最后才發(fā)現(xiàn)是透明的   
                      
                    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);//設(shè)置邊距,分別代表左,上,右,下   
                      
                    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() {   
                            @Override   
                            public 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 {   
                    @Override   
                    public 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處理數(shù)據(jù)   
                            Message msg = handler.obtainMessage();   
                            handler.sendMessage(msg);   
                    }   
            }   
               
            class AtHandler extends Handler {   
                    @Override   
                    public 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);   
                    }   
       
                    @Override   
                    public int getCount() {   
                            return list.size();   
                    }   
       
                    @Override   
                    public Object getItem(int position) {   
                            return list.get(position);   
                    }   
       
                    @Override   
                    public long getItemId(int position) {   
                            return position;   
                    }   
       
                    @Override   
                    public 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;   
                    }   
            }   
       
            @Override   
            public 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, "發(fā)送成功", Toast.LENGTH_SHORT).show();//我日,記得要show,每次都搞忘記   
                                    }   
                            } catch (JSONException e) {   
                                    e.printStackTrace();   
                            }   
                    }   
                            break;   
                    case R.id.add_cmamera_btn:{   
                               
                    }   
                            break;   
                    case R.id.add_at_btn:{   
                            // 動(dòng)態(tài)的組裝view   
                            atRootLayout.removeAllViews();// 組裝前先把所有的孩子拿掉   
                            atEditText.setText("@");   
                            flag = FLAG_1;//區(qū)分atEnterBtn是在哪個(gè)界面按的   
                            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:{   
                            //動(dòng)態(tài)的組裝view   
                            atRootLayout.removeAllViews();//組裝前先把所有的孩子拿掉   
                            atEditText.setText("");   
                            flag = FLAG_2;//區(qū)分atEnterBtn是在哪個(gè)界面按的   
                            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");//格式化數(shù)字   
                    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,這個(gè)地方循環(huán)套反射,是不是很耗性能啊,我沒測(cè)試過,麻煩有好辦法的兄弟姐妹分享一下   
                            } 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 {   
                    @Override   
                    public 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{   
                    @Override   
                    public 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);   
                    }   
       
                    @Override   
                    public void beforeTextChanged(CharSequence s, int start, int count,   
                                    int after) {   
                               
                    }   
       
                    @Override   
                    public void onTextChanged(CharSequence s, int start, int before,int count) {   
                               
                    }   
            }   
               
            class AtListViewItemListener implements OnItemClickListener{   
                    @Override   
                    public 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);   
                    }   
            }   
    }
復(fù)制代碼
   
   
   
add_weibo.xml:   
Java代碼   
   
  1. <?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="發(fā)送" 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>   
復(fù)制代碼
   
   
   
表情解析先關(guān) :下圖是drawable文件下的表情文件   
      
   
Java代碼   
   
  1. static{//表情文件和表情id的對(duì)應(yīng)的HashMap<String,String>   
                    drawableIdToFaceName.put("h000","調(diào)皮");   
                    drawableIdToFaceName.put("h001","呲牙");   
                    drawableIdToFaceName.put("h002","驚訝");   
                    drawableIdToFaceName.put("h003","難過");   
                    drawableIdToFaceName.put("h004","酷");   
                    drawableIdToFaceName.put("h005","冷汗");   
                    drawableIdToFaceName.put("h006","抓狂");
復(fù)制代碼
  
   
   
   
   

上一篇:Android軟件開發(fā)之應(yīng)用程序之間的通信介紹(十八)
下一篇:android調(diào)支付寶接口

本版積分規(guī)則

Archiver|新帖|標(biāo)簽|軟件|Sitemap|ZNDS智能電視網(wǎng) ( 蘇ICP備2023012627號(hào) )

網(wǎng)絡(luò)信息服務(wù)信用承諾書 | 增值電信業(yè)務(wù)經(jīng)營許可證:蘇B2-20221768 丨 蘇公網(wǎng)安備 32011402011373號(hào)

GMT+8, 2024-11-18 06:55 , Processed in 0.085239 second(s), 14 queries , Redis On.

Powered by Discuz!

監(jiān)督舉報(bào):report#znds.com (請(qǐng)將#替換為@)

© 2007-2024 ZNDS.Com

快速回復(fù) 返回頂部 返回列表