当我选择任何选项卡时,将按预期调用相关片段的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每次选择一个选项卡时都会调用两个选项卡所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)