diff --git a/.idea/misc.xml b/.idea/misc.xml index 4c9840b..7aa308e 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -36,9 +36,10 @@ - + + @@ -46,6 +47,7 @@ + diff --git a/app/build.gradle b/app/build.gradle index d5df745..9a0fe86 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -74,6 +74,19 @@ dependencies { implementation "androidx.cardview:cardview:1.0.0" +// PictureSelector + // PictureSelector 基础 (必须) + implementation 'io.github.lucksiege:pictureselector:v3.10.2' + // 图片压缩 (按需引入) + implementation 'io.github.lucksiege:compress:v3.10.2' + // 自定义相机 (按需引入) + implementation 'io.github.lucksiege:camerax:v3.10.2' +// api 'io.github.lucksiege:pictureselector:v2.7.3-rc05' + + + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cd4f9cd..46bb642 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,6 +10,15 @@ + + + + + + + + + + > @@ -52,6 +61,20 @@ + requestLegacyExternalStorage=true + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/android/activity/LoginActivity.java b/app/src/main/java/com/android/activity/LoginActivity.java index 55302cf..67bd347 100644 --- a/app/src/main/java/com/android/activity/LoginActivity.java +++ b/app/src/main/java/com/android/activity/LoginActivity.java @@ -110,6 +110,7 @@ public class LoginActivity extends AppCompatActivity implements LoginListener, V Intent intent = new Intent(LoginActivity.this,HomePageActivity.class); //发送登录的用户信息 EventBus.getDefault().postSticky(responseData); + startActivity(intent); }else { Log.e("login",responseData.getMsg()); diff --git a/app/src/main/java/com/android/activity/fragment/PublishProductFragment.java b/app/src/main/java/com/android/activity/fragment/PublishProductFragment.java index ad13358..461b8a5 100644 --- a/app/src/main/java/com/android/activity/fragment/PublishProductFragment.java +++ b/app/src/main/java/com/android/activity/fragment/PublishProductFragment.java @@ -1,48 +1,71 @@ package com.android.activity.fragment; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; import android.os.Bundle; import androidx.fragment.app.Fragment; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.android.R; +import com.android.activity.HomePageActivity; +import com.android.bean.Good; +import com.android.bean.ImageBean; +import com.android.bean.ResponseData; +import com.android.bean.User; +import com.android.databinding.FragmentPublishPageBinding; +import com.android.model.upload.UpListener; +import com.android.model.upload.UpModelimpl; +import com.android.utils.FileUtil; +import com.android.utils.GlideEngine; +import com.android.utils.ToastUtil; +import com.luck.picture.lib.basic.PictureSelector; +import com.luck.picture.lib.config.SelectMimeType; +import com.luck.picture.lib.engine.CompressFileEngine; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.interfaces.OnKeyValueResultCallbackListener; +import com.luck.picture.lib.interfaces.OnResultCallbackListener; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.RequestBody; +import top.zibin.luban.Luban; +import top.zibin.luban.OnCompressListener; +import top.zibin.luban.OnNewCompressListener; /** * A simple {@link Fragment} subclass. * create an instance of this fragment. */ -public class PublishProductFragment extends Fragment { - - // TODO: Rename parameter arguments, choose names that match - // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER - private static final String ARG_PARAM1 = "param1"; - private static final String ARG_PARAM2 = "param2"; - - // TODO: Rename and change types of parameters - private String mParam1; - private String mParam2; +public class PublishProductFragment extends Fragment implements View.OnClickListener, UpListener { + private FragmentPublishPageBinding binding; + private UpModelimpl upModelimpl; + private List fileArrayList; + private ImageBean imageBean; + private Good goods; + private User user; public PublishProductFragment() { // Required empty public constructor } - /** - * Use this factory method to create a new instance of - * this fragment using the provided parameters. - * - * @param param1 Parameter 1. - * @param param2 Parameter 2. - * @return A new instance of fragment ShopPageFragment. - */ - // TODO: Rename and change types and number of parameters - public static PublishProductFragment newInstance(String param1, String param2) { + + public static PublishProductFragment newInstance() { PublishProductFragment fragment = new PublishProductFragment(); Bundle args = new Bundle(); - args.putString(ARG_PARAM1, param1); - args.putString(ARG_PARAM2, param2); fragment.setArguments(args); return fragment; } @@ -50,16 +73,137 @@ public class PublishProductFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + EventBus.getDefault().register(this); + + upModelimpl = new UpModelimpl(); if (getArguments() != null) { - mParam1 = getArguments().getString(ARG_PARAM1); - mParam2 = getArguments().getString(ARG_PARAM2); } } + @Override + public void onDestroy() { + EventBus.getDefault().unregister(this); + super.onDestroy(); + } + + //通过Eventbus获取用户 + @Subscribe(threadMode = ThreadMode.MAIN,sticky = true) + public void getUser(ResponseData responseData){ + this.user = responseData.getData(); + } + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_publish_page, container, false); + binding = FragmentPublishPageBinding.inflate(inflater, container, false); + View view = binding.getRoot(); + + binding.btnRelease.setOnClickListener(this); + binding.btnAddImage.setOnClickListener(this); +// binding. + + return view; + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + binding = null; + } + + @Override + public void onClick(View v) { + switch (v.getId()){ + case R.id.btn_release: + Log.e("1","发布按钮点击"); + publishGoods(); + + break; + case R.id.btn_add_image: + getPicture(); + break; + + + } + } + + //发布商品 + private void publishGoods() { + goods = new Good(); + + goods.setAddr(binding.etAddr.getText().toString()); + goods.setContent(binding.etContent.getText().toString()); + Log.e("1",imageBean.getImageCode().toString()); + if (imageBean == null){ + ToastUtil.showMsg(getActivity(),"请先上传图片"); + return; + } + + goods.setImageCode(imageBean.getImageCode()); + goods.setPrice(Integer.parseInt(binding.etPrice.getText().toString())); + goods.setTypeId(Integer.parseInt(binding.etGoodsType.getText().toString())); + goods.setTypeName(binding.etGoodsTypeName.getText().toString()); + goods.setUserId(user.getId()); + + upModelimpl.addGoods(goods,this); + + } + + //获取相册图片 + public void getPicture(){ + PictureSelector.create(getActivity()) + .openGallery(SelectMimeType.ofImage()) + .setImageEngine(GlideEngine.createGlideEngine()) + .isOriginalControl(true) + .forResult(new OnResultCallbackListener() { + @Override + public void onResult(ArrayList result) { + fileArrayList = new ArrayList<>(); + for (int i = 0; i < result.size(); i++) { + String imgPath = result.get(i).getRealPath(); + File file = new File(imgPath); + + //参数添加 + MultipartBody.Builder builder = + new MultipartBody.Builder() + .setType(MultipartBody.FORM); + + RequestBody requestFile = + RequestBody.create(MediaType.parse("image/png"), file);//文件形式 + + builder.addFormDataPart("fileList", file.getName(), requestFile); + fileArrayList = builder.build().parts(); + } + updateImage(fileArrayList); + } + + @Override + public void onCancel() { + + } + }); + } + + //上传 + private void updateImage(List parts) { + upModelimpl.UpImage(parts,this); + } + + @Override + public void upImageOnSuccess(ResponseData responseData) { + imageBean = responseData.getData(); + Log.e("str",String.valueOf(imageBean.getImageCode())); + + + } + + @Override + public void addGoodsOnSuccess(ResponseData responseData) { + this.goods = responseData.getData(); + if (responseData.getCode() == 200){ +// ToastUtil.showMsg(getActivity(),"发布成功,即将跳转页面"); + Intent intent = new Intent(getActivity(), HomePageActivity.class); + startActivity(intent); + } } } \ No newline at end of file diff --git a/app/src/main/java/com/android/bean/Good.java b/app/src/main/java/com/android/bean/Good.java index 292a6ab..8d09151 100644 --- a/app/src/main/java/com/android/bean/Good.java +++ b/app/src/main/java/com/android/bean/Good.java @@ -24,9 +24,25 @@ public class Good implements Serializable { private Integer status; private Long tUserId; private Long tuserId; + private Long userId; private Integer typeId; private List array; + public void setImageUrlList(List imageUrlList) { + this.imageUrlList = imageUrlList; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Good() { + } + protected Good(Parcel in) { addr = in.readString(); appKey = in.readString(); diff --git a/app/src/main/java/com/android/bean/ImageBean.java b/app/src/main/java/com/android/bean/ImageBean.java new file mode 100644 index 0000000..666930f --- /dev/null +++ b/app/src/main/java/com/android/bean/ImageBean.java @@ -0,0 +1,36 @@ +package com.android.bean; + +import com.google.gson.annotations.SerializedName; + +import java.util.ArrayList; + +public class ImageBean { + @SerializedName("imageCode") + private Long imageCode; + @SerializedName("imageUrlList") + private ArrayList imageUrlList; + + public ImageBean(Long imageCode, ArrayList imageUrlList) { + this.imageCode = imageCode; + this.imageUrlList = imageUrlList; + } + + public ImageBean() { + } + + public Long getImageCode() { + return imageCode; + } + + public void setImageCode(Long imageCode) { + this.imageCode = imageCode; + } + + public ArrayList getImageUrlList() { + return imageUrlList; + } + + public void setImageUrlList(ArrayList imageUrlList) { + this.imageUrlList = imageUrlList; + } +} diff --git a/app/src/main/java/com/android/model/goods/GoodsHttp_interface.java b/app/src/main/java/com/android/model/goods/GoodsHttp_interface.java index fb8df8c..e58dd9b 100644 --- a/app/src/main/java/com/android/model/goods/GoodsHttp_interface.java +++ b/app/src/main/java/com/android/model/goods/GoodsHttp_interface.java @@ -4,12 +4,16 @@ import com.android.bean.GoodRecords; import com.android.bean.GoodsType; import com.android.bean.ResponseData; +import java.io.File; import java.util.List; import java.util.Map; import io.reactivex.rxjava3.core.Observable; import retrofit2.http.GET; import retrofit2.http.Headers; +import retrofit2.http.Multipart; +import retrofit2.http.POST; +import retrofit2.http.Part; import retrofit2.http.Query; import retrofit2.http.QueryMap; @@ -31,4 +35,6 @@ public interface GoodsHttp_interface { + + } diff --git a/app/src/main/java/com/android/model/upload/UpHttp_interface.java b/app/src/main/java/com/android/model/upload/UpHttp_interface.java new file mode 100644 index 0000000..01d4171 --- /dev/null +++ b/app/src/main/java/com/android/model/upload/UpHttp_interface.java @@ -0,0 +1,29 @@ +package com.android.model.upload; + +import com.android.bean.Good; +import com.android.bean.ImageBean; +import com.android.bean.ResponseData; + +import java.io.File; +import java.util.List; + +import io.reactivex.rxjava3.core.Observable; +import okhttp3.MultipartBody; +import retrofit2.http.Body; +import retrofit2.http.Headers; +import retrofit2.http.Multipart; +import retrofit2.http.POST; +import retrofit2.http.Part; + +public interface UpHttp_interface { + @Multipart + @POST("tran/image/upload") + @Headers({"appId:b34ac21286ae45938add627b418a4871", + "appSecret:67526def9de11d4a64f5e80e60ed3372eea69"}) + Observable> sendUpImage(@Part List fileList); + + @POST("tran/goods/add") + @Headers({"appId:b34ac21286ae45938add627b418a4871", + "appSecret:67526def9de11d4a64f5e80e60ed3372eea69"}) + Observable> sendAddGoods(@Body Good goods); +} diff --git a/app/src/main/java/com/android/model/upload/UpListener.java b/app/src/main/java/com/android/model/upload/UpListener.java new file mode 100644 index 0000000..fa46958 --- /dev/null +++ b/app/src/main/java/com/android/model/upload/UpListener.java @@ -0,0 +1,13 @@ +package com.android.model.upload; + +import com.android.bean.Good; +import com.android.bean.ImageBean; +import com.android.bean.ResponseData; + +import java.io.File; +import java.util.List; + +public interface UpListener { + void upImageOnSuccess(ResponseData responseData); + void addGoodsOnSuccess(ResponseData responseData); +} diff --git a/app/src/main/java/com/android/model/upload/UpModel.java b/app/src/main/java/com/android/model/upload/UpModel.java new file mode 100644 index 0000000..94dffc3 --- /dev/null +++ b/app/src/main/java/com/android/model/upload/UpModel.java @@ -0,0 +1,13 @@ +package com.android.model.upload; + +import com.android.bean.Good; + +import java.util.List; + +import okhttp3.MultipartBody; + +public interface UpModel { + void UpImage (List parts, final UpListener upListener); + void addGoods (Good good, final UpListener upListener); + +} diff --git a/app/src/main/java/com/android/model/upload/UpModelimpl.java b/app/src/main/java/com/android/model/upload/UpModelimpl.java new file mode 100644 index 0000000..35982b9 --- /dev/null +++ b/app/src/main/java/com/android/model/upload/UpModelimpl.java @@ -0,0 +1,101 @@ +package com.android.model.upload; + +import android.util.Log; + +import com.android.bean.Good; +import com.android.bean.ImageBean; +import com.android.bean.ResponseData; +import com.android.utils.constraint.Constants; + +import java.io.File; +import java.util.List; + +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; +import io.reactivex.rxjava3.annotations.NonNull; +import io.reactivex.rxjava3.core.Observable; +import io.reactivex.rxjava3.core.Observer; +import io.reactivex.rxjava3.disposables.Disposable; +import io.reactivex.rxjava3.schedulers.Schedulers; +import okhttp3.MultipartBody; +import retrofit2.Retrofit; +import retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory; +import retrofit2.converter.gson.GsonConverterFactory; + +public class UpModelimpl implements UpModel{ + + @Override + public void UpImage(List parts,final UpListener upListener) { + Retrofit retrofit = new Retrofit.Builder() + .baseUrl(Constants.BASE_URL) + .addConverterFactory(GsonConverterFactory.create()) + .addCallAdapterFactory(RxJava3CallAdapterFactory.create()) + .build(); + + UpHttp_interface anInterface = retrofit.create(UpHttp_interface.class); + Observable> observable = anInterface.sendUpImage(parts); + + observable.observeOn(Schedulers.io()) + .subscribeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + + + } + + @Override + public void onNext(@NonNull ResponseData listResponseData) { + upListener.upImageOnSuccess(listResponseData); + Log.e("图片返回",listResponseData.getMsg()); + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("onerror",e.toString()); + } + + @Override + public void onComplete() { + + } + }); + + } + + @Override + public void addGoods(Good good, UpListener upListener) { + Retrofit retrofit = new Retrofit.Builder() + .baseUrl(Constants.BASE_URL) + .addConverterFactory(GsonConverterFactory.create()) + .addCallAdapterFactory(RxJava3CallAdapterFactory.create()) + .build(); + + UpHttp_interface httpInterface = retrofit.create(UpHttp_interface.class); + Observable> observable = httpInterface.sendAddGoods(good); + + observable.observeOn(Schedulers.io()) + .subscribeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + + } + + @Override + public void onNext(@NonNull ResponseData goodResponseData) { + Log.e("发布商品",goodResponseData.getMsg()); + upListener.addGoodsOnSuccess(goodResponseData); + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("1",e.toString()); + } + + @Override + public void onComplete() { + + } + }); + } +} diff --git a/app/src/main/java/com/android/utils/FileUtil.java b/app/src/main/java/com/android/utils/FileUtil.java new file mode 100644 index 0000000..1cedad7 --- /dev/null +++ b/app/src/main/java/com/android/utils/FileUtil.java @@ -0,0 +1,171 @@ +package com.android.utils; + + + +import android.content.ContentUris; +import android.content.Context; +import android.database.Cursor; +import android.net.Uri; +import android.os.Build; +import android.os.Environment; +import android.provider.DocumentsContract; +import android.provider.MediaStore; + +import androidx.annotation.RequiresApi; + +import java.io.File; + +/** + * 文件工具类 + */ +public class FileUtil { + + + /** + * 专为Android4.4设计的从Uri获取文件绝对路径,以前的方法已不好使 + */ + @RequiresApi(api = Build.VERSION_CODES.KITKAT) + public static String getPath(final Context context, final Uri uri) { + + final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; + + // DocumentProvider + if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { + // ExternalStorageProvider + //一些三方的文件浏览器会进入到这个方法中,例如ES + //QQ文件管理器不在此列 + if (isExternalStorageDocument(uri)) { + final String docId = DocumentsContract.getDocumentId(uri); + final String[] split = docId.split(":"); + final String type = split[0]; + + if ("primary".equalsIgnoreCase(type)) { + return Environment.getExternalStorageDirectory() + "/" + split[1]; + } + } + // DownloadsProvider + else if (isDownloadsDocument(uri)) { + final String id = DocumentsContract.getDocumentId(uri); + // 不同系统获取的id开头可能不一样,在这后面便是真实的地址 + if (id.startsWith("msf:")) { + return id.replaceFirst("msf:", ""); + } + final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); + + return getDataColumn(context, contentUri, null, null); + } + // MediaProvider + else if (isMediaDocument(uri)) { + final String docId = DocumentsContract.getDocumentId(uri); + final String[] split = docId.split(":"); + final String type = split[0]; + + Uri contentUri = null; + if ("image".equals(type)) { + contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; + } else if ("video".equals(type)) { + contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; + } else if ("audio".equals(type)) { + contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; + } + + final String selection = "_id=?"; + final String[] selectionArgs = new String[]{split[1]}; + + return getDataColumn(context, contentUri, selection, selectionArgs); + } + } else if ("content".equalsIgnoreCase(uri.getScheme())) {// MediaStore (and general) + // Return the remote address + if (isGooglePhotosUri(uri)) + return uri.getLastPathSegment(); + + + if (isQQMediaDocument(uri)) { + String path = uri.getPath(); + File fileDir = Environment.getExternalStorageDirectory(); + File file = new File(fileDir, path.substring("/QQBrowser".length(), path.length())); + return file.exists() ? file.toString() : null; + } + + return getDataColumn(context, uri, null, null); + } else if ("file".equalsIgnoreCase(uri.getScheme())) {// File + + return uri.getPath(); + } + return null; + } + + /** + * Get the value of the data column for this Uri. This is useful for + * MediaStore Uris, and other file-based ContentProviders. + * + * @param context The context. + * @param uri The Uri to query. + * @param selection (Optional) Filter used in the query. + * @param selectionArgs (Optional) Selection arguments used in the query. + * @return The value of the _data column, which is typically a file path. + */ + public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { + + Cursor cursor = null; + final String column = MediaStore.MediaColumns.DATA; + final String[] projection = {column}; + try { + cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); + if (cursor != null && cursor.moveToFirst()) { + final int column_index = cursor.getColumnIndexOrThrow(column); + return cursor.getString(column_index); + } + } finally { + if (cursor != null) + cursor.close(); + } + return null; + } + + + /** + * @param uri The Uri to check. + * @return Whether the Uri authority is ExternalStorageProvider. + */ + public static boolean isExternalStorageDocument(Uri uri) { + return "com.android.externalstorage.documents".equals(uri.getAuthority()); + } + + /** + * @param uri The Uri to check. + * @return Whether the Uri authority is DownloadsProvider. + */ + public static boolean isDownloadsDocument(Uri uri) { + return "com.android.providers.downloads.documents".equals(uri.getAuthority()); + } + + /** + * @param uri The Uri to check. + * @return Whether the Uri authority is MediaProvider. + */ + public static boolean isMediaDocument(Uri uri) { + return "com.android.providers.media.documents".equals(uri.getAuthority()); + } + + + /** + * 使用第三方qq文件管理器打开 + * + * @param uri + * @return + */ + public static boolean isQQMediaDocument(Uri uri) { + return "com.tencent.mtt.fileprovider".equals(uri.getAuthority()); + } + + /** + * @param uri The Uri to check. + * @return Whether the Uri authority is Google Photos. + */ + public static boolean isGooglePhotosUri(Uri uri) { + return "com.google.android.apps.photos.content".equals(uri.getAuthority()); + } + +} + diff --git a/app/src/main/java/com/android/utils/GlideEngine.java b/app/src/main/java/com/android/utils/GlideEngine.java new file mode 100644 index 0000000..ee0526e --- /dev/null +++ b/app/src/main/java/com/android/utils/GlideEngine.java @@ -0,0 +1,156 @@ +package com.android.utils; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.drawable.Drawable; +import android.widget.ImageView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.android.R; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.resource.bitmap.CenterCrop; +import com.bumptech.glide.load.resource.bitmap.RoundedCorners; +import com.bumptech.glide.request.target.CustomTarget; +import com.bumptech.glide.request.transition.Transition; +import com.luck.picture.lib.engine.ImageEngine; +import com.luck.picture.lib.interfaces.OnCallbackListener; +import com.luck.picture.lib.utils.ActivityCompatHelper; + + +/** + * @author:luck + * @date:2019-11-13 17:02 + * @describe:Glide加载引擎 + */ +public class GlideEngine implements ImageEngine { + + /** + * 加载图片 + * + * @param context 上下文 + * @param url 资源url + * @param imageView 图片承载控件 + */ + @Override + public void loadImage(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return; + } + Glide.with(context) + .load(url) + .into(imageView); + } + + /** + * 加载指定url并返回bitmap + * + * @param context 上下文 + * @param url 资源url + * @param maxWidth 资源最大加载尺寸 + * @param maxHeight 资源最大加载尺寸 + * @param call 回调接口 + */ + @Override + public void loadImageBitmap(@NonNull Context context, @NonNull String url, int maxWidth, int maxHeight, OnCallbackListener call) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return; + } + Glide.with(context) + .asBitmap() + .override(maxWidth, maxHeight) + .load(url) + .into(new CustomTarget() { + + @Override + public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition transition) { + if (call != null) { + call.onCall(resource); + } + } + + @Override + public void onLoadFailed(@Nullable Drawable errorDrawable) { + if (call != null) { + call.onCall(null); + } + } + + @Override + public void onLoadCleared(@Nullable Drawable placeholder) { + + } + + }); + } + + /** + * 加载相册目录封面 + * + * @param context 上下文 + * @param url 图片路径 + * @param imageView 承载图片ImageView + */ + @Override + public void loadAlbumCover(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return; + } + Glide.with(context) + .asBitmap() + .load(url) + .override(180, 180) + .sizeMultiplier(0.5f) + .transform(new CenterCrop(), new RoundedCorners(8)) + .placeholder(R.drawable.custom_rc_divider) + .into(imageView); + } + + + /** + * 加载图片列表图片 + * + * @param context 上下文 + * @param url 图片路径 + * @param imageView 承载图片ImageView + */ + @Override + public void loadGridImage(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) { + if (!ActivityCompatHelper.assertValidRequest(context)) { + return; + } + Glide.with(context) + .load(url) + .override(200, 200) + .centerCrop() + .placeholder(R.drawable.custom_rc_divider) + .into(imageView); + } + + @Override + public void pauseRequests(Context context) { + Glide.with(context).pauseRequests(); + } + + @Override + public void resumeRequests(Context context) { + Glide.with(context).resumeRequests(); + } + + private GlideEngine() { + } + + private static GlideEngine instance; + + public static GlideEngine createGlideEngine() { + if (null == instance) { + synchronized (GlideEngine.class) { + if (null == instance) { + instance = new GlideEngine(); + } + } + } + return instance; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/android/utils/watcher/MyWatcher.java b/app/src/main/java/com/android/utils/watcher/MyWatcher.java index d89910d..94d348c 100644 --- a/app/src/main/java/com/android/utils/watcher/MyWatcher.java +++ b/app/src/main/java/com/android/utils/watcher/MyWatcher.java @@ -23,6 +23,15 @@ public class MyWatcher implements TextWatcher { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { + //当号码大于11位时显示按钮 + if(s.length()>=11){ + getVerificationCode.setEnabled(true); + //注册按钮 + registerButton.setOnClickListener(loginActivity); + } + else { + getVerificationCode.setEnabled(false); + } } diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 4570e1e..de69f38 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -71,6 +71,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignBaseline="@id/bt_getCode" + android:text="936760" android:layout_gravity="center" /> diff --git a/app/src/main/res/layout/fragment_publish_page.xml b/app/src/main/res/layout/fragment_publish_page.xml index f663d13..1473800 100644 --- a/app/src/main/res/layout/fragment_publish_page.xml +++ b/app/src/main/res/layout/fragment_publish_page.xml @@ -12,17 +12,17 @@ android:orientation="vertical" android:padding="10dp"> @@ -33,16 +33,73 @@ android:background="@drawable/addimageiv" android:layout_width="100dp" android:layout_height="100dp"/> + + + + + + + + + + + + + + + + + -