如何恢复在 PDF 视图中加载的最后一页?

How to restore the last page was loaded in a PDF View?

我是一名开发新手,这是我遇到的第一个问题 post。

我的应用程序展示了一本 PDF 电子书,我使用了这个图书馆:

com.github.barteksc:android-pdf-viewer:2.8.2

当我重新打开我的应用程序时,pdfView 加载第一页“pageNumber=0”,我希望它加载我离开它的最后一页。

我发现大多数解决方案都是针对此问题在 SO 上提出的,但对我来说没有任何效果。

我认为有一个简单的解决方案,比如使用:

SavedPage = pdfView.getCurrentPage()onSavedInstanceState 内,然后在 onCreate.

内恢复那个整数

但是我不知道该怎么做。所以,如果你能指导我使用最简单的方法让我的 pdfView 加载我正在阅读的最后一页,那就太好了。

这是我阅读的代码Activity:

package com.turquoise.jeebalalhasanat;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import com.github.barteksc.pdfviewer.PDFView;
import com.github.barteksc.pdfviewer.listener.OnLoadCompleteListener;
import com.github.barteksc.pdfviewer.listener.OnPageChangeListener;
import com.github.barteksc.pdfviewer.scroll.DefaultScrollHandle;
import com.shockwave.pdfium.PdfDocument;
import java.util.List;

public class ReadingActivity extends Activity implements OnPageChangeListener,OnLoadCompleteListener {

    private static final String TAG = ReadingActivity.class.getSimpleName();
    public static final String PDF_FILE = "my_book.pdf";

    PDFView pdfView ;
    Integer pageNumber;
    String pdfFileName;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_reading);

        pdfView = (PDFView)findViewById(R.id.pdfView);
        displayFromAsset(PDF_FILE);
    }

    private void displayFromAsset(String assetFileName) {
        pdfFileName = assetFileName;

        pdfView.fromAsset(PDF_FILE)
                .defaultPage(pageNumber)
                .enableSwipe(true)
                .swipeHorizontal(false)
                .onPageChange(this)
                .enableAnnotationRendering(true)
                .onLoad(this)
                .scrollHandle(new DefaultScrollHandle(this))
                .load();
        }

    @Override
    public void onPageChanged(int page, int pageCount) {

        pageNumber = page;
        setTitle(String.format("%s %s / %s", pdfFileName, page + 1, pageCount));

    }

    @Override
    public void loadComplete(int nbPages) {
        PdfDocument.Meta meta = pdfView.getDocumentMeta();
        printBookmarksTree(pdfView.getTableOfContents(), "-");

    }

    public void printBookmarksTree(List<PdfDocument.Bookmark> tree, String sep) {
        for (PdfDocument.Bookmark b : tree) {

            Log.e(TAG, String.format("%s %s, p %d", sep, b.getTitle(), b.getPageIdx()));

            if (b.hasChildren()) {
                printBookmarksTree(b.getChildren(), sep + "-");
            }
        }
    }

感谢任何帮助!

感谢上帝,我找到了解决方案! Android Google 的开发者文档将仍然是开发者最好的朋友。

我想分享它,以帮助每个需要帮助解决此问题的初学者开发人员。

以下是恢复在 PDF 视图中加载的最后一页的方法: 第一步:在 activity:

中声明一个 Integer 变量
Integer savedPage;

第二步:在 onStop() 内部:

@Override
protected void onStop() {
    super.onStop();


savedPage = pdfView.getCurrentPage();

\ create a shared preference file

    SharedPreferences mySharedPreferences = getPreferences(Context.MODE_PRIVATE);


\ to write to this shared preference file

    SharedPreferences.Editor myEditor = mySharedPreferences.edit();



\ store the page number you left it 

    myEditor.putInt("retrievedPage",savedPage);



\ to save changes

 myEditor.apply();



}

第三步:在onCreate()里面:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_reading);


\ To retrieve the  number of the last page from your shared preferences file

 SharedPreferences mySharedPreferences = getPreferences(Context.MODE_PRIVATE);

savedPage = mySharedPreferences.getInt("retrievedPage",0);

    pageNumber = savedPage;
}

这是完整的 activity 代码:

import android.os.Bundle;
import android.util.Log;
import com.github.barteksc.pdfviewer.PDFView;
import com.github.barteksc.pdfviewer.listener.OnLoadCompleteListener;
import com.github.barteksc.pdfviewer.listener.OnPageChangeListener;
import com.github.barteksc.pdfviewer.scroll.DefaultScrollHandle;
import com.shockwave.pdfium.PdfDocument;
import java.util.List;






public class ReadingActivity extends Activity  implements OnPageChangeListener,OnLoadCompleteListener {


    private static final String TAG = ReadingActivity.class.getSimpleName();
    public static final String PDF_FILE = "my_book.pdf";


    PDFView pdfView ;
    Integer pageNumber;
    String pdfFileName;

Integer currentPageNumber;
Integer savedPage;







    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_reading);






SharedPreferences mySharedPreferences = getPreferences(Context.MODE_PRIVATE);

savedPage = mySharedPreferences.getInt("retrievedPage",0);

pageNumber = savedPage;







        pdfView = (PDFView)findViewById(R.id.pdfView);
        displayFromAsset(PDF_FILE);


    }










    private void displayFromAsset(String assetFileName) {
        pdfFileName = assetFileName;

        pdfView.fromAsset(PDF_FILE)
                .defaultPage(pageNumber)
                .enableSwipe(true)
                .swipeHorizontal(false)
                .onPageChange(this)
                .enableAnnotationRendering(true)
                .onLoad(this)
                .scrollHandle(new DefaultScrollHandle(this))
                .load();




        }





    @Override
    public void onPageChanged(int page, int pageCount) {

        pageNumber = page;
        setTitle(String.format("%s %s / %s", pdfFileName, page + 1, pageCount));

            }




    @Override
    public void loadComplete(int nbPages) {
        PdfDocument.Meta meta = pdfView.getDocumentMeta();
        printBookmarksTree(pdfView.getTableOfContents(), "-");

    }


    public void printBookmarksTree(List<PdfDocument.Bookmark> tree, String sep) {
        for (PdfDocument.Bookmark b : tree) {

            Log.e(TAG, String.format("%s %s, p %d", sep, b.getTitle(), b.getPageIdx()));

            if (b.hasChildren()) {
                printBookmarksTree(b.getChildren(), sep + "-");
            }
        }
    }



@Override
protected void onStop() {
    super.onStop();

    SharedPreferences mySharedPreferences = getPreferences(Context.MODE_PRIVATE);
    SharedPreferences.Editor myEditor = mySharedPreferences.edit();


savedPage = pdfView.getCurrentPage();
myEditor.putInt("retrievedPage",savedPage);
myEditor.apply();


}

}

现在你应该实现你的目标了。快乐编码^^!

如果我只有一本书,这将非常有效。 如果我在单个应用程序中有多本书怎么办?如何恢复这些书的页面? 通过在 OnpageChanged 方法

中使用这段代码,我找到了这个问题的完美答案
   SharedPreferences.Editor editor = getSharedPreferences("shared", MODE_PRIVATE).edit();
    switch(BookId){
        case 1:
            arr[0]=page;
            setTitle(String.format("%s %s / %s", pdfFileName, page + 1, pageCount));
            editor.putInt("id1", arr[0]);
            editor.apply();
            break;

    case 2:
        arr[1]=page;
        setTitle(String.format("%s %s / %s", pdfFileName, page + 1, pageCount));
        editor.putInt("id2", arr[1]);
        editor.apply();
            break;


//add cases as the numbers of Books or use ( for Loop )
}

这对我有用,任何问题评论我都会回答

对于多本书,您需要有每本书的唯一标识符。如果书名是唯一的,你可以使用它。否则你必须有这本书的 ID。

获取 ID 后,您需要将其用作将页码保存到共享首选项中的键。这使您可以简单地使用唯一标识符从共享首选项中查询上次保存的页面。