Java Android IllegalStateException:片段未附加到 Activity webview

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/22366596/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 15:17:12  来源:igfitidea点击:

Android IllegalStateException: Fragment not attached to Activity webview

javaandroidandroid-fragmentsandroid-webviewillegalstateexception

提问by user3363625

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.

所以我是 android 应用程序编写的新手,我正在尝试开发一个练习应用程序,我希望以后可以变成一些东西。在我决定尝试将 webview 添加到其中一个之前,我在操作栏中有 3 个选项卡运行良好。现在它因 IllegalStateException 崩溃。而且由于我目前对 android 了解不多,我似乎无法弄清楚出了什么问题。

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:

带有 webview 的 WebFragment:

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:

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

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:

主要活动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

任何帮助都会很棒!谢谢

回答by Ellesmera

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()

通常,当您在 Fragment 不再附加到 Activity 后尝试执行工作时,您会收到该错误。在触发 IllegalStateException 的回调中添加对 isAdded 的检查:http: //developer.android.com/reference/android/app/Fragment.html#isAdded()

if(!isAdded()) {
    return;
}