我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android仿新浪微博发布微博界面设计(5)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android仿新浪微博发布微博界面设计(5)

本教程为大家分享了Android发布微博、添加表情等功能的具体代码,供大家参考,具体内容如下

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

1.根据有没有图片来选择相应的接口。
2.根据输入框的改变判断文字数。
3.创建一个girlview显示发送的图片,最最多9张,此处由于请求参数的的原因,最多上传一张图片,选择多张图片时,上传最后一张图片。(官方Demo与网络多个Demo均只能上传一张图片。如有看官解决多图上传,请务必联系我!)
4.显示表情的实现:用正则表达式遍历文字内容,代获取与表情相符的内容后, 用SpannableString将对于的表情图片显示在TextView中。
5.表情面板的实现:创建显示表情的GridView,将表情分组放入其中,监听GridView点击事件,将表情显示输入到EditText中。具体表情功能的实现请参考://www.jb51.net/article/97862.htm
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;
 @Override
 protected 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() {
  @Override
  public void beforeTextChanged(CharSequence s, int start, int count, int after) {
  }
  
  @Override
  public 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));
  }
  @Override
  public 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() {
  @Override
  public 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.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  @Override
  public 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() {
  @Override
  public 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() {
  @Override
  public void onClick(View v) {
  // 隐藏或显示表情面板
  ll_emotion_dashboard.setVisibility(
   ll_emotion_dashboard.getVisibility() == View.VISIBLE ?
    View.GONE : View.VISIBLE);
  }
 });
 initEmotion();
 }
 //获取图片路径 响应startActivityForResult
 protected 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 打开图片
 }
 //刷新图片
 @Override
 protected 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() {
  @Override
  public 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;
 }
 }
 
 protected void dialog(final int position) {
 AlertDialog.Builder builder = new AlertDialog.Builder(WriteActivity.this);
 builder.setMessage("确认移除已添加图片吗?");
 builder.setTitle("提示");
 builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {
  @Override
  public void onClick(DialogInterface dialog, int which) {
  dialog.dismiss();
  imageItem.remove(position);
  imagepaths.remove(position - 1);
  simpleAdapter.notifyDataSetChanged();
  }
 });
 builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
  @Override
  public 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);
 }
 
 private GridView createEmotionGridView(List<String> emotionNames, int gvWidth, int padding, int itemWidth, int gvHeight) {
 // 创建GridView
 GridView 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;
 }
 @Override
 public 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包对请求参数进行处理。


 
 public void postwhitText(final Context context, final String text) {
 if (oAuth == null) {
  oAuth = oAuth.getOAuth(context);
 }
 new Thread() {
  @Override
  public 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();
 }
 
 public void postwhitTextandImages(final Context context, final String text, final List<String> filesPath) {
 new Thread() {
  @Override
  public 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对象赋值给HttpPost
   httpPost.setEntity(multipartEntity);
   HttpResponse response = null;
   //执行请求,并返回结果HttpResponse
   response = 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();
 }

效果图:

您可能感兴趣的文章:Android仿新浪微博自定义ListView下拉刷新(4)Android仿新浪微博分页管理界面(3)Android仿新浪微博oauth2.0授权界面实现代码(2)Android仿新浪微博启动界面或登陆界面(1)Android用PopupWindow实现新浪微博的分组信息实例Android仿新浪微博、QQ空间等帖子显示(2)Android仿新浪微博、QQ空间等帖子显示(1)Android仿新浪微博/QQ空间滑动自动播放视频功能Android集成新浪微博第三方登录的方法Android仿新浪微博个人信息界面及其他效果


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android仿新浪微博发布微博界面设计(5)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android仿新浪微博发布微博界面设计(5)

本教程为大家分享了Android发布微博、添加表情等功能的具体代码,供大家参考,具体内容如下 发布一条新微博接口:http://open.weibo.com/wiki/2/statuses/update 上传图片并发布一条新微博接口:ht
2022-06-06

Android仿新浪微博分页管理界面(3)

本文实例为大家分享了Android仿新浪微博分页管理界面的具体代码,供大家参考,具体内容如下 多个activity分页管理,为了方便获取上下文,采用继承TabActivity的传统方法。 大致思路:使用RadioGroup点击触发不同的选卡
2022-06-06

Android仿新浪微博启动界面或登陆界面(1)

本文为大家分享了Android模仿新浪微博启动界面&登陆界面的具体实现代码,供大家参考,具体内容如下启动界面 主要有两个功能:1.加载启动动画 2.判断网络,有者直接进入登陆界面,否则去设置网络 代码较简单,主要采用AlphaAnimati
2022-06-06

Android仿新浪微博oauth2.0授权界面实现代码(2)

oauth2.0授权界面,大致流程图:前提准备: 在新浪开放平台申请appkey和appsecret:http://open.weibo.com/. 熟悉oauth2.0协议,相关知识:http://www.ruanyifeng.com/
2022-06-06

Android仿新浪微博个人信息界面及其他效果

本教程为大家分享了Android微博个人信息界面设计代码,供大家参考,具体内容如下 根据用户ID获取用户信息接口: http://open.weibo.com/wiki/2/users/show 如果你已经实现前面的功能那个这个人信息界面
2022-06-06

Android UI设计与开发之ViewPager仿微信引导界面以及动画效果

基于前两篇比较简单的实例做铺垫之后,这一篇我们来实现一个稍微复杂一点的引导界面的效果,当然也只是稍微复杂了一点,对于会的人来说当然还是so easy!正所谓会者不难,难者不会,大概说的就是这个意思了吧。好的,话不多说,回归正题。这篇要实现的
2023-05-30

微软发布 Windows 10 Build 21376 内测版:重新设计默认用户界面字体

在最近的预览版本中,有两个主要变化。其一,圆角现在更明显了。微软还引入了新的图标,几乎到处都是,延伸到了设置应用、控制面板、文件资源管理器和各种应用窗口。

微软 Windows 11Beta 22623.1037 版发布:优化语音操控指令,尝试任务栏搜索界面新设计

微软今天向 Beta 频道发布了最新的 Windows 11 Insider Preview Build 22621.1037 和 Build 22623.1037 (KB5021304) 版本。
Windows11微软2024-12-01

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录