0

私は3つのタブのタブレイアウトからなるアクティビティを持っています。各タブはフラグメントであり、それらのすべてにはさまざまなpdfファイルを表示するpdfビューが含まれています。非同期クラスからフラグメントのビューにアクセスするには?

私はPdf Viewer用のクラスを作成しました。その断片の中でpdfファイルを開くために、そのクラスを多数のフラグメントで呼び出す必要があります。しかし、私はコンテキストを適切に渡すことができず、そのフラグメントのPDFviewにアクセスできません。私はPDFviewerとしてC.pdfviewer.PDFViewを使用しています。ここで

は私のコードです:

MyFragment.class

public class MyFragment extends Fragment { 

PDFView pdfView; 
String url = "mysite.pdf"; 
public MyFragment() { 
    // Required empty public constructor 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_myfragment, container, false); 
    pdfView = (PDFView)view.findViewById(R.id.pdfViewer); 

    new RetrievePDFStream(this).execute(url); 

    return view; 
} 
} 

RetrievePDFStream.class

public class RetrievePDFStream extends AsyncTask<String, Void, byte[]> { 

public Fragment fContext; 
PDFView pdfView; 

public RetrievePDFStream(Fragment fContext) { 
    this.fContext = fContext; 
} 

@Override 
protected byte[] doInBackground(String... strings) { 
    InputStream inputStream = null; 
    try { 
     URL url = new URL(strings[0]); 
     HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
     if (urlConnection.getResponseCode() == 200) { 
      inputStream = new BufferedInputStream(urlConnection.getInputStream()); 
     } 
    } catch (IOException ex) { 
     return null; 
    } 
    try { 
     return IOUtils.toByteArray(inputStream); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return null; 

} 

@Override 
protected void onPostExecute(byte[] inputStream) { 
    View view = fContext.getView(); 
    pdfView = (PDFView)view.findViewById(R.id.pdfViewer); 
    pdfView.fromBytes(inputStream).load(); 
} 
} 

MyFragment.xml

<LinearLayout 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" 
tools:context="app.nvest.helpinsure.Fragment.MyFragment" 
android:orientation="vertical" 
android:background="#000000"> 

<com.github.barteksc.pdfviewer.PDFView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/pdfViewer"/> 

</LinearLayout> 

答えて

0

コード以下のようにしてください。 Activitiesとは異なり

new RetrievePDFStream(getActivity()).execute(url); 
0

fragmentは異なるライフサイクルを持っています。あなたがフラグメントに関連する活動を返すgetActivityを()、使用することができます

new RetrievePDFStream(getActivity().execute(url)) 

new RetrievePDFStream(this).execute(url); //this 

:あなたのコード

でこれを交換してください。

+0

にあなたASYCコードを変更するには、私はすでにそれを試してみました。それは動作しませんでした – vinitpradhan18

+0

getActivity()。getBaseContext()。実行(URL)。それでも助けにならない場合は、ログを投稿してください – Zoffa

0

これを達成するには、コールバックメカニズムを使用します。以下のコードを使用してください。

public class MyFragment extends Fragment implements ApiResponseCallback { 

PDFView pdfView; 
String url = "mysite.pdf"; 
public MyFragment() { 
    // Required empty public constructor 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_myfragment, container, false); 
    pdfView = (PDFView)view.findViewById(R.id.pdfViewer); 

    new RetrievePDFStream(this).execute(url); 

    return view; 
} 
public void onByteArrayRecievedFromAPI(byte[] inputStream){ 
    pdfView = (PDFView)getView.findViewById(R.id.pdfViewer); 
    pdfView.fromBytes(inputStream).load(); 

} 
public interface ApiResponseCallback{ 
    void onByteArrayRecievedFromAPI(byte[] inputStream) 
} 
} 

そしてこの

public class RetrievePDFStream extends AsyncTask<String, Void, byte[]> { 

//public Fragment fContext; 
//Change to This 
public ApiResponseCallback callback; 
PDFView pdfView; 

public RetrievePDFStream(ApiResponseCallback callback) { 
    this.callback = callback; 
} 

@Override 
protected byte[] doInBackground(String... strings) { 
    InputStream inputStream = null; 
    try { 
     URL url = new URL(strings[0]); 
     HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
     if (urlConnection.getResponseCode() == 200) { 
      inputStream = new BufferedInputStream(urlConnection.getInputStream()); 
     } 
    } catch (IOException ex) { 
     return null; 
    } 
    try { 
     return IOUtils.toByteArray(inputStream); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return null; 

} 

@Override 
protected void onPostExecute(byte[] inputStream) { 
    if(callback!=null){ 
     callback.onByteArrayRecievedFromAPI(inputStream); 
    } 
} 
} 
+0

私のフラグメントクラスには、「循環継承が関係しています」というエラーがあります。また、ApiResponseCallbackインターフェイスは、フラグメントとRetrievePDFStreamクラスのMyFragment.ApiResponseCallbackとして実装されています。他のフラグメントからもRetrievePDFStreamクラスを呼び出すので、特定のフラグメントとは独立している必要があります。 – vinitpradhan18

+0

このコールバック用の新しいJavaファイルを作成して、必要に応じて使用できるようにしてください。 –

関連する問題