Android IllegalStateException: Fragment not attached to Activity webview

user3363625 picture user3363625 · Mar 13, 2014 · Viewed 37k times · Source

So I'm new to android app writing, and I am trying to work on a practice app that I can hopefully turn into something later. I had 3 tabs in the actionbar that ran fine before I decided to try to add webview to one of them. Now it crashes with an IllegalStateException. And since I don't know too much about android at the moment, I can't seem to figure out what is wrong.

The main activity:

private ViewPager viewPager;
private TabsPagerAdapter mAdapter;
private ActionBar actionBar;
private String[] tabs = { "Web", "Facebook", "Twitter" };

@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Initialization
    viewPager = (ViewPager) findViewById(R.id.pager);
    actionBar = getActionBar();
    mAdapter = new TabsPagerAdapter(getSupportFragmentManager());

    viewPager.setAdapter(mAdapter);
    actionBar.setHomeButtonEnabled(false);
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);        

    // Adding Tabs
    for (String tab_name : tabs) 
    {
        actionBar.addTab(actionBar.newTab().setText(tab_name).setTabListener(this));
    }

    /**
     * on swiping the viewpager make respective tab selected
     * */
    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() 
    {

        @Override
        public void onPageSelected(int position) 
        {
            // on changing the page
            // make respected tab selected
            actionBar.setSelectedNavigationItem(position);
        }

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

        @Override
        public void onPageScrollStateChanged(int arg0) 
        {
        }
    });
}

@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) 
{
}

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) 
{
    // on tab selected
    // show respected fragment view
    viewPager.setCurrentItem(tab.getPosition());
}

@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) 
{
}

The WebFragment with the webview:

public class WebFragment extends Fragment 
{

private String url = getString(R.string.website);

//@Override
//public void onActivityCreated(Bundle savedInstanceState) 
//{
    //super.onActivityCreated(savedInstanceState);
//}

@SuppressLint("SetJavaScriptEnabled")
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) 
{

    View rootView = inflater.inflate(R.layout.web_fragment, container, false);

    WebView tolerableWebView = (WebView) getView().findViewById(R.id.webview);
    tolerableWebView.getSettings().setJavaScriptEnabled(true);
    tolerableWebView.loadUrl(url);

    return rootView;
}

}

the TabsPagerAdapter:

public class TabsPagerAdapter extends FragmentPagerAdapter
{

public TabsPagerAdapter(FragmentManager fm) 
{
    super(fm);
}

@Override
public Fragment getItem(int index) 
{

    switch (index) {
    case 0:
        // Top Rated fragment activity
        return new WebFragment();
    case 1:
        // Games fragment activity
        return new FacebookFragment();
    case 2:
        // Movies fragment activity
        return new TwitterFragment();
    }

    return null;
}

@Override
public int getCount() 
{
    // get item count - equal to number of tabs
    return 3;
}
}

The webfragment xml

<?xml version="1.0" encoding="utf-8"?>
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/webview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">

</WebView>

The main activity xml:

<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

Any help would be great! Thanks

Answer

Ellesmera picture Ellesmera · Mar 20, 2014

Generally you get that error when you try to perform work after the Fragment is no longer attached to the Activity. In the callback that triggers the IllegalStateException add a check for isAdded: http://developer.android.com/reference/android/app/Fragment.html#isAdded()

if(!isAdded()) {
    return;
}