android – onCreate每次选择一个选项卡时都会调用两个选项卡

android – onCreate每次选择一个选项卡时都会调用两个选项卡,第1张

概述我有一个使用片段和ActionBarSherlock构建的选项卡式应用程序.我有7个标签.这是正在发生的事情. 当我选择任何选项卡时,将按预期调用相关片段的onCreate方法.问题是也为下一个相邻的选项卡调用onCreate方法.例如: >应用程序在tab1中启动,onCreate按预期调用 > tab2 onCreate也被调用(不应该发生) > ——- >单击tab2并按预期调用onCrea 我有一个使用片段和ActionbarSherlock构建的选项卡式应用程序.我有7个标签.这是正在发生的事情.

当我选择任何选项卡时,将按预期调用相关片段的onCreate方法.问题是也为下一个相邻的选项卡调用onCreate方法.例如:

>应用程序在tab1中启动,onCreate按预期调用
> tab2 onCreate也被调用(不应该发生)
> ——-
>单击tab2并按预期调用onCreate(即使它已被调用)
> tab3 onCreate也被调用(不应该发生)
> ——-
>单击tab6,按预期调用onCreate
> tab7 onCreate也被调用(不应该发生)
> ——-
>真的很奇怪,点击tab7(最后一个标签)
> tab6(第二个到最后一个标签)onCreate也被调用(不应该发生)

我已经阅读了几个可能的问题并检查以确保它不会发生在这里:

>不为每个标签使用唯一标签(它们是唯一的)
>模拟器有两次调用onCreate的错误(我的ICS设备上的行为相同)

所以这不是以前的两种可能性,而且我完全没有想法.该程序运行正常,但加载两个片段(这是WebvIEw)需要花费太多时间,而不是我期望的行为.

这是我创建标签主机的主要活动onCreate的代码:
编辑:

public class SynergyWorlDWIDeActivity extends SherlockFragmentActivity{//TabHost mTabHost;VIEwPager  mVIEwPager;TabsAdapter mTabsAdapter;@OverrIDeprotected voID onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    // Set up the vIEw pager    setContentVIEw(R.layout.fragment_tabs_pager);    mVIEwPager = (VIEwPager)findVIEwByID(R.ID.pager);    // Set up action bar    final Actionbar bar = getSupportActionbar();    bar.setNavigationMode(Actionbar.NAVIGATION_MODE_TABS);    bar.setdisplayShowTitleEnabled(true);    //bar.setdisplayShowHomeEnabled(false);    // Creat tabs with bundled URLs    Bundle  tab1Args=new Bundle(),tab2Args=new Bundle(),tab3Args=new Bundle(),tab4Args=new Bundle(),tab5Args=new Bundle(),tab6Args=new Bundle(),tab7Args=new Bundle();    tab1Args.putString("tabURL",getString(R.string.webtab1_URL));    tab2Args.putString("tabURL",getString(R.string.webtab2_URL));    tab3Args.putString("tabURL",getString(R.string.webtab3_URL));    tab4Args.putString("tabURL",getString(R.string.webtab4_URL));    tab5Args.putString("tabURL",getString(R.string.webtab5_URL));    tab6Args.putString("tabURL",getString(R.string.webtab6_URL));    tab7Args.putString("tabURL",getString(R.string.webtab7_URL));    mTabsAdapter = new TabsAdapter(this,mVIEwPager);    mTabsAdapter.addTab(bar.newTab().setText(getString(R.string.webtab1_name)),WebTabFragment.MyWebvIEwFragment.class,tab1Args);    mTabsAdapter.addTab(bar.newTab().setText(getString(R.string.webtab2_name)),tab2Args);    mTabsAdapter.addTab(bar.newTab().setText(getString(R.string.webtab3_name)),tab3Args);    mTabsAdapter.addTab(bar.newTab().setText(getString(R.string.webtab4_name)),tab4Args);    mTabsAdapter.addTab(bar.newTab().setText(getString(R.string.webtab5_name)),tab5Args);    mTabsAdapter.addTab(bar.newTab().setText(getString(R.string.webtab6_name)),tab6Args);    mTabsAdapter.addTab(bar.newTab().setText(getString(R.string.webtab7_name)),tab7Args);    if (savedInstanceState != null) {        bar.setSelectednavigationItem(savedInstanceState.getInt("tab",0));    }}@OverrIDeprotected voID onSaveInstanceState(Bundle outState) {    super.onSaveInstanceState(outState);    outState.putInt("tab",getActionbar().getSelectednavigationIndex());}/** * This is a helper class that implements the management of tabs and all * details of connecting a VIEwPager with associated TabHost.  It relIEs on a * trick.  normally a tab host has a simple API for supplying a VIEw or * Intent that each tab will show.  This is not sufficIEnt for switching * between pages.  So instead we make the content part of the tab host * 0dp high (it is not shown) and the TabsAdapter supplIEs its own dummy * vIEw to show as the tab content.  It Listens to changes in tabs,and takes * care of switch to the correct paged in the VIEwPager whenever the selected * tab changes. */public static class TabsAdapter extends FragmentPagerAdapter implements Actionbar.TabListener,VIEwPager.OnPagechangelistener{    private final Context mContext;    //private final TabHost mTabHost;    private final Actionbar mActionbar;    private final VIEwPager mVIEwPager;    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();    static final class TabInfo {        private final Class<?> clss;        private final Bundle args;        TabInfo(Class<?> _class,Bundle _args) {            clss = _class;            args = _args;        }    }    public TabsAdapter(FragmentActivity activity,VIEwPager pager) {        super(activity.getSupportFragmentManager());        mContext = activity;        mActionbar = ((SherlockFragmentActivity) activity).getSupportActionbar();        mVIEwPager = pager;        mVIEwPager.setAdapter(this);        mVIEwPager.setonPagechangelistener(this);  }    public voID addTab(Actionbar.Tab tab,Class<?> clss,Bundle args) {        TabInfo info = new TabInfo(clss,args);        tab.setTag(info);        tab.setTabListener(this);        mTabs.add(info);        mActionbar.addTab(tab);        notifyDataSetChanged();}    @OverrIDe    public int getCount()    {        int iCount = mTabs.size();        return iCount;    }    @OverrIDe    public Fragment getItem(int position)    {        TabInfo info = mTabs.get(position);        return Fragment.instantiate(mContext,info.clss.getname(),info.args);    }    @OverrIDe    public voID onPageScrolled(int position,float positionOffset,int positionOffsetPixels)    {    }    @OverrIDe    public voID onPageSelected(int position)    {        mActionbar.setSelectednavigationItem(position);    }    @OverrIDe    public voID onPageScrollStateChanged(int state)    {    }    @OverrIDe    public voID onTabSelected(Tab tab)    {        Object tag = tab.getTag();        for (int i=0; i<mTabs.size(); i++) {            if (mTabs.get(i) == tag) {                mVIEwPager.setCurrentItem(i);            }        }    }    @OverrIDe    public voID onTabUnselected(Tab tab)    {    }    @OverrIDe    public voID onTabReselected(Tab tab)    {    }}}

这是选项卡片段的代码:
编辑:

public class WebTabFragment extends SherlockFragmentActivity {@OverrIDeprotected voID onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    if(savedInstanceState == null)    {       FragmentManager fm = getSupportFragmentManager();        if (fm.findFragmentByID(androID.R.ID.content) == null) {            MyWebvIEwFragment myWebVIEw = new MyWebvIEwFragment();            fm.beginTransaction().add(androID.R.ID.content,myWebVIEw).commit();        }    }}@OverrIDepublic voID onSaveInstanceState(Bundle outState) {    super.onSaveInstanceState(outState);    //outState.putString("tabNumber",mTabNumber);}public static class MyWebvIEwFragment extends SherlockFragment {    final static private String tag = MyWebvIEwFragment.class.getSimplename();    String mTabURL;    private WebVIEw mWebVIEw = null;    static final int REFRESH_ID = Menu.FirsT;    private ProgressDialog spinnerDlg;    @OverrIDe    public voID onSaveInstanceState(Bundle outState)    {        if(mWebVIEw.saveState(outState) == null)            Log.i(tag,"Saving state Failed!");        else            Log.i(tag,"Saving state succeeded.");    }    @OverrIDe    public voID onActivityCreated(Bundle savedInstanceState)    {        super.onActivityCreated(savedInstanceState);        setHasOptionsMenu(true);    }    @OverrIDe public voID onCreateOptionsMenu(Menu menu,MenuInflater inflater) {        menu.add(Menu.NONE,REFRESH_ID,getString(R.string.refresh_string))        .setIcon(R.drawable.ic_action_refresh)        .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);    }    @OverrIDe public boolean onoptionsItemSelected(MenuItem item) {        switch (item.getItemID()) {            case REFRESH_ID:                if(mWebVIEw != null)                    mWebVIEw.reload();                return true;            default:                return super.onoptionsItemSelected(item);        }    }    /**     * When creating,retrIEve this instance's number from its arguments.     */    @OverrIDe    public voID onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        // Tell the framework to try to keep this fragment around        // during a configuration change.        setRetainInstance(true);        mTabURL = getArguments() != null ? getArguments().getString("tabURL") : "http://www.Google.com";    }    /**     * The Fragment's UI is just a simple text vIEw showing its     * instance number.     */    @OverrIDe    public VIEw onCreateVIEw(LayoutInflater inflater,VIEwGroup container,Bundle savedInstanceState) {        // Create vIEw object to return        VIEw v = inflater.inflate(R.layout.webvIEw_layout,container,false);        // Set up webvIEw object        if (mWebVIEw != null) {            mWebVIEw.destroy();        }        mWebVIEw = (WebVIEw)v.findVIEwByID(R.ID.webvIEw_fragment);        mWebVIEw.getSettings().setJavaScriptEnabled(true);        mWebVIEw.setonKeyListener(new OnKeyListener(){            @OverrIDe            public boolean onKey(VIEw v,int keyCode,KeyEvent event)            {                if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebVIEw.canGoBack()) {                    mWebVIEw.goBack();                    return true;                }                return false;            }        });        // Check to see if it has been saved and restore it if true        if(savedInstanceState != null)        {            if (savedInstanceState.isEmpty())                Log.i(tag,"Can't restore state because bundle is empty.");            else            {                if (mWebVIEw.restoreState(savedInstanceState) == null)                    Log.i(tag,"Restoring state Failed!");                else                    Log.i(tag,"Restoring state succeeded.");            }        }        else        {            // Load web page            mWebVIEw.setWebVIEwClIEnt(new MyWebVIEwClIEnt());            mWebVIEw.getSettings().setPluginsEnabled(true);            mWebVIEw.getSettings().setBuiltInZoomControls(false);            mWebVIEw.getSettings().setSupportZoom(false);            mWebVIEw.getSettings().setJavaScriptCanopenwindowsautomatically(true);            mWebVIEw.getSettings().setAllowfileAccess(true);            mWebVIEw.getSettings().setDomStorageEnabled(true);            mWebVIEw.loadUrl(mTabURL);        }        return v;    }    @OverrIDe    public voID onDestroy()    {        super.onDestroy();    }    @OverrIDe    public voID onDestroyVIEw()    {        super.onDestroyVIEw();    }    @OverrIDe    public voID onPause()    {        super.onPause();    }    @OverrIDe    public voID onResume()    {        super.onResume();    }    @OverrIDe    public voID onConfigurationChanged(Configuration newConfig)    {        // Todo auto-generated method stub        super.onConfigurationChanged(newConfig);    }    public class MyWebVIEwClIEnt extends WebVIEwClIEnt {        @OverrIDe        public boolean shouldOverrIDeUrlLoading(WebVIEw vIEw,String url) {        // YouTube vIDeo link            if (url.startsWith("http://youtu.be"))            {                String urlSubString = url.substring("http://youtu.be/".length());                String newURL = String.format("http://www.youtube.com/v/%s",urlSubString);                startActivity(new Intent(Intent.ACTION_VIEW,Uri.parse(newURL)));                return (true);            }            return (false);        }        @OverrIDe        public voID onPageStarted(WebVIEw vIEw,String url,Bitmap favicon) {            super.onPageStarted(vIEw,url,favicon);            if(spinnerDlg == null)            {                spinnerDlg = new ProgressDialog(getActivity());                spinnerDlg.setMessage("Loading....");                spinnerDlg.show();            }        }        @OverrIDe        public voID onPageFinished(WebVIEw vIEw,String url) {            super.onPageFinished(vIEw,url);            if(spinnerDlg != null)            {                spinnerDlg.dismiss();            }            spinnerDlg = null;       }    }}}
解决方法 标签计数将从0开始,因此在vIEwPager中您必须设置屏幕限制,如下所示

示例,如果您有3个标签只是给

vIEwPager.setoffscreenPagelimit(2);

总结

以上是内存溢出为你收集整理的android – onCreate每次选择一个选项卡时都会调用两个选项卡全部内容,希望文章能够帮你解决android – onCreate每次选择一个选项卡时都会调用两个选项卡所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1128977.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存