2016-07-12 19 views
2

私はPDFレンダリングを行っていますが、「フォーマット文字列は有効なフォーマットではありません」というエラーメッセージが表示されます。私がこれまで持っているコードは次のとおりです。不適切な文字列フォーマット

import android.app.Fragment; 
import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.pdf.PdfRenderer; 
import android.os.Bundle; 
import android.os.ParcelFileDescriptor; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.ImageView; 

import java.io.IOException; 

/** 

*/ 
public class PDFRenderFragment extends android.support.v4.app.Fragment { 

    private ParcelFileDescriptor fileDescriptor; 
    private PdfRenderer pdfRenderer; 
    private PdfRenderer.Page currentPage; 
    private ImageView image; 
    private Button btnPrevious; 
    private Button btnNext; 

    public PDFRenderFragment() { 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.fragment_pdfrender, container, false); 
    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     // Retain view references. 
     image = (ImageView) view.findViewById(R.id.image); 
     btnPrevious = (Button) view.findViewById(R.id.btn_previous); 
     btnNext = (Button) view.findViewById(R.id.btn_next); 

     //set buttons event 
     btnPrevious.setOnClickListener(onActionListener(-1)); //previous button clicked 
     btnNext.setOnClickListener(onActionListener(1)); //next button clicked 

     int index = 0; 
     // If there is a savedInstanceState (screen orientations, etc.), we restore the page index. 
     if (null != savedInstanceState) { 
      index = savedInstanceState.getInt("current_page", 0); 
     } 
     showPage(index); 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
      openRenderer(activity); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      Log.i("Fragment", "Error occurred!"); 
      Log.e("Fragment", e.getMessage()); 
      activity.finish(); 
     } 
    } 

    @Override 
    public void onDestroy() { 
     try { 
      closeRenderer(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     super.onDestroy(); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     if (null != currentPage) { 
      outState.putInt("current_page", currentPage.getIndex()); 
     } 
    } 

    /** 
    * Create a PDF renderer 
    * @param activity 
    * @throws IOException 
    */ 
    private void openRenderer(Activity activity) throws IOException { 
     // Reading a PDF file from the assets directory. 
     fileDescriptor = activity.getAssets().openFd("*****.pdf").getParcelFileDescriptor(); 

     // This is the PdfRenderer we use to render the PDF. 
     pdfRenderer = new PdfRenderer(fileDescriptor); 
    } 

    /** 
    * Closes PdfRenderer and related resources. 
    */ 
    private void closeRenderer() throws IOException { 
     if (null != currentPage) { 
      currentPage.close(); 
     } 
     pdfRenderer.close(); 
     fileDescriptor.close(); 
    } 

    /** 
    * Shows the specified page of PDF file to screen 
    * @param index The page index. 
    */ 
    private void showPage(int index) { 
     if (pdfRenderer.getPageCount() <= index) { 
      return; 
     } 
     // Make sure to close the current page before opening another one. 
     if (null != currentPage) { 
      currentPage.close(); 
     } 
     //open a specific page in PDF file 
     currentPage = pdfRenderer.openPage(index); 
     // Important: the destination bitmap must be ARGB (not RGB). 
     Bitmap bitmap = Bitmap.createBitmap(currentPage.getWidth(), currentPage.getHeight(), 
       Bitmap.Config.ARGB_8888); 
     // Here, we render the page onto the Bitmap. 
     currentPage.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY); 
     // showing bitmap to an imageview 
     image.setImageBitmap(bitmap); 
     updateUIData(); 
    } 

    /** 
    * Updates the state of 2 control buttons in response to the current page index. 
    */ 
    private void updateUIData() { 
     int index = currentPage.getIndex(); 
     int pageCount = pdfRenderer.getPageCount(); 
     btnPrevious.setEnabled(0 != index); 
     btnNext.setEnabled(index + 1 < pageCount); 
     getActivity().setTitle(getString(R.string.app_name , index + 1, pageCount)); 
    } 

    private View.OnClickListener onActionListener(final int i) { 
     return new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       if (i < 0) {//go to previous page 
        showPage(currentPage.getIndex() - 1); 
       } else { 
        showPage(currentPage.getIndex() + 1); 
       } 
      } 
     }; 
    } 
} 

と文字列ファイル内:

<string name="app_name">NewApp2</string> 

私が上げたエラーメッセージをどのように修正すればよいです。私はこれをすべて株式コードから取ったので、間違いはないはずです。文字列名を設定したので、文字列からアクティビティを開始できるはずです。これを解決する方法があれば教えてください!

+0

エラーメッセージgどちらの行がエラーを引き起こすかを示す – Jokab

答えて

2

タイトルにapp_nameindexpageCountの両方を表示したい場合は、としてそれを実行します。としてのstrings.xmlファイルに

1.変更文字列:

<string name="app_name">NewApp2 %1$d/%2$d </string> 

2.アクセスコード内の書式設定された文字列:

String strTitle= getString(R.string.app_name , index + 1, pageCount); 
getActivity().setTitle(strTitle); 
+0

だから私はそのような文字列名を置き換え、余分な行を追加するだけですか? – Desthstro

+0

@Desthstro:はい 'そのような文字列名を置き換える 'は必須ですが、余分な行は必要ありません。これはmakeコードを読みやすくするためのものです。あなたは現在やっているようにそれをすることができます。 –

関連する問題