李晨晨:
這次主要實現了聊天記錄列表的adapter,即上次的MsgRecyclerView的adapter,主要是各類消息的左右顯示和各條消息的頭像設置。
1.通過消息的MsgDirectionEnum和MsgTypeEnum屬性(網易雲信提供),確定消息的顯示位置和方式。
- private int getMsgViewType(MsgDirectionEnum direct, MsgTypeEnum type) {
-
- // 收到的消息,頭像顯示在 left
- if (direct == MsgDirectionEnum.In) {
- if (type == MsgTypeEnum.text) {
- return MSG_TEXT_L;
- } else if (type == MsgTypeEnum.image) {
- return MSG_IMG_L;
- } else if (type == MsgTypeEnum.audio) {
- return MSG_AUDIO_L;
- } else if (type == MsgTypeEnum.location) {
- return MSG_LOC_L;
- } else {
- return 0;
- }
- } else { // 發出的消息,頭像顯示在右邊
- if (type == MsgTypeEnum.text) {
- return MSG_TEXT_R;
- } else if (type == MsgTypeEnum.image) {
- return MSG_IMG_R;
- } else if (type == MsgTypeEnum.audio) {
- return MSG_AUDIO_R;
- } else if (type == MsgTypeEnum.location) {
- return MSG_LOC_R;
- } else {
- return 0;
- }
- }
- }
- private static final int MSG_TEXT_L = 0x20000;
- private static final int MSG_IMG_L = 0x20001;
- private static final int MSG_AUDIO_L = 0x20002;
- private static final int MSG_VIDEO_L = 0x20003;
- private static final int MSG_LOC_L = 0x20004;
-
- private static final int MSG_TEXT_R = 0x30000;
- private static final int MSG_IMG_R = 0x30001;
- private static final int MSG_AUDIO_R = 0x30002;
- private static final int MSG_VIDEO_R = 0x30003;
- private static final int MSG_LOC_R = 0x30004;
2.RecycleView 的adapter的onCreateViewHolder、onBindViewHolder以及getItemCount
- @Override
- public RViewHolder onCreateViewHolder(ViewGroup parent, int layoutId) {
- View view = mInflater.inflate(layoutId, parent, false);
- return new RViewHolder(mContext, view);
- }
-
- @Override
- public void onBindViewHolder(RViewHolder holder, int position) {
- if (mMessageList.get(position - 1).getUuid() == null) {
- String time = mDateFormat.format(new Date(mMessageList.get(position - 1).getTime()));
- holder.setText(R.id.tv_msg_time, time);
- } else {
- bindMsgView(holder, mMessageList.get(position - 1));
- }
- }
-
- @Override
- public int getItemCount() {
- return mMessageList.size();
- }
其中用到的bindMsgView方法:包括頭像設置、process bar的顯示、根據類型綁定數據
- private void bindMsgView(final RViewHolder holder, final IMMessage message) {
-
- ImageView headView = holder.getImageView(R.id.iv_head_picture);
- // 設置頭像
- if (message.getDirect() == MsgDirectionEnum.In) {
-
- ImageUtils.setImageByUrl(mContext, headView, mChatSession.getChatInfo().getAvatar(),
- R.mipmap.app_logo_main);
-
- // 設置好友頭像點擊事件--打開好友信息界面
- headView.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent intent = new Intent(mContext, FriendInfoActivity.class);
- intent.putExtra("NimUserInfo", mChatSession.getChatInfo());
- intent.putExtra("FLAG",FriendInfoActivity.FLAG_SHOW_FRIEND);
- mContext.startActivity(intent);
- }
- });
-
- } else {
- ImageUtils.setImageByUrl(mContext, headView, mChatSession.getMyInfo().getAvatar(),
- R.mipmap.app_logo_main);
- }
-
- // 根據消息狀態和附件傳輸狀態決定是否顯示progress bar
- if (mChatUtils.isTransferring(message)) {
- holder.setVisible(R.id.progress_status, true);
- } else {
- holder.setVisible(R.id.progress_status, false);
- }
-
- // 根據類型綁定數據
- int viewType = getMsgViewType(message.getDirect(), message.getMsgType());
- switch (viewType) {
-
- // 文本
- case MSG_TEXT_L:
- case MSG_TEXT_R:
- TextView textView = holder.getTextView(R.id.tv_chat_msg);
- textView.setText(EmojiUtils.text2Emoji(mContext,message.getContent(),
- textView.getTextSize()));
- textView.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mItemClickListener != null){
- mItemClickListener.onItemClick(holder,message);
- }
- }
- });
- break;
-
- // 圖像
- case MSG_IMG_L:
- case MSG_IMG_R:
- ImageAttachment imageAttachment = (ImageAttachment) message.getAttachment();
- final SelectableRoundedImageView imageView = (SelectableRoundedImageView)
- holder.getImageView(R.id.iv_msg_img);
- Bitmap bitmap = mChatUtils.getBitmap(imageAttachment);
- if (bitmap != null){
- imageView.setImageBitmap(bitmap);
- }else {
- imageView.setImageResource(R.mipmap.bg_img_defalut);
- }
- imageView.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mItemClickListener != null){
- mItemClickListener.onItemClick(holder,message);
- }
- }
- });
- break;
-
- // 音頻
- case MSG_AUDIO_L:
- case MSG_AUDIO_R:
- AudioAttachment audioAttachment = (AudioAttachment) message.getAttachment();
- holder.setText(R.id.tv_audio_time, mChatUtils.getAudioTime(audioAttachment.getDuration()));
- RelativeLayout layout = holder.getReltiveLayout(R.id.layout_audio_msg);
- mChatUtils.setAudioLayoutWidth(layout, audioAttachment.getDuration());
-
- holder.getReltiveLayout(R.id.layout_audio_msg)
- .setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mItemClickListener != null){
- mItemClickListener.onItemClick(holder,message);
- }
- }
- });
- break;
-
-
- // 位置
- case MSG_LOC_L:
- case MSG_LOC_R:
- LocationAttachment locationAttachment = (LocationAttachment) message.getAttachment();
- holder.setText(R.id.tv_loc_address,locationAttachment.getAddress());
- holder.getTextView(R.id.tv_show_loc).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mItemClickListener != null){
- mItemClickListener.onItemClick(holder,message);
- }
- }
- });
- break;
-
- }
- }
3.重寫的RecyclerView.Adapter的getItemViewType方法:
- @Override
- public int getItemViewType(int position) {
- if (mMessageList.get(position - 1).getUuid() == null) {
- return R.layout.item_msg_list_time;//如果沒有Uuid,則爲時間消息
- } else {
- return getViewLayoutId(getMsgViewType(mMessageList.get(position - 1).getDirect(),
- mMessageList.get(position - 1).getMsgType()));
- }
- }
- private int getViewLayoutId(int viewType) {
- switch (viewType) {
- // 收到的消息
- case MSG_TEXT_L:
- return R.layout.item_msg_text_left;
- case MSG_IMG_L:
- return R.layout.item_msg_img_left;
- case MSG_AUDIO_L:
- return R.layout.item_msg_audio_left;
- case MSG_LOC_L:
- return R.layout.item_msg_loc_left;
-
- // 發出的消息
- case MSG_TEXT_R:
- return R.layout.item_msg_text_right;
- case MSG_IMG_R:
- return R.layout.item_msg_img_right;
- case MSG_AUDIO_R:
- return R.layout.item_msg_audio_right;
- case MSG_LOC_R:
- return R.layout.item_msg_loc_right;
-
- // 其他消息
- default:
- return R.layout.item_msg_list_time;
-
- }
- }
4.
- public MessageListAdapter(Context context, List<IMMessage> messages, ChatSession session) {
- mContext = context;
- mInflater = LayoutInflater.from(context);
- mChatUtils = new ChatUtils(context);
- mMessageList = messages;
- mChatSession = session;
- mDateFormat = new SimpleDateFormat("MM-dd HH:mm");//月-日 時(0~23):分
- }
仝心:
因爲登陸界面有註冊功能要能轉到賬號的註冊界面,所以先完成了註冊界面的佈局,內容包括輸入賬號、輸入密碼、確定密碼以及用已有賬號登陸等等。
註冊界面的佈局文件如下:
爲註冊按鍵綁定監聽器,內容包括檢測信息是否填充完整,如果有空缺則提示,信息合法後創建賬號
- @OnClick(R.id.btn_register)
- public void register(){
- String account = mEtAccount.getText().toString().trim();
- String name = mEtName.getText().toString().trim();
- String pass = mEtPass.getText().toString().trim();
- String confirmPass = mEtConfirmPass.getText().toString().trim();
- if (TextUtils.isEmpty(account) || TextUtils.isEmpty(name) || TextUtils.isEmpty(pass)){
- Toast.makeText(this,"請將信息填寫完整",Toast.LENGTH_SHORT).show();
- return;
- }
- if (TextUtils.isEmpty(confirmPass) || !confirmPass.equals(pass)){
- ToastUtils.showMessage(this,"確認密碼爲空或與密碼不符");
- return;
- }
-
- NimClientHandle.getInstance().register(account,pass, name, new OnRegisterListener() {
- @Override
- public void onSuccess() {
- ToastUtils.showMessage(RegisterActivity.this,"註冊成功");
- finish();
- }
-
- @Override
- public void onFailed(String message) {
- ToastUtils.showMessage(RegisterActivity.this,"註冊失敗:" + message);
- }
- });
- }
然後在上次自定義的LoginActivity中實現按註冊鍵後,跳轉到註冊界面的功能
- @OnClick(R.id.tv_btn_register)
- public void startRegister(){
- startActivity(new Intent(this,
- RegisterActivity.class));
- }
利用上次自定義的SharesPerferecesUtil類來實現保存登陸信息的方法,然後會在下面登陸功能中國調用
- private void saveLoginInfo(LoginInfo info){
- SharedPreferencesUtil.setStringSharedPreferences(this, Constant.LOCAL_LOGIN_TABLE,
- Constant.LOCAL_USER_ACCOUNT,info.getAccount());
- SharedPreferencesUtil.setStringSharedPreferences(this, Constant.LOCAL_LOGIN_TABLE,
- Constant.LOCAL_USER_TOKEN,info.getToken());
- NimUserHandler.getInstance().setMyAccount(info.getAccount());//**內部仔細看
- }
爲登陸按鍵實現跳轉到個人賬號的功能,如果賬號或密碼不合法,則彈出提示且登陸無效
- @OnClick(R.id.tv_btn_login)
- public void login(){
- String account = mEtUserAccount.getText().toString().trim();
- String pass = mEtPassWord.getText().toString().trim();
- if (TextUtils.isEmpty(account) || TextUtils.isEmpty(pass)){
- ToastUtils.showMessage(this,"賬號或密碼爲空~");
- return;
- }
- RequestCallback<LoginInfo> callBack = new RequestCallback<LoginInfo>() {
- @Override
- public void onSuccess(LoginInfo loginInfo) {
- isLogin = false;
- // 保存登錄信息
- saveLoginInfo(loginInfo);
- // 轉入主頁面
- startActivity(new Intent(LoginActivity.this,MainActivity.class));
- }
-
- @Override
- public void onFailed(int code) {
- isLogin = false;
- ToastUtils.showMessage(LoginActivity.this,
- "登錄失敗:"+ ConvertUtils.code2String(code));
- }
-
- @Override
- public void onException(Throwable exception) {
- isLogin = false;
- ToastUtils.showMessage(LoginActivity.this,
- "登錄出錯:"+exception.getMessage());
- }
- };
- LoginInfo loginInfo = new LoginInfo(account,pass);
- mLoginFuture = NIMClient.getService(AuthService.class).login(loginInfo);
- isLogin = true;
- mLoginFuture.setCallback(callBack);
- }
實現退出程序的功能,計算點擊次數,點擊兩次纔可成功退出,避免用戶錯按
- private void backDoubleExit(){
- mKeyBackCount++;
- if (mKeyBackCount == 1){
- ToastUtils.showMessage(LoginActivity.this,"再點一次退出程序~~");
- }else if (mKeyBackCount == 2){
- MyApplication.getInstance().AppExit();
- }
- }
張靜:
接下來完成AccountInfoActivity(賬號信息詳情頁)
一. TimePickerView——用於設置生日
1. 初始化控件
(1)實例化layout_time_picker.xml
- private void initView(Context context) {
- LayoutInflater.from(getContext()).inflate(R.layout.layout_time_picker, this);
- mWvYear = (WheelView) findViewById(R.id.year);
- mWvMonth = (WheelView) findViewById(R.id.month);
- mWvDay = (WheelView) findViewById(R.id.day);
- mTvConfirm = (TextView) findViewById(R.id.tv_btn_confirm);
- }
![](http://static.javashuo.com/static/loading.gif)
(2)加載分別設置年、月、日的滾輪控件(WheelView)
(3)加載「確認」TextView
- private void initView(Context context) {
- LayoutInflater.from(getContext()).inflate(R.layout.layout_time_picker, this);
- mWvYear = (WheelView) findViewById(R.id.year);
- mWvMonth = (WheelView) findViewById(R.id.month);
- mWvDay = (WheelView) findViewById(R.id.day);
- mTvConfirm = (TextView) findViewById(R.id.tv_btn_confirm);
- }
2. 初始化數據
設置格式爲「年-月-日」
獲取當前時間,當用戶想要設置生日時,默認顯示爲當前年月日
- private void initDate(){
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
- String[] split = sdf.format(new Date()).split("-");
- int currentYear = Integer.parseInt(split[0]);
- int currentMonth = Integer.parseInt(split[1]);
- int currentDay = Integer.parseInt(split[2]);
-
- mWvYear.setData(getYearData(currentYear));
- mWvYear.setDefault(1);
- mWvMonth.setData(getMonthData());
- mWvMonth.setDefault(currentMonth - 1);
- mWvDay.setData(getDayData(getMaxDay(currentYear, currentMonth)));
- mWvDay.setDefault(currentDay - 1);
- }
3. 初始化監聽器
- private void initListener(){
- mTvConfirm.setOnClickListener(this);
- mWvYear.setOnSelectListener(new WheelView.OnSelectListener() {
- @Override
- public void endSelect(int id, String text) {
- changeDayData();
- }
-
- @Override
- public void selecting(int id, String text) {
-
- }
- });
-
- mWvMonth.setOnSelectListener(new WheelView.OnSelectListener() {
- @Override
- public void endSelect(int id, String text) {
- changeDayData();
- }
-
- @Override
- public void selecting(int id, String text) {
-
- }
- });
- }
4. 列表加載可供用戶選擇的年月日
年份選擇爲(1900-2019)
月份選擇爲(1-12)
計算爲閏年或平年,據此以及大月小月設置每年每月可選擇的日期(28,29,30)
- private ArrayList<String> getYearData(int currentYear) {
- ArrayList<String> list = new ArrayList<>();
- for (int i = currentYear + 1; i >= 1900; i--) {
- list.add(String.valueOf(i));
- }
- return list;
- }
-
- private ArrayList<String> getMonthData() {
- ArrayList<String> list = new ArrayList<>();
- for (int i = 1; i <= 12; i++) {
- list.add(String.valueOf(i));
- }
- return list;
- }
-
- private ArrayList<String> getDayData(int maxDay){
- ArrayList<String> list = new ArrayList<>();
- for (int i=1;i <= maxDay;i++){
- list.add(String.valueOf(i));
- }
- return list;
- }
-
- private int getMaxDay(int year,int month){
- if (month == 2){
- if (isLeapYear(year)){
- return 29;
- }else {
- return 28;
- }
- }else if (month == 1 || month == 3 || month == 5 || month == 7
- || month == 8 || month ==10 || month == 12){
- return 31;
- }else {
- return 30;
- }
- }
-
- private boolean isLeapYear(int year){
- return (year % 100 == 0 && year % 400 == 0)
- || (year % 100 != 0 && year % 4 == 0);
- }
5. 點擊「確認」後,設爲當前選擇年月日
- @Override
- public void onClick(View v) {
- if (v.getId() == R.id.tv_btn_confirm){
- if (mSelectedListener != null){
- mSelectedListener.selectedDate(getYear(), getMonth(),getDay());
- }
- }
- }
附上完整TimePicker.java
- package com.ezreal.ezchat.timeselectview;
-
- import android.content.Context;
- import android.util.AttributeSet;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.widget.LinearLayout;
- import android.widget.TextView;
-
- import com.ezreal.ezchat.R;
-
- import java.text.SimpleDateFormat;
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.Locale;
-
- /**
- * Created by 張靜
- */
-
- public class TimePickerView extends LinearLayout implements View.OnClickListener{
- private WheelView mWvYear;
- private WheelView mWvMonth;
- private WheelView mWvDay;
- private OnDateSelectedListener mSelectedListener;
- private TextView mTvConfirm;
-
- public TimePickerView(Context context) {
- this(context, null);
- }
-
- public TimePickerView(Context context, AttributeSet attrs) {
- super(context, attrs);
- initView(context);
- initDate();
- initListener();
- }
-
- private void initView(Context context) {
- LayoutInflater.from(getContext()).inflate(R.layout.layout_time_picker, this);
- mWvYear = (WheelView) findViewById(R.id.year);
- mWvMonth = (WheelView) findViewById(R.id.month);
- mWvDay = (WheelView) findViewById(R.id.day);
- mTvConfirm = (TextView) findViewById(R.id.tv_btn_confirm);
- }
-
- private void initDate(){
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
- String[] split = sdf.format(new Date()).split("-");
- int currentYear = Integer.parseInt(split[0]);
- int currentMonth = Integer.parseInt(split[1]);
- int currentDay = Integer.parseInt(split[2]);
-
- mWvYear.setData(getYearData(currentYear));
- mWvYear.setDefault(1);
- mWvMonth.setData(getMonthData());
- mWvMonth.setDefault(currentMonth - 1);
- mWvDay.setData(getDayData(getMaxDay(currentYear, currentMonth)));
- mWvDay.setDefault(currentDay - 1);
- }
-
- private void initListener(){
- mTvConfirm.setOnClickListener(this);
- mWvYear.setOnSelectListener(new WheelView.OnSelectListener() {
- @Override
- public void endSelect(int id, String text) {
- changeDayData();
- }
-
- @Override
- public void selecting(int id, String text) {
-
- }
- });
-
- mWvMonth.setOnSelectListener(new WheelView.OnSelectListener() {
- @Override
- public void endSelect(int id, String text) {
- changeDayData();
- }
-
- @Override
- public void selecting(int id, String text) {
-
- }
- });
- }
-
- private ArrayList<String> getYearData(int currentYear) {
- ArrayList<String> list = new ArrayList<>();
- for (int i = currentYear + 1; i >= 1900; i--) {
- list.add(String.valueOf(i));
- }
- return list;
- }
-
- private ArrayList<String> getMonthData() {
- ArrayList<String> list = new ArrayList<>();
- for (int i = 1; i <= 12; i++) {
- list.add(String.valueOf(i));
- }
- return list;
- }
-
- private ArrayList<String> getDayData(int maxDay){
- ArrayList<String> list = new ArrayList<>();
- for (int i=1;i <= maxDay;i++){
- list.add(String.valueOf(i));
- }
- return list;
- }
-
- private int getMaxDay(int year,int month){
- if (month == 2){
- if (isLeapYear(year)){
- return 29;
- }else {
- return 28;
- }
- }else if (month == 1 || month == 3 || month == 5 || month == 7
- || month == 8 || month ==10 || month == 12){
- return 31;
- }else {
- return 30;
- }
- }
-
- private boolean isLeapYear(int year){
- return (year % 100 == 0 && year % 400 == 0)
- || (year % 100 != 0 && year % 4 == 0);
- }
-
- private void changeDayData(){
- int selectDay = getDay();
- int currentYear = getYear();
- int currentMonth = getMonth();
- int maxDay = getMaxDay(currentYear,currentMonth);
-
- mWvDay.setData(getDayData(maxDay));
-
- if (selectDay > maxDay){
- mWvDay.setDefault(maxDay - 1);
- }else {
- mWvDay.setDefault(selectDay - 1);
- }
-
- }
-
-
- public int getYear(){
- return Integer.parseInt(mWvYear.getSelectedText());
- }
-
- public int getMonth(){
- return Integer.parseInt(mWvMonth.getSelectedText());
- }
-
- public int getDay(){
- return Integer.parseInt(mWvDay.getSelectedText());
- }
-
- public void setSelectedListener(OnDateSelectedListener listener){
- this.mSelectedListener = listener;
- }
-
- @Override
- public void onClick(View v) {
- if (v.getId() == R.id.tv_btn_confirm){
- if (mSelectedListener != null){
- mSelectedListener.selectedDate(getYear(), getMonth(),getDay());
- }
- }
- }
-
- public interface OnDateSelectedListener{
- void selectedDate(int year, int month, int day);
- }
- }
寫完TimePicker可以開始寫AccountInfoActivity中設置生日
(1)實例化dialog_select_birthday.xml,利用AlertDialog創建
(2)在timePickerView上添加選擇監聽器
根據一定格式顯示(若年份或月份是1-9之間的,顯示時前面加0)
若與設置前發生變化,個人賬戶信息設置爲現在新設置的,並設置爲已發生改變
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <com.ezreal.ezchat.timeselectview.TimePickerView
- android:id="@+id/date_picker"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"/>
-
- </LinearLayout>
![](http://static.javashuo.com/static/loading.gif)
(2)
- private void setBirthday() {
- View view = LayoutInflater.from(this).inflate(R.layout.dialog_select_birthday, null);
- final AlertDialog dialog = new AlertDialog.Builder(this).setView(view).create();
- TimePickerView timePickerView = (TimePickerView) view.findViewById(R.id.date_picker);
- timePickerView.setSelectedListener(new TimePickerView.OnDateSelectedListener() {
- @Override
- public void selectedDate(int year, int month, int day) {
- String yearString = String.valueOf(year);
- String monthString = String.valueOf(month);
- String dayString = String.valueOf(day);
- if (monthString.length() == 1){
- monthString = "0" + monthString;
- }
- if (dayString.length() == 1){
- dayString = "0" + dayString;
- }
- String birthday = String.format("%s-%s-%s", yearString, monthString, dayString);
- if (!birthday.equals(mTvBirthDay.getText().toString())) {
- mAccountBean.setBirthDay(birthday);
- mTvBirthDay.setText(birthday);
- haveAccountChange = true;
- }
- dialog.dismiss();
-
- }
- });
- dialog.show();
- }
二. CityPickerView——用於設置地區
1. layout_city_picker.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="center_horizontal"
- android:orientation="vertical">
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="center_horizontal"
- android:orientation="horizontal"
- android:padding="10dp">
-
- <com.ezreal.ezchat.timeselectview.WheelView
- android:id="@+id/province_wv"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- app:itemNumber="3"
- app:lineColor="@color/default_line_color"
- app:lineHeight="2dp"
- app:maskHeight="32dp"
- app:noEmpty="true"
- app:normalTextColor="@color/default_unSelect_text_color"
- app:normalTextSize="14sp"
- app:selectedTextColor="@color/default_selected_text_color"
- app:selectedTextSize="18sp"
- app:unitHeight="50dp"/>
-
- <View
- android:layout_width="2dp"
- android:layout_height="40dp"/>
-
- <com.ezreal.ezchat.timeselectview.WheelView
- android:id="@+id/city_wv"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- app:itemNumber="3"
- app:lineColor="@color/default_line_color"
- app:lineHeight="2dp"
- app:maskHeight="32dp"
- app:noEmpty="true"
- app:normalTextColor="@color/default_unSelect_text_color"
- app:normalTextSize="14sp"
- app:selectedTextColor="@color/default_selected_text_color"
- app:selectedTextSize="18sp"
- app:unitHeight="50dp"/>
- </LinearLayout>
-
- <TextView
- android:id="@+id/tv_btn_confirm"
- android:layout_marginTop="10dp"
- android:gravity="center"
- android:layout_width="match_parent"
- android:layout_height="30dp"
- android:textSize="18sp"
- android:textColor="@color/white_color"
- android:background="@color/default_selected_text_color"
- android:text="@string/confirm"/>
-
- </LinearLayout>
![](http://static.javashuo.com/static/loading.gif)
2. 當View中所有子控件均被映射成xml後觸發
(1)爲「確定」TextView添加OnClickListener,初始化滾輪控件省份選擇和城市選擇併爲其設置初始顯示(即用戶進行地區設置時所看到的,北京 西城區)
(2)爲mProvincePick添加選擇監聽器
根據指定id從mAreaDataUtil(全國省份城市操作類)中取出所選擇的省
此時,城市還沒選擇,默認顯示爲a. 若該省份城市數大於1,默認顯示城市爲第二個
b. 若該省份城市數爲1,默認顯示城市爲第一個
(3)爲mCityPicker添加選擇監聽器
根據指定id設置
- protected void onFinishInflate() {
- super.onFinishInflate();
- LayoutInflater.from(getContext()).inflate(R.layout.layout_city_picker, this);
- mTvConfirm = (TextView) findViewById(R.id.tv_btn_confirm);
- mTvConfirm.setOnClickListener(this);
- mProvincePicker = (WheelView) findViewById(R.id.province_wv);
- mCityPicker = (WheelView) findViewById(R.id.city_wv);
-
- mProvincePicker.setData(mProvinceList);
- mProvincePicker.setDefault(0);
-
- String defaultProvince = mProvinceList.get(0);
- mCityPicker.setData(mAreaDataUtil.getCityByProvince(defaultProvince));
- mCityPicker.setDefault(1);
-
- mProvincePicker.setOnSelectListener(new WheelView.OnSelectListener() {
- @Override
- public void endSelect(int id, String text) {
- if (text.equals("") || text == null)
- return;
- if (mCurrProvinceIndex != id) {
- mCurrProvinceIndex = id;
- String selectProvince = mProvincePicker.getSelectedText();
- if (selectProvince == null || selectProvince.equals(""))
- return;
-
- // get city names by province
- ArrayList<String> city = mAreaDataUtil.getCityByProvince(mProvinceList.get(id));
- if (city.size() == 0) {
- return;
- }
-
- mCityPicker.setData(city);
-
- if (city.size() > 1) {
- //if city is more than one,show start index == 1
- mCityPicker.setDefault(1);
- } else {
- mCityPicker.setDefault(0);
- }
- }
-
- }
-
- @Override
- public void selecting(int id, String text) {
- }
- });
-
- mCityPicker.setOnSelectListener(new WheelView.OnSelectListener() {
-
- @Override
- public void endSelect(int id, String text) {
- if (text.equals("") || text == null)
- return;
- if (mCurrCityIndex != id) {
- mCurrCityIndex = id;
- String selectCity = mCityPicker.getSelectedText();
- if (selectCity == null || selectCity.equals(""))
- return;
- int lastIndex = Integer.valueOf(mCityPicker.getListSize());
- if (id > lastIndex) {
- mCityPicker.setDefault(lastIndex - 1);
- }
- }
- }
-
- @Override
- public void selecting(int id, String text) {
-
- }
- });
- }
附上完整CityPickerView.java
- package com.ezreal.ezchat.timeselectview;
-
- import android.content.Context;
- import android.util.AttributeSet;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.widget.LinearLayout;
- import android.widget.TextView;
-
- import com.ezreal.ezchat.R;
-
- import java.util.ArrayList;
-
- /**
- * Created by 張靜
- */
-
- public class CityPickerView extends LinearLayout implements View.OnClickListener{
-
- private WheelView mProvincePicker;
- private WheelView mCityPicker;
-
- private int mCurrProvinceIndex = -1;
- private int mCurrCityIndex = -1;
-
- private AreaDataUtil mAreaDataUtil;
- private ArrayList<String> mProvinceList = new ArrayList<>();
- private TextView mTvConfirm;
- private OnCitySelectedListener mSelectedListener;
- public CityPickerView(Context context, AttributeSet attrs) {
- super(context, attrs);
- getAreaInfo();
- }
-
- public CityPickerView(Context context) {
- this(context, null);
- }
-
- private void getAreaInfo() {
- mAreaDataUtil = new AreaDataUtil(getContext());
- mProvinceList = mAreaDataUtil.getProvinces();
- }
-
- @Override
- public void onClick(View v) {
- if (v.getId() == R.id.tv_btn_confirm){
- if (mSelectedListener != null){
- mSelectedListener.citySelected(getProvince(),getCity());
- }
- }
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
- LayoutInflater.from(getContext()).inflate(R.layout.layout_city_picker, this);
- mTvConfirm = (TextView) findViewById(R.id.tv_btn_confirm);
- mTvConfirm.setOnClickListener(this);
- mProvincePicker = (WheelView) findViewById(R.id.province_wv);
- mCityPicker = (WheelView) findViewById(R.id.city_wv);
-
- mProvincePicker.setData(mProvinceList);
- mProvincePicker.setDefault(0);
-
- String defaultProvince = mProvinceList.get(0);
- mCityPicker.setData(mAreaDataUtil.getCityByProvince(defaultProvince));
- mCityPicker.setDefault(1);
-
- mProvincePicker.setOnSelectListener(new WheelView.OnSelectListener() {
- @Override
- public void endSelect(int id, String text) {
- if (text.equals("") || text == null)
- return;
- if (mCurrProvinceIndex != id) {
- mCurrProvinceIndex = id;
- String selectProvince = mProvincePicker.getSelectedText();
- if (selectProvince == null || selectProvince.equals(""))
- return;
-
- // get city names by province
- ArrayList<String> city = mAreaDataUtil.getCityByProvince(mProvinceList.get(id));
- if (city.size() == 0) {
- return;
- }
-
- mCityPicker.setData(city);
-
- if (city.size() > 1) {
- //if city is more than one,show start index == 1
- mCityPicker.setDefault(1);
- } else {
- mCityPicker.setDefault(0);
- }
- }
-
- }
-
- @Override
- public void selecting(int id, String text) {
- }
- });
-
- mCityPicker.setOnSelectListener(new WheelView.OnSelectListener() {
-
- @Override
- public void endSelect(int id, String text) {
- if (text.equals("") || text == null)
- return;
- if (mCurrCityIndex != id) {
- mCurrCityIndex = id;
- String selectCity = mCityPicker.getSelectedText();
- if (selectCity == null || selectCity.equals(""))
- return;
- int lastIndex = Integer.valueOf(mCityPicker.getListSize());
- if (id > lastIndex) {
- mCityPicker.setDefault(lastIndex - 1);
- }
- }
- }
-
- @Override
- public void selecting(int id, String text) {
-
- }
- });
- }
-
- public String getProvince() {
- if (mProvincePicker == null) {
- return null;
- }
- return mProvincePicker.getSelectedText();
- }
-
- public String getCity() {
- if (mCityPicker == null) {
- return null;
- }
- return mCityPicker.getSelectedText();
- }
-
- public void setCitySelectedListener(OnCitySelectedListener listener){
- this.mSelectedListener = listener;
- }
-
- public interface OnCitySelectedListener{
- void citySelected(String province, String city);
- }
-
-
- }
其中,AreaDataUtil——全國省份城市操作類
- package com.ezreal.ezchat.timeselectview;
-
- import android.content.Context;
-
- import com.ezreal.ezchat.R;
-
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.HashMap;
- import java.util.List;
-
- /**
- * 全國省份城市操作類
- *
- * @author 張靜
- */
- public class AreaDataUtil {
-
- /**
- * 所有的省市String
- */
- public String AREAS_DATA;
- /**
- * 一個省份對應多個城市
- */
- private String[] single_province_city;
- /**
- * 全國省市Map key:省份 |Value:城市集合
- */
- private HashMap<String, List<String>> mCityMap = new HashMap<>();
-
- public AreaDataUtil(Context context) {
- AREAS_DATA = context.getResources().getString(R.string.province_and_city);
- splitProvince();
- getAllCityMap();
- }
-
- /**
- * 將省份和對應城市分割出來
- * <p/>
- * 得到:寧夏!!銀川!石嘴山!吳忠!固原
- */
- private void splitProvince() {
- single_province_city = AREAS_DATA.split("!!!");
- }
-
- /**
- * 獲得全國省份的列表
- *
- * @return
- */
- public ArrayList<String> getProvinces() {
- ArrayList<String> provinceList = new ArrayList<>();
- for (String str : single_province_city) {
- String province = str.split("!!")[0];
- provinceList.add(province);
- }
- return provinceList;
- }
-
- /**
- * 根據省份獲取城市列表
- *
- * @return
- */
- private void getAllCityMap() {
- for (String str : single_province_city) {
- // 得到省份
- String province = str.split("!!")[0];
- // 得到當前省份對應的城市
- String city = str.split("!!")[1];
- // 分離城市放入集合
- List<String> cityList = Arrays.asList(city.split("!"));
- // 省份和城市放入Map中
- mCityMap.put(province, cityList);
- }
- }
-
- /**
- * 根據省份查找對應的城市列表
- *
- * @return 城市集合
- */
- public ArrayList<String> getCityByProvince(String provinceStr) {
-
- List<String> list = mCityMap.get(provinceStr);
- ArrayList<String> arrList = new ArrayList<>();
- for (String city : list) {
- arrList.add(city);
- }
- return arrList;
- }
-
- }
寫完CityPickerView可以開始寫AccountInfoActivity中的設置地區方法
(1)實例化dialog_select_location.xml,並利用AlertDialog創建
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <com.ezreal.ezchat.timeselectview.CityPickerView
- android:id="@+id/city_picker"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"/>
- </LinearLayout>
![](http://static.javashuo.com/static/loading.gif)
(2)將設置完後的地區信息與原信息比對,若發生變化,則在個人賬戶信息中保存新設置,並設置已發生變化
- private void setLocation(){
- View view = LayoutInflater.from(this).inflate(R.layout.dialog_select_location, null);
- final AlertDialog dialog = new AlertDialog.Builder(this).setView(view).create();
- CityPickerView cityPickerView = (CityPickerView) view.findViewById(R.id.city_picker);
- cityPickerView.setCitySelectedListener(new CityPickerView.OnCitySelectedListener() {
- @Override
- public void citySelected(String province, String city) {
- String location = province + "/" + city;
- if (!location.equals(mTvLocation.getText().toString())) {
- mAccountBean.setLocation(location);
- mTvLocation.setText(location);
- haveAccountChange = true;
- }
- dialog.dismiss();
- }
- });
- dialog.show();
- }
三. 完整AccountInfoActivity.java
- package com.ezreal.ezchat.activity;
-
- import android.content.Context;
- import android.content.DialogInterface;
- import android.content.Intent;
- import android.graphics.Bitmap;
- import android.net.Uri;
- import android.os.Bundle;
- import android.provider.MediaStore;
- import android.support.annotation.Nullable;
- import android.support.v7.app.AlertDialog;
- import android.util.Log;
- import android.view.LayoutInflater;
- import android.view.MotionEvent;
- import android.view.View;
- import android.view.inputmethod.InputMethodManager;
- import android.widget.EditText;
- import android.widget.RelativeLayout;
- import android.widget.TextView;
-
- import com.ezreal.ezchat.R;
- import com.ezreal.ezchat.bean.LocalAccountBean;
- import com.ezreal.ezchat.handler.NimUserHandler;
- import com.ezreal.ezchat.utils.Constant;
- import com.ezreal.ezchat.timeselectview.CityPickerView;
- import com.ezreal.ezchat.timeselectview.TimePickerView;
- import com.joooonho.SelectableRoundedImageView;
- import com.netease.nimlib.sdk.AbortableFuture;
- import com.netease.nimlib.sdk.NIMClient;
- import com.netease.nimlib.sdk.RequestCallback;
- import com.netease.nimlib.sdk.nos.NosService;
- import com.netease.nimlib.sdk.uinfo.constant.GenderEnum;
- import com.ezreal.ezchat.commonlibrary.utils.ImageUtils;
- import com.ezreal.ezchat.commonlibrary.utils.TextUtils;
- import com.ezreal.ezchat.commonlibrary.utils.ToastUtils;
-
- import java.io.File;
-
- import butterknife.BindView;
- import butterknife.ButterKnife;
- import io.reactivex.Flowable;
- import io.reactivex.android.schedulers.AndroidSchedulers;
- import io.reactivex.functions.Consumer;
- import io.reactivex.functions.Function;
- import io.reactivex.schedulers.Schedulers;
-
- /**
- * 賬號信息詳情頁
- * Created by 張靜.
- */
-
- public class AccountInfoActivity extends BaseActivity implements View.OnClickListener, View.OnTouchListener {
-
- private static final String TAG = AccountInfoActivity.class.getSimpleName();
-
- @BindView(R.id.layout_head)
- RelativeLayout mLayoutHead;
- @BindView(R.id.iv_head_picture)
- SelectableRoundedImageView mIvHead;
- @BindView(R.id.tv_account)
- TextView mTvAccount;
- @BindView(R.id.et_account_nick)
- EditText mEtNick;
- @BindView(R.id.tv_account_sex)
- TextView mTvSex;
- @BindView(R.id.tv_account_birth)
- TextView mTvBirthDay;
- @BindView(R.id.tv_account_location)
- TextView mTvLocation;
- @BindView(R.id.et_account_signature)
- EditText mEtSignature;
- // 個人信息
- private LocalAccountBean mAccountBean;
- // 頭像本地路徑
- private String mHeadImgPath = "";
- // 獲取圖像請求碼
- private static final int SELECT_PHOTO = 30000;
- private static final int TAKE_PHOTO = 30001;
- // 信息是否有被更新
- private boolean haveAccountChange = false;
- // 是否處於編輯狀態
- private boolean isEditor;
- // 輸入服務,用於顯示鍵盤
- private InputMethodManager mInputMethodManager;
-
- @Override
- protected void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setStatusBarColor(R.color.app_blue_color);
- setContentView(R.layout.activity_account_info);
- setTitleBar("個人信息", true, true);
- ButterKnife.bind(this);
- showData();
- init();
- }
-
- // 顯示數據
- private void showData() {
- mAccountBean = NimUserHandler.getInstance().getLocalAccount();
- if (mAccountBean != null) {
- ImageUtils.setImageByFile(this, mIvHead,
- mAccountBean.getHeadImgUrl(), R.mipmap.bg_img_defalut);
- mTvAccount.setText(mAccountBean.getAccount());
- mEtNick.setText(mAccountBean.getNick());
- if (mAccountBean.getGenderEnum() == GenderEnum.FEMALE) {
- mTvSex.setText("女");
- } else if (mAccountBean.getGenderEnum() == GenderEnum.MALE) {
- mTvSex.setText("男");
- } else {
- mTvSex.setText("保密");
- }
- mEtSignature.setText(mAccountBean.getSignature());
- String birthday = mAccountBean.getBirthDay();
- if (TextUtils.isEmpty(birthday)) {
- mTvBirthDay.setText("未設置");
- } else {
- mTvBirthDay.setText(birthday);
- }
- String location = mAccountBean.getLocation();
- if (TextUtils.isEmpty(location)) {
- mTvLocation.setText("未設置");
- } else {
- mTvLocation.setText(location);
- }
- }
- }
-
- private void init() {
- mInputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
- // 文字
- mLayoutHead.setOnClickListener(this);
- mTvSex.setOnClickListener(this);
- mTvBirthDay.setOnClickListener(this);
- mTvLocation.setOnClickListener(this);
-
- // 標題欄
- mIvBack.setOnClickListener(this);
- mIvMenu.setOnClickListener(this);
-
- // 輸入框
- mEtNick.setOnTouchListener(this);
- mEtSignature.setOnTouchListener(this);
-
- // 結束編輯,相當於初始化爲非編輯狀態
- finishEdit();
- }
-
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.layout_head:
- setHeadImg();
- break;
- case R.id.tv_account_sex:
- setSex();
- break;
- case R.id.tv_account_location:
- setLocation();
- break;
- case R.id.tv_account_birth:
- setBirthday();
- break;
- case R.id.iv_back_btn:
- this.finish();
- break;
- case R.id.iv_menu_btn:
- if (isEditor) {
- finishEdit();
- } else {
- startEdit();
- }
- break;
- }
- }
-
- // EditText 獲取焦點並將光標移動到末尾
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- if (isEditor) {
- if (v.getId() == R.id.et_account_nick) {
- mEtNick.requestFocus();
- mEtNick.setSelection(mEtNick.getText().length());
- mInputMethodManager.showSoftInput(mEtNick, 0);
- } else if (v.getId() == R.id.et_account_signature) {
- mEtSignature.requestFocus();
- mEtSignature.setSelection(mEtSignature.getText().length());
- mInputMethodManager.showSoftInput(mEtSignature, 0);
- }
- return true;
- }
- return false;
- }
-
- /**
- * 啓動編輯
- */
- private void startEdit() {
- mIvMenu.setImageResource(R.mipmap.done);
- // 可點擊
- mLayoutHead.setClickable(true);
- mTvSex.setClickable(true);
- mTvLocation.setClickable(true);
- mTvBirthDay.setClickable(true);
- // 可編輯
- mEtNick.setFocusable(true);
- mEtNick.setFocusableInTouchMode(true);
- mEtSignature.setFocusable(true);
- mEtSignature.setFocusableInTouchMode(true);
-
- isEditor = true;
- }
-
- /**
- * 結束編輯,判斷是否有修改,決定是否同步緩存數據
- */
- private void finishEdit() {
- if (!mEtNick.getText().toString()
- .equals(mAccountBean.getNick())) {
- mAccountBean.setNick(mEtNick.getText().toString());
- haveAccountChange = true;
- }
-
- if (!mEtSignature.getText().toString()
- .equals(mAccountBean.getSignature())) {
- mAccountBean.setSignature(mEtSignature.getText().toString());
- haveAccountChange = true;
- }
-
- if (haveAccountChange) {
-
- // 將數據更新到緩存
- NimUserHandler.getInstance().setLocalAccount(mAccountBean);
- // 通知handler將數據更新到服務器
- NimUserHandler.getInstance().syncChange2Service();
-
- haveAccountChange = false;
- }
-
- mIvMenu.setImageResource(R.mipmap.editor);
- // 不可點擊
- mLayoutHead.setClickable(false);
- mTvSex.setClickable(false);
- mTvLocation.setClickable(false);
- mTvBirthDay.setClickable(false);
- // 不可編輯
- mEtNick.setFocusable(false);
- mEtNick.setFocusableInTouchMode(false);
- mEtSignature.setFocusable(false);
- mEtSignature.setFocusableInTouchMode(false);
-
- isEditor = false;
- }
-
- /**
- * 設置性別
- */
- private void setSex(){
- final int[] selected = new int[1];
- if (mAccountBean.getGenderEnum() == GenderEnum.MALE) {
- selected[0] = 0;
- } else if (mAccountBean.getGenderEnum() == GenderEnum.FEMALE) {
- selected[0] = 1;
- } else {
- selected[0] = 2;
- }
- final String[] items = new String[]{"男", "女", "保密"};
- new AlertDialog.Builder(this)
- .setTitle("性別")
- .setSingleChoiceItems(items, selected[0], new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- if (which != selected[0]) {
- if (which == 0) {
- mAccountBean.setGenderEnum(GenderEnum.MALE);
- mTvSex.setText("男");
- } else if (which == 1) {
- mAccountBean.setGenderEnum(GenderEnum.FEMALE);
- mTvSex.setText("女");
- } else {
- mAccountBean.setGenderEnum(GenderEnum.UNKNOWN);
- mTvSex.setText("保密");
- }
- haveAccountChange = true;
- }
- dialog.dismiss();
- }
- }).create().show();
- }
-
- /**
- * 設置生日
- */
- private void setBirthday() {
- View view = LayoutInflater.from(this).inflate(R.layout.dialog_select_birthday, null);
- final AlertDialog dialog = new AlertDialog.Builder(this).setView(view).create();
- TimePickerView timePickerView = (TimePickerView) view.findViewById(R.id.date_picker);
- timePickerView.setSelectedListener(new TimePickerView.OnDateSelectedListener() {
- @Override
- public void selectedDate(int year, int month, int day) {
- String yearString = String.valueOf(year);
- String monthString = String.valueOf(month);
- String dayString = String.valueOf(day);
- if (monthString.length() == 1){
- monthString = "0" + monthString;
- }
- if (dayString.length() == 1){
- dayString = "0" + dayString;
- }
- String birthday = String.format("%s-%s-%s", yearString, monthString, dayString);
- if (!birthday.equals(mTvBirthDay.getText().toString())) {
- mAccountBean.setBirthDay(birthday);
- mTvBirthDay.setText(birthday);
- haveAccountChange = true;
- }
- dialog.dismiss();
-
- }
- });
- dialog.show();
- }
-
- /**
- * 設置地區
- */
- private void setLocation(){
- View view = LayoutInflater.from(this).inflate(R.layout.dialog_select_location, null);
- final AlertDialog dialog = new AlertDialog.Builder(this).setView(view).create();
- CityPickerView cityPickerView = (CityPickerView) view.findViewById(R.id.city_picker);
- cityPickerView.setCitySelectedListener(new CityPickerView.OnCitySelectedListener() {
- @Override
- public void citySelected(String province, String city) {
- String location = province + "/" + city;
- if (!location.equals(mTvLocation.getText().toString())) {
- mAccountBean.setLocation(location);
- mTvLocation.setText(location);
- haveAccountChange = true;
- }
- dialog.dismiss();
- }
- });
- dialog.show();
- }
-
- /**
- * 設置頭像,拍照或選擇照片
- */
- private void setHeadImg() {
- View view = LayoutInflater.from(this).inflate(R.layout.dialog_set_head_img, null);
- final AlertDialog alertDialog = new AlertDialog.Builder(this).setView(view).create();
- TextView take = (TextView) view.findViewById(R.id.tv_take_photo);
- TextView select = (TextView) view.findViewById(R.id.tv_select_img);
- take.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- alertDialog.dismiss();
- try {
- Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
- mHeadImgPath = Constant.APP_CACHE_PATH + File.separator + "image"
- + File.separator + mAccountBean.getAccount() + ".jpg";
- Uri uri = Uri.fromFile(new File(mHeadImgPath));
- intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);//設置圖像文件名
- startActivityForResult(intent, TAKE_PHOTO);
- } catch (Exception e) {
- ToastUtils.showMessage(AccountInfoActivity.this, "啓動相機出錯!請重試");
- e.printStackTrace();
- }
-
- }
- });
- select.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- alertDialog.dismiss();
- Intent intent = new Intent(Intent.ACTION_PICK,
- MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
- intent.setType("image/*");
- startActivityForResult(Intent.createChooser(intent, "選擇頭像圖片"), SELECT_PHOTO);
- }
- });
- alertDialog.show();
- }
-
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- if (resultCode == RESULT_OK) {
- if (requestCode == TAKE_PHOTO) {
- dealTakePhotoResult();
- } else if (requestCode == SELECT_PHOTO) {
- mHeadImgPath = ImageUtils.getFilePathFromUri(AccountInfoActivity.this, data.getData());
- dealTakePhotoResult();
- }
- }
- }
-
- /**
- * 處理拍照回傳數據
- */
- private void dealTakePhotoResult() {
- Flowable.just(mHeadImgPath)
- .map(new Function<String, Bitmap>() {
- @Override
- public Bitmap apply(String path) throws Exception {
- // 調整旋轉角度,壓縮
- int bitmapDegree = ImageUtils.getBitmapDegree(mHeadImgPath);
- Bitmap bitmap = ImageUtils.getBitmapFromFile(mHeadImgPath, 600, 400);
- bitmap = ImageUtils.rotateBitmapByDegree(bitmap, bitmapDegree);
- ImageUtils.saveBitmap2Jpg(bitmap, path);
- return bitmap;
- }
- })
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(new Consumer<Bitmap>() {
- @Override
- public void accept(Bitmap bitmap) throws Exception {
- // 顯示,記錄更新,同步至網易雲服務器
- if (bitmap != null) {
- // 上傳至服務器
- uploadHeadImg(bitmap);
- }
- }
- });
- }