xml文件:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" android:padding="5dp" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="50dp" android:gravity="center_vertical" android:textSize="18sp" android:text="用户名"/> <TextView android:id="@+id/tv_name" android:layout_alignParentRight="true" android:layout_width="wrap_content" android:layout_height="50dp" android:gravity="center_vertical" android:textSize="18sp" android:text="XXX"/> <TextView android:layout_below="@id/tv_name" android:layout_width="wrap_content" android:layout_height="50dp" android:gravity="center_vertical" android:textSize="18sp" android:text="用户名"/> <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/sdv" android:layout_below="@id/tv_name" android:layout_alignParentRight="true" android:layout_width="50dp" android:layout_height="50dp" app:roundAsCircle="true" app:placeholderImage="@drawable/ic_launcher_foreground" android:scaleType="fitXY" android:gravity="center_vertical" android:textSize="18sp" android:text="XXX"/> </RelativeLayout>
popxml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/pop_paizhao" android:layout_width="match_parent" android:layout_height="50dp" android:layout_margin="5dp" android:textSize="18sp" android:text="拍照"/> <Button android:id="@+id/pop_xiangce" android:layout_width="match_parent" android:layout_height="50dp" android:layout_margin="5dp" android:textSize="18sp" android:text="相册"/> <Button android:id="@+id/pop_cancle" android:layout_width="match_parent" android:layout_height="50dp" android:layout_margin="5dp" android:textSize="18sp" android:text="取消"/> </LinearLayout>
activity
package myjd.jd.com.day20; import android.Manifest; import android.app.Activity; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.provider.MediaStore; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.PopupWindow; import android.widget.TextView; import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.drawee.view.SimpleDraweeView; import java.io.File; import java.io.FileNotFoundException; import butterknife.BindView; import butterknife.ButterKnife; import myjd.jd.com.day20.bean.HearderBean; import myjd.jd.com.day20.mvp.presenter.HearderPresenterImpl; import myjd.jd.com.day20.mvp.view.HearderView; public class MainActivity extends AppCompatActivity implements HearderView{ @BindView(R.id.tv_name) TextView tvName; @BindView(R.id.sdv) SimpleDraweeView sdv; private HearderPresenterImpl hearderPresenter; private PopupWindow pop; private File file1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Fresco.initialize(this); setContentView(R.layout.activity_main); ButterKnife.bind(this); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 200); } hearderPresenter = new HearderPresenterImpl(this); sdv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { pop = new PopupWindow(MainActivity.this); View view = View.inflate(MainActivity.this,R.layout.poplayout,null); pop.setWidth(ViewGroup.LayoutParams.MATCH_PARENT); pop.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); //只要不设置为空,点击外部可返回 pop.setBackgroundDrawable(new BitmapDrawable()); ///这里必须设置为true才能点击区域外或者消失 pop.setFocusable(true); //这个控制PopupWindow内部控件的点击事件 pop.setOutsideTouchable(true); pop.setContentView(view); Button bt1 = (Button) view.findViewById(R.id.pop_paizhao); Button bt2 = (Button) view.findViewById(R.id.pop_xiangce); Button bt3 = (Button) view.findViewById(R.id.pop_cancle); pop.showAtLocation(v, Gravity.BOTTOM, 0, 0); bt1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); bt2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent picture = new Intent( Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(picture, 1); pop.dismiss(); } }); bt3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { pop.dismiss(); } }); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 1 && resultCode == Activity.RESULT_OK && null != data) { Uri uri = data.getData(); file1 = getFileByUri(uri, MainActivity.this); Log.i("1TAG", "onActivityResult: "+file1); hearderPresenter.setData(); ContentResolver resolver = getContentResolver(); try { Bitmap bitmap = BitmapFactory.decodeStream(resolver.openInputStream(uri)); sdv.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } } } public static File getFileByUri(Uri uri, Context context) { String path = null; String[] proj = {MediaStore.Images.Media.DATA}; Cursor cursor = context.getContentResolver().query(uri, proj, null, null, null); if (cursor.moveToFirst()) { int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); path = cursor.getString(columnIndex); } cursor.close(); return new File(path); } @Override public void onError(String error) { Log.i("TAG", "onError: "+error); } @Override public void onSuccessful(HearderBean hearderBean) { Log.i("TAG", "onSuccessful: "+hearderBean.getMsg()); } @Override public File setFile() { return file1; } }
//接口:
package myjd.jd.com.day20.mvp.model; import myjd.jd.com.day20.bean.HearderBean; public interface GetDataState { void onSuccessful(HearderBean hearderBean); void onError(String error); }
model:
package myjd.jd.com.day20.mvp.model; import java.io.File; import myjd.jd.com.day20.bean.HearderBean; public interface HearderModel { void setData(File file,GetDataState getDataState); }
presenter:
package myjd.jd.com.day20.mvp.presenter; import java.io.File; import myjd.jd.com.day20.bean.HearderBean; import myjd.jd.com.day20.mvp.model.HearderModel; public interface HearderPresenter{ void setData(); void onDestory(); }
view:
package myjd.jd.com.day20.mvp.view; import java.io.File; import myjd.jd.com.day20.bean.HearderBean; import myjd.jd.com.day20.mvp.model.GetDataState; import myjd.jd.com.day20.mvp.model.HearderModel; public interface HearderView extends GetDataState{ @Override void onError(String error); @Override void onSuccessful(HearderBean hearderBean); File setFile(); }
model:
package myjd.jd.com.day20.mvp.model; import java.io.File; import myjd.jd.com.day20.bean.HearderBean; import myjd.jd.com.day20.service.Api; import myjd.jd.com.day20.service.GetInstance; import myjd.jd.com.day20.utils.RetrofitUtils; import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.OkHttpClient; import okhttp3.RequestBody; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; public class HearderModelImpl implements HearderModel{ @Override public void setData(File file, final GetDataState getDataState) { RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file); MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), requestBody); OkHttpClient okHttpClient=new OkHttpClient .Builder() .build(); RetrofitUtils.getInstance(Api.BAST,okHttpClient) .setCreate(GetInstance.class) .rxUpload("71",body) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<HearderBean>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(HearderBean hearderBean) { getDataState.onSuccessful(hearderBean); } }); } }
presenter:
package myjd.jd.com.day20.mvp.presenter; import android.view.View; import java.io.File; import myjd.jd.com.day20.MainActivity; import myjd.jd.com.day20.bean.HearderBean; import myjd.jd.com.day20.mvp.model.GetDataState; import myjd.jd.com.day20.mvp.model.HearderModel; import myjd.jd.com.day20.mvp.model.HearderModelImpl; import myjd.jd.com.day20.mvp.view.HearderView; import okhttp3.internal.framed.HeadersMode; public class HearderPresenterImpl implements HearderPresenter,GetDataState{ private HearderView hearderView; private HearderModel headersMode; public HearderPresenterImpl(HearderView hearderView) { this.hearderView=hearderView; headersMode=new HearderModelImpl(); } @Override public void onSuccessful(HearderBean hearderBean) { hearderView.onSuccessful(hearderBean); } @Override public void onError(String error) { hearderView.onError(error); } @Override public void setData() { headersMode.setData(hearderView.setFile(),this); } @Override public void onDestory() { hearderView=null; } }