Android仿新浪微博發(fā)布微博界面設(shè)計(5)
本教程為大家分享了Android發(fā)布微博、添加表情等功能的具體代碼,供大家參考,具體內(nèi)容如下
發(fā)布一條新微博接口:http://open.weibo.com/wiki/2/statuses/update
上傳圖片并發(fā)布一條新微博接口:http://open.weibo.com/wiki/2/statuses/upload
1.根據(jù)有沒有圖片來選擇相應(yīng)的接口。
2.根據(jù)輸入框的改變判斷文字數(shù)。
3.創(chuàng)建一個girlview顯示發(fā)送的圖片,最最多9張,此處由于請求參數(shù)的的原因,最多上傳一張圖片,選擇多張圖片時,上傳最后一張圖片。(官方Demo與網(wǎng)絡(luò)多個Demo均只能上傳一張圖片。如有看官解決多圖上傳,請務(wù)必聯(lián)系我!)
4.顯示表情的實現(xiàn):用正則表達式遍歷文字內(nèi)容,代獲取與表情相符的內(nèi)容后, 用SpannableString將對于的表情圖片顯示在TextView中。
5.表情面板的實現(xiàn):創(chuàng)建顯示表情的GridView,將表情分組放入其中,監(jiān)聽GridView點擊事件,將表情顯示輸入到EditText中。具體表情功能的實現(xiàn)請參考:http://www.dbjr.com.cn/article/97862.htm
5.最終發(fā)送的文字,表情,圖片數(shù)量,根據(jù)按鈕觸發(fā)時各個參數(shù)的狀態(tài)而決定。
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;
// 發(fā)送圖片的路徑
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);
/**
* 注冊輸入框內(nèi)容監(jiān)聽器
*/
write.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
/**
* 當(dāng)輸入框的內(nèi)容變化的時候執(zhí)行
*/
@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);
/**
* 監(jiān)聽GridView點擊事件
*/
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, "圖片數(shù)9張已滿", Toast.LENGTH_SHORT).show();
} else if (position == 0) { //點擊圖片位置為+ 0對應(yīng)0張圖片
//選擇圖片
Intent intent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, 1);
//通過onResume()刷新數(shù)據(jù)
} else {
dialog(position);
}
}
});
/**
* 監(jiān)聽發(fā)表按鈕點擊事件
*/
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, "內(nèi)容不能為空!", Toast.LENGTH_SHORT).show();
} else if (len > 140) {
Toast.makeText(WriteActivity.this, "超出字數(shù)限制!", 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();
}
//獲取圖片路徑 響應(yīng)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;
}
}
/**
* 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() {
@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();
}
/**
* 初始化表情面板內(nèi)容
*/
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對應(yīng)的view集合中
if (emotionNames.size() == 20) {
GridView gv = createEmotionGridView(emotionNames, gvWidth, spacing, itemWidth, gvHeight);
gvs.add(gv);
// 添加完一組表情,重新創(chuàng)建一個表情名字集合
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);
}
/**
* 創(chuàng)建顯示表情的GridView
*/
private GridView createEmotionGridView(List<String> emotionNames, int gvWidth, int padding, int itemWidth, int gvHeight) {
// 創(chuàng)建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設(shè)置表情圖片
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) {
// 如果點擊了最后一個回退按鈕,則調(diào)用刪除鍵事件
write.dispatchKeyEvent(new KeyEvent(
KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL));
} else {
// 如果點擊了表情,則添加到輸入框中
String emotionName = emotionGvAdapter.getItem(position);
// 獲取當(dāng)前光標位置,在指定位置上添加表情圖片文本
int curPosition = write.getSelectionStart();
StringBuilder sb = new StringBuilder(write.getText().toString());
sb.insert(curPosition, emotionName);
// 特殊文字處理,將表情等轉(zhuǎn)換一下
write.setText(StringUtils.getEmotionContent(
this, write, sb.toString()));
// 將光標設(shè)置到新增完表情的右側(cè)
write.setSelection(curPosition + emotionName.length());
}
}
}
}
發(fā)布微博的方法位于Tools.java中。由于上傳的數(shù)據(jù)采用multipart/form-data編碼方式,此處引入第三方httptmime.jar包對請求參數(shù)進行處理。
/**
* 發(fā)布一條不含圖片的微博
*
* @param context
* @param text
*/
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, "發(fā)表成功", Toast.LENGTH_SHORT).show();
Looper.loop();
} else {
Looper.prepare();
Toast.makeText(context, "發(fā)表失敗", Toast.LENGTH_SHORT).show();
Looper.loop();
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
/**
* 發(fā)布一條帶圖片的微博
*
* @param context
* @param
*/
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對象,參數(shù)
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;
//執(zhí)行請求,并返回結(jié)果HttpResponse
response = httpClient.execute(httpPost);
if (response.getStatusLine().getStatusCode() == 200) {
Looper.prepare();
Toast.makeText(context, "發(fā)表成功", Toast.LENGTH_SHORT).show();
Looper.loop();
} else {
Looper.prepare();
Toast.makeText(context, "發(fā)表失敗", Toast.LENGTH_SHORT).show();
Looper.loop();
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
效果圖:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
通知監(jiān)控NotificationListenerService onNotificationPosted重復(fù)回
這篇文章主要為大家介紹了通知監(jiān)控NotificationListenerService onNotificationPosted重復(fù)回調(diào)問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02
Flutter手機權(quán)限檢查與申請實現(xiàn)方法詳解
使用flutter進行app開發(fā),一定會用到手機的部分權(quán)限,包括通知推送、定位、相冊、存儲、相機、麥克風(fēng)等。而權(quán)限的檢查和獲取,最受歡迎的就是通過permission_handler這個插件來實現(xiàn)2022-11-11
android開發(fā)中常用的Eclipse快捷鍵詳細整理
android開發(fā)中常用的Eclipse快捷鍵詳細整理方便查找,需要的朋友可以了解下2012-12-12
Android自定義View 實現(xiàn)鬧鐘喚起播放鬧鐘鈴聲功能
這篇文章主要介紹了Android自定義View 實現(xiàn)鬧鐘喚起播放鬧鐘鈴聲的效果,本文通過實例代碼給大家詳解,需要的朋友可以參考下2016-12-12
Android 中使用RecyclerView實現(xiàn)底部翻頁
這篇文章主要介紹了Android 中使用RecyclerView實現(xiàn)底部翻頁功能,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-11-11
ScrollView與SeekBar綁定實現(xiàn)滑動時出現(xiàn)小滑塊效果
這篇文章主要為大家詳細介紹了ScrollView與SeekBar綁定實現(xiàn)滑動時出現(xiàn)小滑塊效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10

