从活动中获取数据到片段

时间:2017-04-04 19:37:46

标签: android android-intent android-activity fragment bundle

我想从活动中获取数据,但我不断收到此错误:

引起:java.lang.NullPointerException:尝试调用虚方法' java.lang.String android.os.Bundle.getString(java.lang.String)'在空对象引用上。

TrafficActivity.class(活动)

public class TrafficActivity extends AppCompatActivity {

public static final String FRAGMENT_PDF_RENDERER_BASIC = "pdf_renderer_basic";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_traffic);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_traffic);

    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(new Intent(TrafficActivity.this, IpuclariSayfasi.class));
        }
    });

    if (savedInstanceState == null)
    {
        getFragmentManager().beginTransaction()
                .add(R.id.container, new PdfRendererBasicFragment(), FRAGMENT_PDF_RENDERER_BASIC)
                .commit();
    }



  }}

PdfRendererBasicFragment.class(片段)

public class PdfRendererBasicFragment extends Fragment implements 
View.OnClickListener
 {
   private static final String O_ANKI_SAYFA_DURUMU = "guncel_sayfa_index";
   private ParcelFileDescriptor mFileDescriptor;
   private PdfRenderer mPdfRenderer;
   private PdfRenderer.Page mGuncelSayfa;
   private ImageView mImageView;
   private ImageButton mOncekiButon;
   private ImageButton mSonrakiButon;
   public static String FILENAME;

 public PdfRendererBasicFragment()
{

}

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

@Override
public void onClick(View view)
{
    switch (view.getId()) {
        case R.id.onceki: {
            //onceki sayfaya geç
            showPage(mGuncelSayfa.getIndex() - 1);
            break;
        }
        case R.id.sonraki: {
            // sonraki sayfaya geç
            showPage(mGuncelSayfa.getIndex() + 1);
            break;
        }
    }

}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    mImageView = (ImageView) view.findViewById(R.id.pdf_goruntusu);
    mOncekiButon = (ImageButton) view.findViewById(R.id.onceki);
    mSonrakiButon = (ImageButton) view.findViewById(R.id.sonraki);
    mOncekiButon.setOnClickListener(this);
    mSonrakiButon.setOnClickListener(this);
    int index = 0;
    if (null != savedInstanceState) {
        index = savedInstanceState.getInt(O_ANKI_SAYFA_DURUMU, 0);
    }
    showPage(index);
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    try {
        openRenderer(activity);
    } catch (IOException e) {
        e.printStackTrace();
        Toast.makeText(activity, "Beklenmedik hata: " + e.getMessage(), Toast.LENGTH_SHORT).show();
        activity.finish();
    }
}

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

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


private void openRenderer(Context context) throws IOException
{
    // bu ornekte, asset klasöründeki PDF'i okuyoruz.
    FILENAME= getArguments().getString("file_name");
    File file = new File(context.getCacheDir(), FILENAME);
    if (!file.exists())
    {
        InputStream asset = context.getAssets().open(FILENAME);
        FileOutputStream output = new FileOutputStream(file);
        final byte[] buffer = new byte[1024];
        int size;
        while ((size = asset.read(buffer)) != -1) {
            output.write(buffer, 0, size);
        }
        asset.close();
        output.close();
    }
    mFileDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
    mPdfRenderer = new PdfRenderer(mFileDescriptor);

}

private void closeRenderer() throws IOException {
    if (null != mGuncelSayfa) {
        mGuncelSayfa.close();
    }
    mPdfRenderer.close();
    mFileDescriptor.close();
}


private void showPage(int index) {
    if (mPdfRenderer.getPageCount() <= index) {
        return;
    }

    if (null != mGuncelSayfa) {
        mGuncelSayfa.close();
    }
    mGuncelSayfa = mPdfRenderer.openPage(index);
    // ÖNEMLİ: Hedef bitmap ARGB olmalı, RGB olmamalı.
    Bitmap bitmap = Bitmap.createBitmap(mGuncelSayfa.getWidth(), mGuncelSayfa.getHeight(),
            Bitmap.Config.ARGB_8888);
    mGuncelSayfa.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
    mImageView.setImageBitmap(bitmap);
    sayfayıGuncelle();
}


private void sayfayıGuncelle() {
    int index = mGuncelSayfa.getIndex();
    int pageCount = mPdfRenderer.getPageCount();
    mOncekiButon.setEnabled(0 != index);
    mSonrakiButon.setEnabled(index + 1 < pageCount);
    getActivity().setTitle(getString(R.string.app_name_with_index, index + 1, pageCount));
}


public int sayfaSayisiniGetir()
{
    return mPdfRenderer.getPageCount();
}

2 个答案:

答案 0 :(得分:2)

您正在片段上设置参数但调用活动

@Override
        public void onClick(View view) {
            Bundle bundle = new Bundle();
            bundle.putString("file_name", "sample3.pdf");
            PdfRendererBasicFragment ff=new PdfRendererBasicFragment();
            ff.setArguments(bundle);
            startActivity(new Intent(IpuclariSayfasi.this,TrafficActivity.class));
        }

当你真正提交Fragment时,你创建了一个没有任何参数的新实例:

if (savedInstanceState == null)
    {
        getFragmentManager().beginTransaction()
                .add(R.id.container, new PdfRendererBasicFragment(), FRAGMENT_PDF_RENDERER_BASIC)
                .commit();
    }

在真正的Fragment调用上进行第一次实现,如下所示:

if (savedInstanceState == null) {
       Bundle bundle = new Bundle();
       bundle.putString("file_name", "sample3.pdf");
       PdfRendererBasicFragment ff=new PdfRendererBasicFragment();
       ff.setArguments(bundle);
       getFragmentManager().beginTransaction()
             .add(R.id.container, ff, FRAGMENT_PDF_RENDERER_BASIC)
             .commit();
}

答案 1 :(得分:0)

你有问题

FILENAME= getArguments().getString("file_name");

getArguments()为空,因为您要为

设置参数

PdfRendererBasicFragment ff=new PdfRendererBasicFragment(); ff.setArguments(bundle);

但是你在TrafficActivity.class中创建了一个 new 片段

.add(R.id.container, new PdfRendererBasicFragment(), FRAGMENT_PDF_RENDERER_BASIC)

这是你正在使用的那个,但是这个没有任何参数