Android模仿新浪微博(写微博界面)

发布一条新微博接口:http://open.weibo.com/wiki/2/statuses/update
上传图片并发布一条新微博接口:http://open.weibo.com/wiki/2/statuses/upload

1.根据有没有图片来选择相应的接口。
2.根据输入框的改变判断文字数。
3.创建一个girlview显示发送的图片,最最多9张,此处由于请求参数的的原因,最多上传一张图片,选择多张图片时,上传最后一张图片。(已解决:http://blog.csdn.net/demonliuhui/article/details/53256543
4.显示表情的实现:用正则表达式遍历文字内容,代获取与表情相符的内容后, 用SpannableString将对于的表情图片显示在TextView中。
5.表情面板的实现:创建显示表情的GridView,将表情分组放入其中,监听GridView点击事件,将表情显示输入到EditText中。具体表情功能的实现请参考:http://www.eoeandroid.com/thread-897807-1-1.html?_dsign=cbb4daa9
5.最终发送的文字,表情,图片数量,根据按钮触发时各个参数的状态而决定。
6.删除选中的图片,获取其位置使用imageItem.remove(position)再将其在ArrayList移除。

public class WriteActivity extends Activity implements AdapterView.OnItemClickListener {private Button onput, addexpression;private EditText write;private GridView gridView;private TextView total_text_num = null;private LinearLayout ll_emotion_dashboard;private ViewPager vp_emotion_dashboard;// 发送图片的路径private String image_path;private Bitmap bmp;private ArrayList<String> imagepaths;private ArrayList<HashMap<String, Object>> imageItem;private SimpleAdapter simpleAdapter;     //适配器private Tools tools;private EmotionPagerAdapter emotionPagerGvAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.write);imagepaths = new ArrayList<>();write = (EditText) findViewById(R.id.write);total_text_num = (TextView) findViewById(R.id.total_text_num);onput = (Button) findViewById(R.id.onput);addexpression = (Button) findViewById(R.id.addexpression);ll_emotion_dashboard = (LinearLayout) findViewById(R.id.ll_emotion_dashboard);vp_emotion_dashboard = (ViewPager) findViewById(R.id.vp_emotion_dashboard);/***   注册输入框内容监听器*/write.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}/*** 当输入框的内容变化的时候执行*/@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {boolean flag = false;String mText = write.getText().toString();int len = mText.length();if (len > 140) {total_text_num.setTextColor(Color.RED);} else {total_text_num.setTextColor(Color.GREEN);}total_text_num.setText(String.valueOf(140 - len));}@Overridepublic void afterTextChanged(Editable s) {}});gridView = (GridView) findViewById(R.id.images);bmp = BitmapFactory.decodeResource(getResources(), R.drawable.add);imageItem = new ArrayList<HashMap<String, Object>>();HashMap<String, Object> map = new HashMap<String, Object>();map.put("itemImage", bmp);imageItem.add(map);simpleAdapter = new SimpleAdapter(this,imageItem, R.layout.griditem_addpic,new String[]{"itemImage"}, new int[]{R.id.imageView});simpleAdapter.setViewBinder(new SimpleAdapter.ViewBinder() {@Overridepublic boolean setViewValue(View view, Object data,String textRepresentation) {if (view instanceof ImageView && data instanceof Bitmap) {ImageView i = (ImageView) view;i.setImageBitmap((Bitmap) data);return true;}return false;}});gridView.setAdapter(simpleAdapter);/*** 监听GridView点击事件*/gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View v, int position, long id) {if (imageItem.size() == 10) { //第一张为默认图片Toast.makeText(WriteActivity.this, "图片数9张已满", Toast.LENGTH_SHORT).show();} else if (position == 0) { //点击图片位置为+ 0对应0张图片//选择图片Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);startActivityForResult(intent, 1);//通过onResume()刷新数据} else {dialog(position);}}});/*** 监听发表按钮点击事件*/tools = Tools.getInstance();onput.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//对文字进行处理String mText = write.getText().toString();int len = mText.length();if (len == 0) {Toast.makeText(WriteActivity.this, "内容不能为空!", Toast.LENGTH_SHORT).show();} else if (len > 140) {Toast.makeText(WriteActivity.this, "超出字数限制!", Toast.LENGTH_SHORT).show();} else {if (imagepaths.size() > 0) {tools.postwhitTextandImages(WriteActivity.this, mText,imagepaths);//进入微博主界面Intent intent = new Intent(WriteActivity.this, MainActivity.class);startActivity(intent);WriteActivity.this.finish();} else {tools.postwhitText(WriteActivity.this, mText);//进入微博主界面Intent intent = new Intent(WriteActivity.this, MainActivity.class);startActivity(intent);WriteActivity.this.finish();}}}});/*** 表情按钮及功能*/addexpression.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 隐藏或显示表情面板ll_emotion_dashboard.setVisibility(ll_emotion_dashboard.getVisibility() == View.VISIBLE ?View.GONE : View.VISIBLE);}});initEmotion();}//获取图片路径 响应startActivityForResultprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);//打开图片if (resultCode == RESULT_OK && requestCode == 1) {Uri uri = data.getData();if (!TextUtils.isEmpty(uri.getAuthority())) {//查询选择图片Cursor cursor = getContentResolver().query(uri,new String[]{MediaStore.Images.Media.DATA},null,null,null);//返回 没找到选择图片if (null == cursor) {return;}//光标移动至开头 获取图片路径cursor.moveToFirst();image_path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));}}  //end if 打开图片}//刷新图片@Overrideprotected void onResume() {super.onResume();if (!TextUtils.isEmpty(image_path)) {Bitmap addbmp = BitmapFactory.decodeFile(image_path);HashMap<String, Object> map = new HashMap<String, Object>();map.put("itemImage", addbmp);imageItem.add(map);simpleAdapter = new SimpleAdapter(this,imageItem, R.layout.griditem_addpic,new String[]{"itemImage"}, new int[]{R.id.imageView});simpleAdapter.setViewBinder(new SimpleAdapter.ViewBinder() {@Overridepublic boolean setViewValue(View view, Object data,String textRepresentation) {if (view instanceof ImageView && data instanceof Bitmap) {ImageView i = (ImageView) view;i.setImageBitmap((Bitmap) data);return true;}return false;}});gridView.setAdapter(simpleAdapter);simpleAdapter.notifyDataSetChanged();imagepaths.add(image_path);//刷新后释放防止手机休眠后自动添加image_path = null;}}/*** Dialog对话框提示用户删除操作* position为删除图片位置*/protected void dialog(final int position) {AlertDialog.Builder builder = new AlertDialog.Builder(WriteActivity.this);builder.setMessage("确认移除已添加图片吗?");builder.setTitle("提示");builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();imageItem.remove(position);imagepaths.remove(position - 1);simpleAdapter.notifyDataSetChanged();}});builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}});builder.create().show();}/***  初始化表情面板内容*/private void initEmotion() {// 获取屏幕宽度int gvWidth = DisplayUtils.getScreenWidthPixels(this);// 表情边距int spacing = DisplayUtils.dp2px(this, 8);// GridView中item的宽度int itemWidth = (gvWidth - spacing * 8) / 7;int gvHeight = itemWidth * 3 + spacing * 4;List<GridView> gvs = new ArrayList<GridView>();List<String> emotionNames = new ArrayList<String>();// 遍历所有的表情名字for (String emojiName : EmotionUtils.emojiMap.keySet()) {emotionNames.add(emojiName);// 每20个表情作为一组,同时添加到ViewPager对应的view集合中if (emotionNames.size() == 20) {GridView gv = createEmotionGridView(emotionNames, gvWidth, spacing, itemWidth, gvHeight);gvs.add(gv);// 添加完一组表情,重新创建一个表情名字集合emotionNames = new ArrayList<String>();}}// 检查最后是否有不足20个表情的剩余情况if (emotionNames.size() > 0) {GridView gv = createEmotionGridView(emotionNames, gvWidth, spacing, itemWidth, gvHeight);gvs.add(gv);}// 将多个GridView添加显示到ViewPager中emotionPagerGvAdapter = new EmotionPagerAdapter(gvs);vp_emotion_dashboard.setAdapter(emotionPagerGvAdapter);LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(gvWidth, gvHeight);vp_emotion_dashboard.setLayoutParams(params);}/*** 创建显示表情的GridView*/private GridView createEmotionGridView(List<String> emotionNames, int gvWidth, int padding, int itemWidth, int gvHeight) {// 创建GridViewGridView gv = new GridView(this);gv.setBackgroundColor(Color.rgb(233, 233, 233));gv.setSelector(android.R.color.transparent);gv.setNumColumns(7);gv.setPadding(padding, padding, padding, padding);gv.setHorizontalSpacing(padding);gv.setVerticalSpacing(padding);LayoutParams params = new LayoutParams(gvWidth, gvHeight);gv.setLayoutParams(params);// 给GridView设置表情图片EmotionGvAdapter adapter = new EmotionGvAdapter(this, emotionNames, itemWidth);gv.setAdapter(adapter);gv.setOnItemClickListener(this);return gv;}@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {Object itemAdapter = parent.getAdapter();if (itemAdapter instanceof EmotionGvAdapter) {// 点击的是表情EmotionGvAdapter emotionGvAdapter = (EmotionGvAdapter) itemAdapter;if (position == emotionGvAdapter.getCount() - 1) {// 如果点击了最后一个回退按钮,则调用删除键事件write.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL));} else {// 如果点击了表情,则添加到输入框中String emotionName = emotionGvAdapter.getItem(position);// 获取当前光标位置,在指定位置上添加表情图片文本int curPosition = write.getSelectionStart();StringBuilder sb = new StringBuilder(write.getText().toString());sb.insert(curPosition, emotionName);// 特殊文字处理,将表情等转换一下write.setText(StringUtils.getEmotionContent(this, write, sb.toString()));// 将光标设置到新增完表情的右侧write.setSelection(curPosition + emotionName.length());}}}
}

发布微博的方法位于Tools.java中。由于上传的数据采用multipart/form-data编码方式,此处引入第三方httptmime.jar包对请求参数进行处理。

 /*** 发布一条不含图片的微博** @param context* @param text*/public void postwhitText(final Context context, final String text) {if (oAuth == null) {oAuth = oAuth.getOAuth(context);}new Thread() {@Overridepublic void run() {try {HttpPost post = new HttpPost("https://api.weibo.com/2/statuses/update" +".json");List<NameValuePair> params = new ArrayList<NameValuePair>();params.add(new BasicNameValuePair("access_token", oAuth.getAccessToken()));params.add(new BasicNameValuePair("status", text));post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));HttpResponse response = httpClient.execute(post);if (response.getStatusLine().getStatusCode() == 200) {Looper.prepare();Toast.makeText(context, "发表成功", Toast.LENGTH_SHORT).show();Looper.loop();} else {Looper.prepare();Toast.makeText(context, "发表失败", Toast.LENGTH_SHORT).show();Looper.loop();}} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}.start();}/*** 发布一条带图片的微博** @param context* @param*/public void postwhitTextandImages(final Context context, final String text, final List<String> filesPath) {new Thread() {@Overridepublic void run() {try {//HttpClient对象HttpClient httpClient = new DefaultHttpClient();//采用POST的请求方式HttpPost httpPost = new HttpPost("https://upload.api.weibo" +".com/2/statuses/upload.json");//MultipartEntity对象,需要httpmime-4.1.1.jar文件。MultipartEntity multipartEntity = new MultipartEntity();//StringBody对象,参数StringBody param = new StringBody(oAuth.getAccessToken());multipartEntity.addPart("access_token", param);StringBody param1 = new StringBody(URLEncoder.encode(text));multipartEntity.addPart("status", param1);//filesPath为List<String>对象,里面存放的是需要上传的文件的地址for (String path : filesPath) {Log.i("------------", path);//FileBody对象,需要上传的文件ContentBody file = new FileBody(new File(path));multipartEntity.addPart("pic", file);}//将MultipartEntity对象赋值给HttpPosthttpPost.setEntity(multipartEntity);HttpResponse response = null;//执行请求,并返回结果HttpResponseresponse = httpClient.execute(httpPost);if (response.getStatusLine().getStatusCode() == 200) {Looper.prepare();Toast.makeText(context, "发表成功", Toast.LENGTH_SHORT).show();Looper.loop();} else {Looper.prepare();Toast.makeText(context, "发表失败", Toast.LENGTH_SHORT).show();Looper.loop();}} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}.start();}

这里写图片描述这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/55895.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android客户端接入新浪、腾讯微博以及人人网

本文原创http://blog.csdn.net/yanbin1079415046&#xff0c;转载请注明出处。 从事android工作也有段时间了&#xff0c;碍于肚子里料不多&#xff0c;一直也没写过什么东西。最近刚好项目中要接入新浪微博&#xff0c;就顺便研究了一下android客户端接入腾讯微博和人人网。由…

【第三方互联】9、新浪微博(sina)授权第三方登录

当我们创建的新浪微博互联应用成功后,我们便可以开始使用该应用来实现新浪微博授权操作 一、获取 App Key 和 App Secret 1、在“我的应用”,点击应用,查看我们创建的应用的基本信息 这样,我们就获取到了 App Key 和 App Secret 2、将 App Key 和 App Secret,以及该应用…

爬取微博上某大v,明星,官微等用户的微博信息的小技巧

通常成功的大门&#xff0c;其实都是虚掩着的 现在大多在爬取微博时&#xff0c;都是采用selenium框架&#xff0c;爬取pc端微博页面&#xff0c;模拟鼠标下拉来解决动态加载的问题&#xff0c;虽然笨拙&#xff0c;但是也能解决问题。今天我给大家推荐个更加好的方法。首先清看…

用ChatGPT可以去微博做个大V了(狗头)

将来用ChatGPT可以去微博做个大V了&#xff08;狗头&#xff09; 体验最近很火的ChatGPT体验了一下&#xff0c;这个OpenAI是真的强。 这小诗写的还挺有意境&#xff0c;网上搜了一下还没看到完全一样的。 现在各大厂商都布局OpenAI&#xff0c;期待更多黑科技。

黄仁勋评价股东孙正义

看NVIDIA人工智能全局&#xff0c;黄仁勋评价股东孙正义 “孙正义是我所知道的唯一能准确预知每一次科技浪潮的人。” 云科技时代 2017/06/18 21:01评论(0) 收藏(0)字体&#xff1a;宋 英伟达孙正义 (黄仁勋在2017台北Computex上) 2017年5月&#xff0c;传出软银悄悄购入40亿美…

英伟达CEO黄仁勋:NFT元宇宙已经到来

在与 Venturebeat 视频游戏记者 Dean Takahashi 的对话中&#xff0c;英伟达&#xff08;Nvidia&#xff09;首席执行官黄仁勋 Jensen Huang 表示&#xff0c;他相信“我们正处于基于区块链的增强现实元宇宙的风口浪尖”。 在周六发表的采访中&#xff0c;这位显卡巨头负责人描…

“核弹”之父——黄仁勋

一抹幽绿&#xff0c;有如眼睛一般的形状——相信已经很难有人不认识NVIDIA那标志性的LOGO了。今天的NVIDIA在显卡领域可谓无人能及&#xff0c;在通用计算和AI领域也留下浓重一笔&#xff0c;而带领NVIDIA取得现在成就的就是NVIDIA的联合创始人、CEO——黄仁勋。 初识老黄 想…

华人“军火专家”——黄仁勋

昨天我们介绍GPU的文章中有提到一位华人&#xff0c;他由于两款产品发热量大到能煎鸡蛋&#xff0c;被游戏玩家戏称为“两弹元勋”“军火专家”&#xff0c;在硅谷被认为是和杰夫贝索斯、伊隆马斯克并驾齐驱的人物&#xff0c;他创办的公司尽管不像智能手机企业、互联网企业那样…

黄仁勋没有回应,英伟达没有新品

晓査 乾明 假装发自 苏州量子位 出品 | 公众号 QbitAI 黄仁勋上台&#xff0c;然后下台。 在今天上午的GTC China大会上&#xff0c;黄教主没能拿出让人惊艳的新品&#xff0c;也没有只字片语回应英伟达的目前的“困境”。 大会之后的采访环节&#xff0c;老黄也没来。 据说是&…

黄仁勋把自己做成了虚拟娃娃

明敏 发自 凹非寺量子位 报道 | 公众号 QbitAI 英伟达是推出黄仁勋手办了吗&#xff1f;&#xff1f;&#xff1f; 看上去还挺可爱的呢。 不过事情可没有这么简单&#xff0c;接下来这一幕或许就会让你大为震撼。 因为&#xff0c;这个萌版老黄&#xff0c;是 会 动 的。 不仅如…

虚拟人是如何制作的?企业专属虚拟形象如何定制打造成虚拟代言?

虚拟数字人是指以数字形式存在于数字空间中&#xff0c;具有拟人或真人的外貌、行为和特点的虚拟人物&#xff0c;也称之为虚拟形象、数字虚拟人等。虚拟数字人核心技术主要包括计算机图形学、动作捕捉、图像渲染、AI等。虚拟数字人可以打造更完美的人设&#xff0c;为品牌带来…

GPT学习路线分享

初代GPT-3展示了三个重要能力&#xff1a; 语言生成&#xff1a;遵循提示词&#xff08;prompt&#xff09;&#xff0c;然后生成补全提示词的句子。这也是今天人类与语言模型最普遍的交互方式。 上下文学习 (in-context learning): 遵循给定任务的几个示例&#xff0c;然后为…

程序员的数学---数学思维的锻炼

第三章&#xff1a; 余数–周期性和分组 星期问题 来看一道简单的题目&#xff1a;今天星期日&#xff0c;那么 100 天以后星期几&#xff1f; 这个问题最笨的方法就是数数了。不过那样也是颇为费事&#xff0c;从余数方向考虑&#xff1a;一个礼拜 7 天&#xff0c;100 天等…

LaTeX技巧10:LaTeX数学公式输入初级入门

常见数学公式问题集下载 LaTeX最强大的功能就是显示美丽的数学公式&#xff0c;下面我们来看这些公式是怎么实现的。 1、数学公式的前后要加上 $ 或 \( 和 \)&#xff0c;比如&#xff1a;$f(x) 3x 7$ 和 \(f(x) 3x 7\) 效果是一样的&#xff1b; 如果用 \[ 和 \]&#xf…

Latex系列4---数学公式

前面几章其实已经把基础的Latex中文文本写的差不多了。这一章节针对我论文中用到的数学公式写一些心得。 数学公式 通常理工科写论文&#xff0c;少不了数学公式。在公式上&#xff0c;我个人认为相比word&#xff0c;latex还是有非常大的优势。 行内公式 行内公式通常用一对…

在OneNote种使用Latex命令愉快地敲出数学公式

在OneNote种使用Latex命令愉快地敲出数学公式 office中所有支持键盘输入的公式 office中默认是用的Unicodemath&#xff0c;相关的语法上个链接里面就有&#xff0c;office提供了Unicodemath与latex互转的方法。相关链接如下&#xff1a;LaTeX Math in Office Unicodemath …

数学公式识别神器Mathpix,零错误高效率

我们完成论文最费时间的可能就是公式了&#xff0c;尤其是对于工科学生&#xff0c;所以这里给大家带来了特别高效率几乎零错误的识别公式工具&#xff0c;这样可以节约很多的时间。博主测验&#xff0c;效率非常好。 官网 地址&#xff1a;https://mathpix.com/ 进入后&…

数学公式截图识别神器Mathpix无限使用教程

源链&#xff1a;数学公式截图识别神器Mathpix无限使用教程 - 哔哩哔哩点击进入查看全文>https://www.bilibili.com/read/cv8289444?fromsearch&spm_id_from333.337.0.0一、Mathpix软件注册教程 1.首先打开网址&#xff1a;https://accounts.mathpix.com/signup?refer…

ChatGPT驱动的虚拟试衣间,提升电子商务购物体验

随着电子商务的快速发展&#xff0c;线上购物已成为现代消费者的主要选择之一。然而&#xff0c;与线下购物相比&#xff0c;线上购物存在一个重要的挑战&#xff1a;消费者无法亲自试穿衣物。这一问题影响了许多消费者的购物决策&#xff0c;因为他们无法确定穿着的合适性和外…

AI硅基小助手——一个数字虚拟人化的ChatGPT类工具

自从ChatGPT发布以来&#xff0c;各种AIGC大模型类工具产品如汗牛充栋&#xff0c;参差不齐&#xff0c;大都是接上了ChatGPT的接口&#xff0c;功能几乎都一样&#xff0c;让人觉得乏味。 最近有一款新的名为“AI硅基小助手”的程序上线了&#xff0c;他基于自研的“硅基知识大…