前言:真的沒什麼想寫的功能,佔個功能,套路一下吧。
效果圖:
涉及pdfView
/**pdfView**/
implementation 'com.github.barteksc:android-pdf-viewer:3.2.0-beta.1'
這裏吧 我也想用WebView,但是帶有.pdf的Url ios可以直接顯示,但是不能直接顯示,還還有改動一下服務器的,用pdfView 雖然好用,如果真的正式發佈的他有個缺點,到處apk 會變大。也想找能直接通過url顯示pdf的,最後我還是用了老方式,下載之後顯示。
涉及知識點,ListView 適配、監聽,動態申請讀寫權限,下載pdf文件,顯示pdf,我又覺得下載的過程中,空白頁面不太好,做了個動畫。
通過雲數據庫存儲數據,將pdf文件上傳到數據庫。題庫顯示界面通過ListView適配所有數據,點擊item跳轉PdfViewActivity界面,傳遞數據參數,通過Okgo下載在線pdf文件,下載過程中有動畫顯示,下載完成隱藏動畫,通過PdfView顯示pdf文件。
public class QuestionBankFragment extends BaseFragment {
@BindView(R.id.list_object)
ListView sujectListView;
List<Subject> mSubjectList = new ArrayList<>();
SubjectAdapter mSubjectAdapter;
public static Fragment getInstance() {
Fragment fragment = new QuestionBankFragment();
return fragment;
}
@Override
protected int contentViewID() {
return R.layout.fragment_question_bank;
}
@Override
protected void initialize() {
querySubject();
OnItemClick();
}
private void OnItemClick() {
sujectListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
if (mSubjectList == null){
return;
}
Subject subject = mSubjectList.get(i);
Bundle bundle = new Bundle();
bundle.putSerializable("subject",subject);
startActivity(PdfViewActivity.class, bundle);
}
});
}
private void querySubject() {
BmobQuery<Subject> subjectBmobQuery = new BmobQuery<Subject>();
subjectBmobQuery.findObjects(new FindListener<Subject>() {
@Override
public void done(List<Subject> object, BmobException e) {
if (e == null) {
mSubjectList = object;
mSubjectAdapter = new SubjectAdapter(getContext(),R.layout.item_subject, mSubjectList);
sujectListView.setAdapter(mSubjectAdapter);
} else {
ToastUtils.showShort(getContext(), getContext().getString(R.string.query_failure));
}
}
});
}
}
public class SubjectAdapter extends ArrayAdapter<Subject> {
private int resourceId;
public SubjectAdapter(@NonNull Context context, int resource, @NonNull List<Subject> objects) {
super(context, resource, objects);
resourceId = resource;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
Subject subject = getItem(position);
SubjectViewHolder viewHolder;
View view;
if (convertView == null){
view = LayoutInflater.from(getContext()).inflate(resourceId, null);
viewHolder = new SubjectViewHolder();
viewHolder.titleSuject = view.findViewById(R.id.title_subject);
viewHolder.rescSuject = view.findViewById(R.id.subject_desc);
viewHolder.imgSubject = view.findViewById(R.id.img_subject);
view.setTag(viewHolder);
}else {
view = convertView;
viewHolder = (SubjectViewHolder) view.getTag();
}
viewHolder.titleSuject.setText(subject.getTitle());
viewHolder.rescSuject.setText(subject.getDesc());
viewHolder.imgSubject.setImageURI(subject.getImages().getFileUrl());
return view;
}
class SubjectViewHolder {
TextView titleSuject;
TextView rescSuject;
SimpleDraweeView imgSubject ;
}
}
PdfViewActivity.java
public class PdfViewActivity extends BaseActivity {
public static final String TAG = "PdfViewActivity";
@BindView(R.id.pdfView)
PDFView mPDFView;
@BindView(R.id.img_pgbar)
ImageView imgPgbar;
private AnimationDrawable ad;
private static int REQUEST_CODE_CONTACT = 101;
private Subject subject;
OkGo mOkGo = OkGo.getInstance();
String[] permissions = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE};
@Override
protected int contentViewID() {
return R.layout.activity_pdf_view;
}
@Override
protected void initialize() {
setLeftBtnFinish();
ad = (AnimationDrawable) imgPgbar.getDrawable();
imgPgbar.postDelayed(new Runnable() {
@Override
public void run() {
ad.start();
}
}, 100);
Intent intent = getIntent();
subject = (Subject) intent.getSerializableExtra("subject");
setTopTitle(subject.getTitle(), true);
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, permissions, REQUEST_CODE_CONTACT);
}
}
showPdfView(subject);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE_CONTACT) {
for (int i = 0; i < permissions.length; i++) {
Log.i(TAG, "申請的權限爲:" + permissions[i] + ",申請結果:" + grantResults[i]);
}
showPdfView(subject);
}
}
private void showPdfView(Subject subject) {
if (subject == null){
return;
}
try {
final File file = new File(Environment.getExternalStorageDirectory() + File.separator + subject.getTitle());
if (!file.exists()) {
file.mkdirs();
}
String target = Environment.getExternalStorageDirectory() + File.separator + subject.getDesc() + ".pdf";
mOkGo.<File>get(subject.getPdfUrl().getFileUrl())
.execute(new FileCallback(target, subject.getDesc()) {
@Override
public void onSuccess(Response<File> response) {
LogUtils.d(TAG, "報告下載成功..." + response.body());
try {
mPDFView.fromFile(response.body())
.defaultPage(0)//默認展示第一頁
.load();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onFinish() {
super.onFinish();
imgPgbar.setVisibility(View.GONE);
}
@Override
public void onError(Response<File> response) {
super.onError(response);
LogUtils.e("下載失敗", response.message());
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
mOkGo.cancelTag(this);
}
}
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/color_ffffff"
tools:context=".activity.PdfViewActivity">
<com.github.barteksc.pdfviewer.PDFView
android:id="@+id/pdfView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<ImageView
android:id="@+id/img_pgbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|center_vertical"
android:src="@drawable/amin_pgbar"/>
</FrameLayout>