-1

I am trying to dynamically add fragments (webView) inside a VerticalViewPager which is included in an HorizontalViewpager. It works perfectly if I statically add the pages (fragments) from my HorizontaViewPager class, instead I get an NullPointerException if I try to add a new VerticalViewPager for example only when the third "page" (the third VerticalViewPager) is shown. Substantially the new pages (the new VerticalViewPagers) are added correctly without errors, but the NullPointerException is received when I try to scroll, after added the new VerticalViewPager, from the next fragments to the previous (for example from the fragment 5 to the fragment 4).

This is my code:

HorizontalViewPager class

public class HorizontalViewPagerCreator extends FragmentActivity  {


   addPage();
   addPage();
   addPage();
   addPage();

    horizPageAdapter = new PagerAdapter(super.getSupportFragmentManager(), horizfragments);
    horizViewPager = (ViewPager)super.findViewById(R.id.pager);
    horizViewPager.requestTransparentRegion(horizViewPager);  //prova per rimuovere il flickr

    horizViewPager.setOffscreenPageLimit(horizPageAdapter.getCount() - 1);

    horizViewPager.setAdapter(horizPageAdapter);




horizViewPager.setOnPageChangeListener(new OnPageChangeListener(){
        @Override
        public void onPageSelected(int position) 
        {
            if(horizViewPager.getCurrentItem() == 3){
                addPage();
                horizPageAdapter.notifyDataSetChanged();

            }
        }

        @Override
        public void onPageScrollStateChanged(int state) {}

        @Override
        public void onPageScrolled(int position, float arg1, int arg2) {}
    });
}

public void addPage() {
    Fragment myFragment = new VerticalViewPagerCreator();
    this.horizfragments.add(myFragment);

}

VerticalViewPagerCreator class

VerticalViewPager verticalViewPager = null;
private PagerAdapter verticalPageAdapter  = null;
private List<Fragment> verticalfragments = new ArrayList<Fragment>();

public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    addVerticalItem("file:///android_asset/index2.html", "WebView 3");
    addVerticalItem("file:///android_asset/index2.html", "WebView 3");
    addVerticalItem("file:///android_asset/index2.html", "WebView 3");
    verticalPageAdapter = new PagerAdapter(getChildFragmentManager(), verticalfragments);
    verticalViewPager =(VerticalViewPager)getView().findViewById(R.id.verticalViewPager1);
    verticalViewPager.setAdapter(verticalPageAdapter); 

    public void addVerticalItem(String url, String title) {
      Fragment myFragment = new MyWebView();
      Bundle args = new Bundle();
      args.putString("url", url);
      args.putString("type", "horizontal");
      myFragment.setArguments(args);
      this.verticalfragments.add(myFragment);
}

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

MyWebView class

public class MyWebView extends Fragment {

private WebView webView;
private String url;
private Bundle args;
@SuppressLint({ "SetJavaScriptEnabled", "NewApi" })
@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    // get the url to open
    args = getArguments();
    url = args.getString("url");
    webView = (WebView) getView().findViewById(R.id.webView);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setBuiltInZoomControls(true);
    webView.addJavascriptInterface(new WebAppInterface(webView.getContext()), "Android");


    webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
        {
            Toast.makeText(getActivity(), "ERROR code:"+errorCode+" desc: "+description+" failingURL: "+failingUrl, 3000).show();
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url)
        {

            return true;
        }

        public void onPageFinished(WebView view, String url) {

        }


        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
         super.onPageStarted(view, url, favicon);
        }
    });  //close the setWebViewClient
    webView.loadUrl(url);

This is the error:

enter image description here

Mark
  • 346
  • 2
  • 5
  • 18

1 Answers1

0

Solved: thanks to View Pager Crash Null Pointer Exception due to navigating back to the old fragment - Android I added the code below to my VerticalViewPageCreator Fragment and now it works

       @Override
public void onDetach() {
    super.onDetach();
    try {
        Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");
        childFragmentManager.setAccessible(true);
        childFragmentManager.set(this, null);
    } catch (NoSuchFieldException e) {
        throw new RuntimeException(e);
    } catch (IllegalAccessException e) {
        throw new RuntimeException(e);
    }
}
Community
  • 1
  • 1
Mark
  • 346
  • 2
  • 5
  • 18