递归进入executePendingTransactions [英] Recursive entry to executePendingTransactions

查看:935
本文介绍了递归进入executePendingTransactions的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个MainDrawer到碎片的活动有一个导航抽屉我和我的主要内容,我可以加载新的碎片进入一个布局。一个片段我的负荷卡莱StatisticsTab片段。这个片段拥有tabhost每个标签是它自己的列表视图项片段。当我点击一个ListView项目,它加载另一个新的片段就不再在tabHost,我回去试试使用navigationdrawer我StatisticsTab片段我得到这个错误:

  10月3日至三号:32:06.884 24185-24185 / com.beerportfolio.beerportfoliopro E / AndroidRuntime:致命异常:主要
    java.lang.IllegalStateException:递归进入executePendingTransactions
            在android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1439)
            在android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472)
            在android.support.v4.app.FragmentTabHost.onAttachedToWindow(FragmentTabHost.java:283)
            在android.view.View.dispatchAttachedToWindow(View.java:12307)
            在android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2457)
            在android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2464)
            在android.view.ViewGroup.addViewInner(ViewGroup.java:3567)
            在android.view.ViewGroup.addView(ViewGroup.java:3399)
            在android.view.ViewGroup.addView(ViewGroup.java:3344)
            在android.view.ViewGroup.addView(ViewGroup.java:3320)
            在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:938)
            在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
            在android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
            在android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
            在android.support.v4.app.FragmentManagerImpl $ 1.运行(FragmentManager.java:440)
            在android.os.Handler.handleCallback(Handler.java:730)
            在android.os.Handler.dispatchMessage(Handler.java:92)
            在android.os.Looper.loop(Looper.java:158)
            在android.app.ActivityThread.main(ActivityThread.java:5789)
            在java.lang.reflect.Method.invokeNative(本机方法)
            在java.lang.reflect.Method.invoke(Method.java:525)
            在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1027)
            在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:843)
            在dalvik.system.NativeStart.main(本机方法)
 

如果我没有点击任何我的卡虽然在StatisticsTab片断,然后导航到经由navdrawer另一个片段,然后回到StatisticsTab那么就不会FC上。也没有在NavDrawer部队密切其他片段时,我回去给他们,只是一个与标签。

MainDrawer2:

 公共类MainDrawer2扩展FragmentActivity
{
    私有静态最后弦乐EXTRA_NAV_ITEM =extraNavItem;
    私有静态最后弦乐STATE_CURRENT_NAV =stateCurrentNav;

    私人ActionBarDrawerToggle mDrawerToggle;
    私人DrawerLayout mDrawerLayout;

    私人NavDrawerListAdapter mDrawerAdapter;
    私人的ListView mDrawerList;

    私人的CharSequence mTitle;
    私人的CharSequence mDrawerTitle;

    私人MainNavItem mCurrentNavItem;


    公共静态意图createLaunchFragmentIntent(上下文的背景下,MainNavItem的NavItem)
    {
        返回新意图(背景下,MainDrawer2.class)
                .putExtra(EXTRA_NAV_ITEM,navItem.ordinal());
    }

    @覆盖
    保护无效的onCreate(包savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.fragment_main);

        mTitle = mDrawerTitle =的getTitle();
        mDrawerLayout =(DrawerLayout)findViewById(R.id.drawer_layout);
        mDrawerList =(ListView控件)findViewById(R.id.drawer);

        getActionBar()setDisplayHomeAsUpEnabled(真)。
        enableHomeButtonIfRequired();

        mDrawerAdapter =新NavDrawerListAdapter(getApplicationContext());
        mDrawerList.setAdapter(mDrawerAdapter);
        mDrawerList.setOnItemClickListener(新ListView.OnItemClickListener()
        {
            @覆盖
            公共无效onItemClick(适配器视图<>母公司视图中查看,INT位置,长ID)
            {
                displayNavFragment((MainNavItem)parent.getItemAtPosition(位置));
            }
        });

        mDrawerToggle =新ActionBarDrawerToggle(这一点,mDrawerLayout,
                R.drawable.ic_drawer,R.string.app_name,R.string.app_name)
        {
            公共无效onDrawerClosed(查看视图)
            {
                。getActionBar()的setTitle(mTitle);
                invalidateOptionsMenu();
            }

            公共无效onDrawerOpened(查看drawerView)
            {
                。getActionBar()的setTitle(mDrawerTitle);
                invalidateOptionsMenu();
            }
        };

        mDrawerLayout.setDrawerListener(mDrawerToggle);

        如果(getIntent()。hasExtra(EXTRA_NAV_ITEM)){
            MainNavItem的NavItem = MainNavItem.values​​()
                    [getIntent()。getIntExtra(EXTRA_NAV_ITEM,
                    MainNavItem.STATISTICS.ordinal())];
            displayNavFragment(的NavItem);
        }
        否则,如果(savedInstanceState!= NULL){
            mCurrentNavItem = MainNavItem.values​​()
                    [savedInstanceState.getInt(STATE_CURRENT_NAV)];
            setCurrentNavItem(mCurrentNavItem);
        }
        其他{
            displayNavFragment(MainNavItem.STATISTICS);
        }
    }

    @TargetApi(Build.VERSION_ codeS.ICE_CREAM_SANDWICH)
    私人无效enableHomeButtonIfRequired()
    {
        如果(Build.VERSION.SDK_INT> = Build.VERSION_ codeS.ICE_CREAM_SANDWICH){
            getActionBar()setHomeButtonEnabled(真)。
        }
    }

    @覆盖
    公共无效的setTitle(CharSequence的标题)
    {
        mTitle =称号;
        。getActionBar()的setTitle(mTitle);
    }

    @覆盖
    保护无效onPostCreate(包savedInstanceState)
    {
        super.onPostCreate(savedInstanceState);
        //同步发生onRestoreInstanceState后切换状态。
        mDrawerToggle.syncState();
    }

    @覆盖
    公共无效onConfigurationChanged(配置NEWCONFIG)
    {
        super.onConfigurationChanged(NEWCONFIG);
        //传递任何配置更改抽屉切换
        mDrawerToggle.onConfigurationChanged(NEWCONFIG);
    }

    @覆盖
    保护无效的onSaveInstanceState(包outState)
    {
        super.onSaveInstanceState(outState);
        outState.putInt(STATE_CURRENT_NAV,mCurrentNavItem.ordinal());
    }

    @覆盖
    公共布尔onCreateOptionsMenu(菜单菜单)
    {
        。getMenuInflater()膨胀(R.menu.main,菜单);
        返回true;
    }

    / *
    @覆盖
    公共布尔prepareOptionsMenu(功能菜单)上
    {
        //如果导航抽屉被打开,隐藏行动项目
        布尔drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
        menu.findItem(R.id.action_settings).setVisible(drawerOpen!);
        返回super.on prepareOptionsMenu(菜单);
    }
    * /



    私人无效displayNavFragment(MainNavItem的NavItem)
    {
        如果(的NavItem == mCurrentNavItem){
            返回;
        }
        片段片段= Fragment.instantiate(这一点,
                。navItem.getFragClass()的getName());
        如果(片段!= NULL){

            getSupportFragmentManager()的BeginTransaction()
                    .replace(R.id.main,片段)
                    。承诺();
            setCurrentNavItem(的NavItem);
        }
    }

    私人无效setCurrentNavItem(MainNavItem的NavItem)
    {
        INT位置= navItem.ordinal();
        //如果的NavItem是DrawerAdapter
        如果(位置> = 0&功放;&安培;位置< mDrawerAdapter.getCount()){
            mDrawerList.setItemChecked(位置,真正的);
        }
        其他{
            //的NavItem不DrawerAdapter,取消选择当前项
            如果(mCurrentNavItem!= NULL){
                mDrawerList.setItemChecked(mCurrentNavItem.ordinal(),FALSE);
            }
        }
        mDrawerLayout.closeDrawer(mDrawerList);
        的setTitle(navItem.getTitleResId());
        mCurrentNavItem =的NavItem;
    }

    @覆盖
    公共布尔onOptionsItemSelected(菜单项项){
        开关(item.getItemId()){
            案例android.R.id.home:
                如果(mDrawerLayout.isDrawerOpen(mDrawerList)){
                    mDrawerLayout.closeDrawer(mDrawerList);
                }
                其他 {
                    mDrawerLayout.openDrawer(mDrawerList);
                }
                返回true;
            默认:
                返回super.onOptionsItemSelected(项目);
        }
    }




    公共无效goToSearch(菜单项项){

        //去搜索页面
        片段Fragment_one;
        FragmentManager人= getSupportFragmentManager();
        FragmentTransaction TRAN = man.beginTransaction();
        Fragment_one =新搜索();

        tran.replace(R.id.main,Fragment_one); // TRAN。
        tran.addToBackStack(空);
        tran.commit();

    }



}
 

StatisticsTab:

 公共类StatisticsTab扩展片段{


    私人FragmentTabHost mTab​​Host;

    //强制构造函数
    公共StatisticsTab(){
    }

    公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);

    }

    公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,
                             捆绑savedInstanceState){

        查看rootView = inflater.inflate(R.layout.fragment_tabs,集装箱,假);


        mTabHost =(FragmentTabHost)rootView.findViewById(android.R.id.tabhost);

        mTabHost.setup(getActivity(),getFragmentManager(),R.id.realtabcontent);

        mTabHost.addTab(mTabHost.newTabSpec(基本法)。setIndicator(基本法),
                StatisticsPage.class,NULL);
        mTabHost.addTab(mTabHost.newTabSpec(啤酒)。setIndicator(啤酒),
                BreweryStatistics.class,NULL);
        mTabHost.addTab(mTabHost.newTabSpec(时尚)。setIndicator(时尚),
                StyleStatistics.class,NULL);
        mTabHost.addTab(mTabHost.newTabSpec(味)。setIndicator(味),
                TasteStatisticsPage.class,NULL);



        返回rootView;
    }




}
 

我的一个片段中其中有一个列表视图的tabhost一个标签:

 公共类BreweryStatistics扩展片段实现GetBreweryStatisticsJSON.OnArticleSelectedListener {

    公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,
                             捆绑savedInstanceState){
        视图V = inflater.inflate(R.layout.brewery_statistics_layout,集装箱,假);

        共享preferences preFS = preferenceManager.getDefaultShared preferences(getActivity());
        字符串username = prefs.getString(username的,NULL);
        字符串userid = prefs.getString(用户ID,NULL);

        字符串URL =myURL;


        //异步任务来获得啤酒口味标签百分数
        GetBreweryStatisticsJSON任务=新GetBreweryStatisticsJSON(getActivity());
        task.setOnArticleSelectedListener(本);
        task.execute(URL);


        //充气的布局该片段
        返回伏;

    }


    @覆盖
    公共无效onArticleSelected(字符串BID){

        // code上单击执行
        片段Fragment_one;
        FragmentManager人= getFragmentManager();
        FragmentTransaction TRAN = man.beginTransaction();
        Fragment_one =新BreweryPage2();
        最后的捆绑包=新包();
        bundle.putString(breweryIDSent,BID);
        Fragment_one.setArguments(包);

        tran.replace(R.id.main,Fragment_one); // TRAN。
        tran.addToBackStack(空);
        tran.commit();

    }


}
 

我的异步任务,上述片段加载列表视图:

 公共类GetBreweryStatisticsJSON扩展的AsyncTask<字符串,太虚,字符串> {

    语境℃;
    私人ProgressDialog对话框;


    公共GetBreweryStatisticsJSON(上下文的背景下)
    {
        C =背景;
        对话框=新ProgressDialog(C);
    }

    // *************************** code上点击
    OnArticleSelectedListener监听;
    公共接口OnArticleSelectedListener {
        公共无效onArticleSelected(字符串myString的);


    }
    公共无效setOnArticleSelectedListener(OnArticleSelectedListener监听器){
        this.listener =侦听器;


    }
    // ****结束$ C $下的onClick

    在preExecute保护无效(){
        Dialog.setMessage(分析酒厂);

        Dialog.setTitle(加载);
        Dialog.setCancelable(假);
        Dialog.show();
    }


    @覆盖
    保护字符串doInBackground(字符串...为arg0){
        // TODO自动生成方法存根
        返回readJSONFeed(为arg0 [0]);
    }

    保护无效onPostExecute(字符串结果){
        //德code在这里JSON
        尝试{
            JSONArray jsonArray =新JSONArray(结果);


            //存取权限列表视图
            ListView的LV =(ListView控件)((活动)C).findViewById(R.id.yourBreweryStatistics);

            //使数组列表啤酒
            最后的名单,其中,BreweryInfo> tasteList =新的ArrayList< BreweryInfo>();



            的for(int i = 0; I< jsonArray.length();我++){

                串啤酒厂= jsonArray.getJSONObject(ⅰ).getString(啤酒厂);
                字符串率= jsonArray.getJSONObject(我).getString(速度);
                字符串breweryID = jsonArray.getJSONObject(我).getString(ID);

                诠释计数= I + 1;

                酿酒厂=计数+ +啤酒;

                Log.d(啤酒厂统计,啤酒厂);

                //创建对象
                BreweryInfo tempTaste =新BreweryInfo(啤酒厂,breweryID,速​​度);

                //添加到ArrayList中
                tasteList.add(tempTaste);


                //将项添加到列表视图
                BreweryInfoAdapter适配器1 =新BreweryInfoAdapter(C,R.layout.brewer_stats_listview,tasteList);
                lv.setAdapter(适配器1);

                //设置点击
                lv.setOnItemClickListener(新AdapterView.OnItemClickListener(){
                    @覆盖
                    公共无效onItemClick(适配器视图<>为arg0,查看ARG1,
                                            INT ARG2,长ARG3){
                        BreweryInfo O =(BreweryInfo)arg0.getItemAtPosition(ARG2);

                        字符串BID = o.breweryID;

                        Log.d(breweryID,BID);

                        // TODO:添加啤酒厂页面链接
                        // *********************添加监听器
                        listener.onArticleSelected(BID);


                    }
                });

            }

        }
        赶上(例外五){

        }

        Dialog.dismiss();

    }

    公共字符串readJSONFeed(字符串URL){
        StringBuilder的StringBuilder的=新的StringBuilder();
        HttpClient的HttpClient的=新DefaultHttpClient();
        HTTPGET HTTPGET =新HTTPGET(URL);
        尝试 {
            HTT presponse响应= httpClient.execute(HTTPGET);
            状态行状态行= response.getStatusLine();
            INT状态code = statusLine.getStatus code();
            如果(状态code == 200){
                HttpEntity实体= response.getEntity();
                InputStream中的InputStream = entity.getContent();
                的BufferedReader读卡器=新的BufferedReader(
                        新的InputStreamReader(InputStream中));
                串线;
                而((行= reader.readLine())!= NULL){
                    stringBuilder.append(线);
                }
                inputStream.close();
            } 其他 {
                Log.d(JSON,无法下载文件);
            }
        }赶上(例外五){
            Log.d(readJSONFeed,e.getLocalizedMessage());
        }
        返回stringBuilder.toString();
    }



}
 

解决方案

正在尝试使用片段嵌套在其他片段中,你FragmentTabHost方式。

在你StatisticsTab片段,改变这种:

  mTab​​Host.setup(getActivity(),getFragmentManager(),R.id.realtabcontent);
 

这样:

  mTab​​Host.setup(getActivity(),getChildFragmentManager(),R.id.realtabcontent);
 


然后,请务必使用父FragmentManager提交的主要片段的变化,通过改变 getFragmentManager() getActivity()。getSupportFragmentManager() BreweryStatistics.onArticleSelected()


请参阅:
<一href="http://stackoverflow.com/questions/7338823/viewpager-recursive-entry-to-executependingtransactions">ViewPager:递归进入executePendingTransactions
<一href="http://stackoverflow.com/questions/13377157/nested-fragments-using-support-library-v4-revision-11">Nested使用支持库V4版本的碎片11

I have a MainDrawer to Fragment activity which has a layout for a nav drawer my and my main content where I can load new fragments into. One fragment I load in is calle StatisticsTab Fragment. This Fragment holds a tabhost which each tab is its own fragment of listview items. Once I click on a ListView item, which loads another new fragment and am no longer in the tabHost and I try to go back using the navigationdrawer to my StatisticsTab fragment I get this error:

03-03 10:32:06.884  24185-24185/com.beerportfolio.beerportfoliopro E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.IllegalStateException: Recursive entry to executePendingTransactions
            at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1439)
            at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472)
            at android.support.v4.app.FragmentTabHost.onAttachedToWindow(FragmentTabHost.java:283)
            at android.view.View.dispatchAttachedToWindow(View.java:12307)
            at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2457)
            at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2464)
            at android.view.ViewGroup.addViewInner(ViewGroup.java:3567)
            at android.view.ViewGroup.addView(ViewGroup.java:3399)
            at android.view.ViewGroup.addView(ViewGroup.java:3344)
            at android.view.ViewGroup.addView(ViewGroup.java:3320)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:938)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
            at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
            at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
            at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)
            at android.os.Handler.handleCallback(Handler.java:730)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:158)
            at android.app.ActivityThread.main(ActivityThread.java:5789)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:843)
            at dalvik.system.NativeStart.main(Native Method)

If I do not click on any of my tabs though on the StatisticsTab fragment and navigate to another fragment via the navdrawer and then back to the StatisticsTab then it will not FC on. ALso none of the other fragments in the NavDrawer force close when I go back to them, just the one with the tabs.

MainDrawer2:

public class MainDrawer2 extends FragmentActivity
{
    private static final String EXTRA_NAV_ITEM    = "extraNavItem";
    private static final String STATE_CURRENT_NAV = "stateCurrentNav";

    private ActionBarDrawerToggle mDrawerToggle;
    private DrawerLayout mDrawerLayout;

    private NavDrawerListAdapter mDrawerAdapter;
    private ListView mDrawerList;

    private CharSequence mTitle;
    private CharSequence mDrawerTitle;

    private MainNavItem mCurrentNavItem;


    public static Intent createLaunchFragmentIntent(Context context, MainNavItem navItem)
    {
        return new Intent(context, MainDrawer2.class)
                .putExtra(EXTRA_NAV_ITEM, navItem.ordinal());
    }

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_main);

        mTitle = mDrawerTitle = getTitle();
        mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);
        mDrawerList   = (ListView)findViewById(R.id.drawer);

        getActionBar().setDisplayHomeAsUpEnabled(true);
        enableHomeButtonIfRequired();

        mDrawerAdapter = new NavDrawerListAdapter(getApplicationContext());
        mDrawerList.setAdapter(mDrawerAdapter);
        mDrawerList.setOnItemClickListener(new ListView.OnItemClickListener()
        {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id)
            {
                displayNavFragment((MainNavItem)parent.getItemAtPosition(position));
            }
        });

        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                R.drawable.ic_drawer, R.string.app_name, R.string.app_name)
        {
            public void onDrawerClosed(View view)
            {
                getActionBar().setTitle(mTitle);
                invalidateOptionsMenu();
            }

            public void onDrawerOpened(View drawerView)
            {
                getActionBar().setTitle(mDrawerTitle);
                invalidateOptionsMenu();
            }
        };

        mDrawerLayout.setDrawerListener(mDrawerToggle);

        if(getIntent().hasExtra(EXTRA_NAV_ITEM)){
            MainNavItem navItem = MainNavItem.values()
                    [getIntent().getIntExtra(EXTRA_NAV_ITEM,
                    MainNavItem.STATISTICS.ordinal())];
            displayNavFragment(navItem);
        }
        else if(savedInstanceState != null){
            mCurrentNavItem = MainNavItem.values()
                    [savedInstanceState.getInt(STATE_CURRENT_NAV)];
            setCurrentNavItem(mCurrentNavItem);
        }
        else{
            displayNavFragment(MainNavItem.STATISTICS);
        }
    }

    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    private void enableHomeButtonIfRequired()
    {
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH){
            getActionBar().setHomeButtonEnabled(true);
        }
    }

    @Override
    public void setTitle(CharSequence title)
    {
        mTitle = title;
        getActionBar().setTitle(mTitle);
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState)
    {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig)
    {
        super.onConfigurationChanged(newConfig);
        // Pass any configuration change to the drawer toggles
        mDrawerToggle.onConfigurationChanged(newConfig);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState)
    {
        super.onSaveInstanceState(outState);
        outState.putInt(STATE_CURRENT_NAV, mCurrentNavItem.ordinal());
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    /*
    @Override
    public boolean onPrepareOptionsMenu(Menu menu)
    {
        // if nav drawer is opened, hide the action items
        boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
        menu.findItem(R.id.action_settings).setVisible(!drawerOpen);
        return super.onPrepareOptionsMenu(menu);
    }
    */



    private void displayNavFragment(MainNavItem navItem)
    {
        if(navItem == mCurrentNavItem){
            return;
        }
        Fragment fragment = Fragment.instantiate(this,
                navItem.getFragClass().getName());
        if(fragment != null){

            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.main, fragment)
                    .commit();
            setCurrentNavItem(navItem);
        }
    }

    private void setCurrentNavItem(MainNavItem navItem)
    {
        int position = navItem.ordinal();
        // If navItem is in DrawerAdapter
        if(position >= 0 && position < mDrawerAdapter.getCount()){
            mDrawerList.setItemChecked(position, true);
        }
        else{
            // navItem not in DrawerAdapter, de-select current item
            if(mCurrentNavItem != null){
                mDrawerList.setItemChecked(mCurrentNavItem.ordinal(), false);
            }
        }
        mDrawerLayout.closeDrawer(mDrawerList);
        setTitle(navItem.getTitleResId());
        mCurrentNavItem = navItem;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                if(mDrawerLayout.isDrawerOpen(mDrawerList)) {
                    mDrawerLayout.closeDrawer(mDrawerList);
                }
                else {
                    mDrawerLayout.openDrawer(mDrawerList);
                }
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }




    public void goToSearch(MenuItem item){

        //go to search page
        Fragment Fragment_one;
        FragmentManager man= getSupportFragmentManager();
        FragmentTransaction tran = man.beginTransaction();
        Fragment_one = new Search();

        tran.replace(R.id.main, Fragment_one);//tran.
        tran.addToBackStack(null);
        tran.commit();

    }



}

StatisticsTab:

public class StatisticsTab extends Fragment  {


    private FragmentTabHost mTabHost;

    //Mandatory Constructor
    public StatisticsTab() {
    }

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

    }

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

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


        mTabHost = (FragmentTabHost)rootView.findViewById(android.R.id.tabhost);

        mTabHost.setup(getActivity(), getFragmentManager(), R.id.realtabcontent);

        mTabHost.addTab(mTabHost.newTabSpec("Basic").setIndicator("Basic"),
                StatisticsPage.class, null);
        mTabHost.addTab(mTabHost.newTabSpec("Brewery").setIndicator("Brewery"),
                BreweryStatistics.class, null);
        mTabHost.addTab(mTabHost.newTabSpec("Style").setIndicator("Style"),
                StyleStatistics.class, null);
        mTabHost.addTab(mTabHost.newTabSpec("Taste").setIndicator("Taste"),
                TasteStatisticsPage.class, null);



        return rootView;
    }




}

One of my Fragments for a tab in the tabhost which has a listview:

public class BreweryStatistics extends Fragment implements GetBreweryStatisticsJSON.OnArticleSelectedListener {

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.brewery_statistics_layout, container, false);

        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
        String userName = prefs.getString("userName", null);
        String userID = prefs.getString("userID", null);

        String url = "myURL";


        //async task to get beer taste tag percents
        GetBreweryStatisticsJSON task = new GetBreweryStatisticsJSON(getActivity());
        task.setOnArticleSelectedListener(this);
        task.execute(url);


        // Inflate the layout for this fragment
        return v;

    }


    @Override
    public void onArticleSelected(String bID){

        //code to execute on click
        Fragment Fragment_one;
        FragmentManager man= getFragmentManager();
        FragmentTransaction tran = man.beginTransaction();
        Fragment_one = new BreweryPage2();
        final Bundle bundle = new Bundle();
        bundle.putString("breweryIDSent", bID);
        Fragment_one.setArguments(bundle);

        tran.replace(R.id.main, Fragment_one);//tran.
        tran.addToBackStack(null);
        tran.commit();

    }


}

My Async task for the above fragment to load the listview:

public class GetBreweryStatisticsJSON extends AsyncTask<String, Void, String> {

    Context c;
    private ProgressDialog Dialog;


    public GetBreweryStatisticsJSON(Context context)
    {
        c = context;
        Dialog = new ProgressDialog(c);
    }

    //***************************code for on click
    OnArticleSelectedListener listener;
    public interface OnArticleSelectedListener{
        public void onArticleSelected(String myString);


    }
    public void setOnArticleSelectedListener(OnArticleSelectedListener listener){
        this.listener = listener;


    }
    //*****************************end code for onClick

    protected void onPreExecute() {
        Dialog.setMessage("Analyzing breweries");

        Dialog.setTitle("Loading");
        Dialog.setCancelable(false);
        Dialog.show();
    }


    @Override
    protected String doInBackground(String... arg0) {
        // TODO Auto-generated method stub
        return readJSONFeed(arg0[0]);
    }

    protected void onPostExecute(String result){
        //decode json here
        try{
            JSONArray jsonArray = new JSONArray(result);


            //acces listview
            ListView lv = (ListView) ((Activity) c).findViewById(R.id.yourBreweryStatistics);

            //make array list for beer
            final List<BreweryInfo> tasteList = new ArrayList<BreweryInfo>();



            for(int i = 0; i < jsonArray.length(); i++) {

                String brewery = jsonArray.getJSONObject(i).getString("brewery");
                String rate = jsonArray.getJSONObject(i).getString("rate");
                String breweryID = jsonArray.getJSONObject(i).getString("id");

                int count = i + 1;

                brewery = count + ". " + brewery;

                Log.d("brewery stats", brewery);

                //create object
                BreweryInfo tempTaste = new BreweryInfo(brewery, breweryID, rate);

                //add to arraylist
                tasteList.add(tempTaste);


                //add items to listview
                BreweryInfoAdapter adapter1 = new BreweryInfoAdapter(c ,R.layout.brewer_stats_listview, tasteList);
                lv.setAdapter(adapter1);

                //set up clicks
                lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> arg0, View arg1,
                                            int arg2, long arg3) {
                        BreweryInfo o=(BreweryInfo)arg0.getItemAtPosition(arg2);

                        String bID = o.breweryID;

                        Log.d("breweryID" , bID);

                        //todo: add brewery page link
                        //********************* add listener
                        listener.onArticleSelected(bID);


                    }
                });

            }

        }
        catch(Exception e){

        }

        Dialog.dismiss();

    }

    public String readJSONFeed(String URL) {
        StringBuilder stringBuilder = new StringBuilder();
        HttpClient httpClient = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(URL);
        try {
            HttpResponse response = httpClient.execute(httpGet);
            StatusLine statusLine = response.getStatusLine();
            int statusCode = statusLine.getStatusCode();
            if (statusCode == 200) {
                HttpEntity entity = response.getEntity();
                InputStream inputStream = entity.getContent();
                BufferedReader reader = new BufferedReader(
                        new InputStreamReader(inputStream));
                String line;
                while ((line = reader.readLine()) != null) {
                    stringBuilder.append(line);
                }
                inputStream.close();
            } else {
                Log.d("JSON", "Failed to download file");
            }
        } catch (Exception e) {
            Log.d("readJSONFeed", e.getLocalizedMessage());
        }
        return stringBuilder.toString();
    }



}

解决方案

You are attempting to use fragments nested within other fragments, by way of your FragmentTabHost.

In your StatisticsTab fragment, change this:

mTabHost.setup(getActivity(), getFragmentManager(), R.id.realtabcontent);

to this:

mTabHost.setup(getActivity(), getChildFragmentManager(), R.id.realtabcontent);


Then, make sure to use the parent FragmentManager to commit the main fragment change, by changing getFragmentManager() to getActivity().getSupportFragmentManager() inside BreweryStatistics.onArticleSelected().


See:
ViewPager: Recursive entry to executePendingTransactions
Nested Fragments using support library v4 revision 11

这篇关于递归进入executePendingTransactions的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆