24

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

1
  • show the stack trace.. Commented Mar 13, 2014 at 0:30

1 Answer 1

88

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; } 
Sign up to request clarification or add additional context in comments.

4 Comments

Wouldn't the Fragment be attached in onResume() method? Or is that not necessarily so?
This supported on API level 11 onwards. You can simply use try catch block to prevent app from crashing on lower APIs.
where to add this method?
@rala we can use this everywhere in fragment class

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.