Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java TabHost只显示一次内容(onCreate)_Java_Android_Fragment_Navigation Drawer_Android Tabhost - Fatal编程技术网

Java TabHost只显示一次内容(onCreate)

Java TabHost只显示一次内容(onCreate),java,android,fragment,navigation-drawer,android-tabhost,Java,Android,Fragment,Navigation Drawer,Android Tabhost,我在navigationDrawer中有一个TabHost,当我从作为导航抽屉项存在的TabHost转到另一个导航抽屉项并返回到TabHost时,会遇到一个奇怪的问题,它不会显示其内容,第一次它工作得很好,但当我更改项目并返回时,它不会显示内容;换句话说,它不会加载子片段,除非我关闭应用程序并重新启动它或更改方向(重新创建片段) 我第一次打开它(带内容)时它的外观如何 转到另一个navDrawer项目并返回TabHost后 public class PageTwoFragment extend

我在
navigationDrawer
中有一个
TabHost
,当我从作为导航抽屉项存在的
TabHost
转到另一个导航抽屉项并返回到
TabHost
时,会遇到一个奇怪的问题,它不会显示其内容,第一次它工作得很好,但当我更改项目并返回时,它不会显示内容;换句话说,它不会加载子片段,除非我关闭应用程序并重新启动它或更改方向(重新创建片段)

我第一次打开它(带内容)时它的外观如何

转到另一个navDrawer项目并返回TabHost后

public class PageTwoFragment extends Fragment
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        return inflater.inflate(R.layout.pagetwo_fragment, container, false);
    }

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

    @Override
    public void onAttach(Activity activity)
    {
        super.onAttach(activity);
    }

    @Override
    public void onStart()
    {
        super.onStart();
    }

    @Override
    public void onResume()
    {
        super.onResume();
    }
}

TabHost片段:

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TabHost;
import android.widget.TabWidget;

import java.util.ArrayList;

import info.fds.Emirates.R;

public  class MyFragment extends Fragment
{

    private TabHost mTabHost;
    private ViewPager mViewPager;
    private TabsAdapter mTabsAdapter;

    public MyFragment() {
    }

    @Override
    public void onCreate(Bundle instance)
    {
        super.onCreate(instance);

    }

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

        mTabHost = (TabHost) v.findViewById(android.R.id.tabhost);
        mTabHost.setup();

        mViewPager = (ViewPager) v.findViewById(R.id.pager);
        mTabsAdapter = new TabsAdapter(getActivity(), mTabHost, mViewPager);



        return v;
    }

    @Override
    public void onResume() {
        super.onResume();
        // Here we load the content for each tab.
        mTabsAdapter.addTab(mTabHost.newTabSpec("Incident").setIndicator("Incident"), PageOneFragment.class, null);
        mTabsAdapter.addTab(mTabHost.newTabSpec("Service Request").setIndicator("Service Request"), PageTwoFragment.class, null);
    }

    public static class TabsAdapter extends FragmentPagerAdapter implements TabHost.OnTabChangeListener, ViewPager.OnPageChangeListener
    {
        private final Context mContext;
        private final TabHost mTabHost;
        private final ViewPager mViewPager;
        private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();

        static final class TabInfo
        {
            private final String tag;
            private final Class<?> clss;
            private final Bundle args;

            TabInfo(String _tag, Class<?> _class, Bundle _args)
            {
                tag = _tag;
                clss = _class;
                args = _args;
            }
        }

        static class DummyTabFactory implements TabHost.TabContentFactory
        {
            private final Context mContext;

            public DummyTabFactory(Context context)
            {
                mContext = context;
            }

            public View createTabContent(String tag)
            {
                View v = new View(mContext);
                v.setMinimumWidth(0);
                v.setMinimumHeight(0);
                return v;
            }
        }

        public TabsAdapter(FragmentActivity activity, TabHost tabHost, ViewPager pager)
        {
            super(activity.getSupportFragmentManager());
            mContext = activity;
            mTabHost = tabHost;
            mViewPager = pager;
            mTabHost.setOnTabChangedListener(this);
            mViewPager.setAdapter(this);
            mViewPager.setOnPageChangeListener(this);
        }

        public void addTab(TabHost.TabSpec tabSpec, Class<?> clss, Bundle args)
        {
            tabSpec.setContent(new DummyTabFactory(mContext));
            String tag = tabSpec.getTag();

            TabInfo info = new TabInfo(tag, clss, args);
            mTabs.add(info);
            mTabHost.addTab(tabSpec);
            notifyDataSetChanged();
        }

        @Override
        public int getCount()
        {
            return mTabs.size();
        }

        @Override
        public Fragment getItem(int position)
        {
            TabInfo info = mTabs.get(position);

            return Fragment.instantiate(mContext, info.clss.getName(), info.args);

        }

        public void onTabChanged(String tabId)
        {
            int position = mTabHost.getCurrentTab();
            mViewPager.setCurrentItem(position);
        }

        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
        {
        }

        public void onPageSelected(int position)
        {
            // Unfortunately when TabHost changes the current tab, it kindly
            // also takes care of putting focus on it when not in touch mode.
            // The jerk.
            // This hack tries to prevent this from pulling focus out of our
            // ViewPager.
            TabWidget widget = mTabHost.getTabWidget();
            int oldFocusability = widget.getDescendantFocusability();
            widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
            mTabHost.setCurrentTab(position);
            widget.setDescendantFocusability(oldFocusability);
        }

        public void onPageScrollStateChanged(int state)
        {
        }
    }
}
PageTwoFragment

public class PageTwoFragment extends Fragment
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        return inflater.inflate(R.layout.pagetwo_fragment, container, false);
    }

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

    @Override
    public void onAttach(Activity activity)
    {
        super.onAttach(activity);
    }

    @Override
    public void onStart()
    {
        super.onStart();
    }

    @Override
    public void onResume()
    {
        super.onResume();
    }
}
注意:调试后,我注意到PageOneFragmentPageTwoFragment中的
onCreateView()
没有执行

那么发生了什么,为什么
tabHost
在导航到另一个项目后不加载其内容呢

编辑: 经过数小时痛苦的调试后,我发现我的代码从未对第二次调用执行fallowing方法,即:

@Override
        public Fragment getItem(int position)//never get executed after the second call
        {
            TabInfo info = mTabs.get(position);

            return Fragment.instantiate(mContext, info.clss.getName(), info.args);

        }
我怎样才能解决这个问题

非常感谢您的帮助


提前谢谢。

这个可笑的错误花费了我很多时间,虽然解决方法其实很简单,但问题是我用的是
FragmentPagerAdapter
而不是
FragmentStatePagerAdapter
替换后,一切都很好,希望这将有助于解决类似问题。

在您的代码中,
碎片页面适配器
将使用活动的
碎片管理器
,但当
碎片页面适配器
中实例化Item
时,它将在活动的
碎片管理器
中找到碎片。不幸的是,
PageOneFragment
pagetworfragment
已经在活动的
FragmentManager
中,因此没有新的创建
PageOneFragment
pagetworfragment
FragmentPageAdapter
将在片段backbackback中使用
PageOneFragment
。但是
PageOneFragment
被添加到最后一个
FragmentPageAdapter
中,然后就没有内容了

使用FragmentPageStateAdapter替换FragmentPageAdapter是一个简单的选择。如果您想在某些时候使用比
FragmentPageStateAdapter
更好的
FragmentPageAdapter
,您可以这样使用它:

    public TabsAdapter(Fragment fragment, TabHost tabHost, ViewPager pager)
    {
        super(fragment.getChildFragmentManager());


        mContext = fragment.getActivity();
        mTabHost = tabHost;
        mViewPager = pager;
        mTabHost.setOnTabChangedListener(this);
        mViewPager.setAdapter(this);
        mViewPager.setOnPageChangeListener(this);
        Log.i("Test", "TabsAdapter super");
    }
使用
ChildFragmentManager


我认为,如果您删除活动的
FragmentManager
中的
PageOneFragment
pagetworfragment
,也可以

嗨。请不要发布你的全部代码,只是为了理解你的问题。如果你能做一把小提琴那就太好了。我两天前也遇到了同样的情况!对我来说也花了很多时间!!两天前,我才在另一篇SO帖子上找到了这个解决方案!是的,这太荒谬了!(这是我的问题!)