Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android IllegalStateException: Fragment not attached to Activity webview

Tags:

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

like image 950
user3363625 Avatar asked Mar 13 '14 00:03

user3363625


People also ask

How do I attach a fragment to an activity?

Add a fragment to an activity You can add your fragment to the activity's view hierarchy either by defining the fragment in your activity's layout file or by defining a fragment container in your activity's layout file and then programmatically adding the fragment from within your activity.

What is the fragment life cycle in Android?

A fragment can be used in multiple activities. Fragment life cycle is closely related to the life cycle of its host activity which means when the activity is paused, all the fragments available in the activity will also be stopped. A fragment can implement a behaviour that has no user interface component.


1 Answers

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; } 
like image 64
Ellesmera Avatar answered Sep 26 '22 09:09

Ellesmera