开发者社区> 问答> 正文

android tabhost 跨点击出错(代码已贴出)?报错

问题:

开发android应用,用tabhost + ViewPager 实现左右滑动页面效果。只要是顺时或逆时,无论点击tab或者手势滑动都没有问题,问题是:如果跨一个或者多个tab点击,就会出错,强行退出应用。

以下是主要代码,当跨tab点击时,onTabChanged()这个方法有错,比如当前是第一个tab,然后点击第三个tab,这时代码mPager.setCurrentItem(2);这个出错!

请各位指教!


public class MainActivity extends Activity {
	TabHost mTabHost;
	@SuppressWarnings("deprecation")
	LocalActivityManager manager;
	@SuppressWarnings("deprecation")
	String newsTag = "T1";
	String starTag = "T2";
	String carmeTag = "T3";
	String buyTag = "T4";
	String setTag = "T5";
	

	// ViewPager是google SDk中自带的一个附加包的一个类,可以用来实现屏幕间的切换。
	// android-support-v4.jar
	ViewPager mPager;//页卡内容
	private List<View> listViews; // Tab页面列表

	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.content);
		
		
		mTabHost = (TabHost) findViewById(android.R.id.tabhost);
		manager = new LocalActivityManager(MainActivity.this, false);
		manager.dispatchCreate(savedInstanceState);
		mTabHost.setup(manager);
		mTabHost.setOnTabChangedListener(new tabListener());
		
		Intent newsIntent = new Intent(MainActivity.this, NewsFragmentActivity.class);
		Intent starIntent = new Intent(MainActivity.this, StarFragmentActivity.class);
		Intent camerIntent = new Intent(MainActivity.this, CameraActivity.class);
		Intent buyIntent = new Intent(MainActivity.this, BuyActivity.class);
		Intent settingIntent = new Intent(MainActivity.this, SettingActivity.class);

		mPager = (ViewPager) findViewById(R.id.viewpager);
		listViews = new ArrayList<View>();
		listViews.add(manager.startActivity(newsTag, newsIntent).getDecorView());
		listViews.add(manager.startActivity(starTag, starIntent).getDecorView());
		listViews.add(manager.startActivity(carmeTag, camerIntent).getDecorView());
		listViews.add(manager.startActivity(buyTag, buyIntent).getDecorView());
		listViews.add(manager.startActivity(setTag, settingIntent).getDecorView());
//
		mPager.setAdapter(new MyPagerAdapter(listViews));
		mPager.setCurrentItem(0);
		mPager.setOnPageChangeListener(new MyOnPageChangeListener());

		mTabHost.addTab(mTabHost
				.newTabSpec(newsTag)
				.setContent(newsIntent)
				.setIndicator(getResources().getString(R.string.news),
						getResources().getDrawable(R.drawable.tab_icon_news)));
		mTabHost.addTab(mTabHost
				.newTabSpec(starTag)
				.setContent(starIntent)
				.setIndicator(getResources().getString(R.string.star),
						getResources().getDrawable(R.drawable.tab_icon_news)));
		mTabHost.addTab(mTabHost
				.newTabSpec(carmeTag)
				.setContent(camerIntent)
				.setIndicator(getResources().getString(R.string.camera),
						getResources().getDrawable(R.drawable.tab_icon_news)));
		mTabHost.addTab(mTabHost
				.newTabSpec(buyTag)
				.setContent(buyIntent)
				.setIndicator(getResources().getString(R.string.buy),
						getResources().getDrawable(R.drawable.tab_icon_news)));
		mTabHost.addTab(mTabHost
				.newTabSpec(setTag)
				.setContent(settingIntent)
				.setIndicator(getResources().getString(R.string.set),
						getResources().getDrawable(R.drawable.tab_icon_news)));
		

		
//		mTabHost.setCurrentTab(0);
		updateTab(mTabHost);
//		InitViewPager(manager);	
		
		
		
		
	}

	@SuppressWarnings("deprecation")
	@Override
	protected void onPause() {
		manager.dispatchPause(isFinishing());
		super.onPause();
	}

	@SuppressWarnings("deprecation")
	@Override
	protected void onResume() {
		manager.dispatchResume();
		super.onResume();
	}

	@Override
	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		outState.putString("tab", mTabHost.getCurrentTabTag());
	}

	class tabListener implements TabHost.OnTabChangeListener {
	    
		@Override
		public void onTabChanged(String tabId) {
			updateTab(mTabHost);
		
			if(newsTag.equals(tabId)) {
				mPager.setCurrentItem(0);
			} else if(starTag.equals(tabId)) {
				mPager.setCurrentItem(1);
			} else if(carmeTag.equals(tabId)) {
				mPager.setCurrentItem(2);
			} else if(buyTag.equals(tabId)) {
				mPager.setCurrentItem(3);
			} else if(setTag.equals(tabId)) {
				mPager.setCurrentItem(4);
			}
			
		}
	    

	}

	private void InitViewPager(final LocalActivityManager manager) {
		mPager = (ViewPager) findViewById(R.id.viewpager);
		listViews = new ArrayList<View>();
//		LayoutInflater mInflater = getLayoutInflater();
//		listViews.add(mInflater.inflate(R.layout.red_module_news, null));
//		listViews.add(mInflater.inflate(R.layout.red_module_star, null));
//		listViews.add(mInflater.inflate(R.layout.red_module_camera, null));
//		listViews.add(mInflater.inflate(R.layout.red_module_buy, null));
//		listViews.add(mInflater.inflate(R.layout.red_module_setting, null));
		
//		System.out.println("hello");
//		 System.out.println(new MyPagerAdapter(listViews));
		mPager.setAdapter(new MyPagerAdapter(listViews));
		mPager.setCurrentItem(0);
		mPager.setOnPageChangeListener(new MyOnPageChangeListener());
	}
	
	/**
	 * ViewPager适配器
	 */
	public class MyPagerAdapter extends PagerAdapter {
		public List<View> mListViews;

		public MyPagerAdapter(List<View> mListViews) {
			this.mListViews = mListViews;
		}

		@Override
		public void destroyItem(View arg0, int arg1, Object arg2) {
			((ViewPager) arg0).removeView(mListViews.get(arg1));
		}

		@Override
		public void finishUpdate(View arg0) {
		}

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

		@Override
		public Object instantiateItem(View arg0, int arg1) {
			((ViewPager) arg0).addView(mListViews.get(arg1));
			return mListViews.get(arg1);
		}

		@Override
		public boolean isViewFromObject(View arg0, Object arg1) {
			return arg0 == (arg1);
		}

		@Override
		public void restoreState(Parcelable arg0, ClassLoader arg1) {
		}

		@Override
		public Parcelable saveState() {
			return null;
		}

		@Override
		public void startUpdate(View arg0) {
		}
	}

	/**
	 * 页卡切换监听
	 */
	public class MyOnPageChangeListener implements OnPageChangeListener {

		@Override
		public void onPageSelected(int arg0) {
			mTabHost.setCurrentTab(arg0);
		}

		@Override
		public void onPageScrolled(int arg0, float arg1, int arg2) {
		}

		@Override
		public void onPageScrollStateChanged(int arg0) {
		}
	}
}

报错信息:

10-28 10:53:00.876: E/AndroidRuntime(3776): FATAL EXCEPTION: main
10-28 10:53:00.876: E/AndroidRuntime(3776): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
10-28 10:53:00.876: E/AndroidRuntime(3776): at android.view.ViewGroup.addViewInner(ViewGroup.java:3435)
10-28 10:53:00.876: E/AndroidRuntime(3776): at android.view.ViewGroup.addView(ViewGroup.java:3306)
10-28 10:53:00.876: E/AndroidRuntime(3776): at android.support.v4.view.ViewPager.addView(ViewPager.java:1111)
10-28 10:53:00.876: E/AndroidRuntime(3776): at android.view.ViewGroup.addView(ViewGroup.java:3251)
10-28 10:53:00.876: E/AndroidRuntime(3776): at android.view.ViewGroup.addView(ViewGroup.java:3227)
10-28 10:53:00.876: E/AndroidRuntime(3776): at com.red.main.MainActivity$MyPagerAdapter.instantiateItem(MainActivity.java:239)
10-28 10:53:00.876: E/AndroidRuntime(3776): at android.support.v4.view.PagerAdapter.instantiateItem(PagerAdapter.java:110)
10-28 10:53:00.876: E/AndroidRuntime(3776): at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:692)
10-28 10:53:00.876: E/AndroidRuntime(3776): at android.support.v4.view.ViewPager.populate(ViewPager.java:821)
10-28 10:53:00.876: E/AndroidRuntime(3776): at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:469)
10-28 10:53:00.876: E/AndroidRuntime(3776): at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:441)
10-28 10:53:00.876: E/AndroidRuntime(3776): at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:422)
10-28 10:53:00.876: E/AndroidRuntime(3776): at com.red.main.MainActivity$tabListener.onTabChanged(MainActivity.java:186)
10-28 10:53:00.876: E/AndroidRuntime(3776): at android.widget.TabHost.invokeOnTabChangeListener(TabHost.java:463)
10-28 10:53:00.876: E/AndroidRuntime(3776): at android.widget.TabHost.setCurrentTab(TabHost.java:448)
10-28 10:53:00.876: E/AndroidRuntime(3776): at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:161)
10-28 10:53:00.876: E/AndroidRuntime(3776): at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:563)
10-28 10:53:00.876: E/AndroidRuntime(3776): at android.view.View.performClick(View.java:4354)
10-28 10:53:00.876: E/AndroidRuntime(3776): at android.view.View$PerformClick.run(View.java:17948)
10-28 10:53:00.876: E/AndroidRuntime(3776): at android.os.Handler.handleCallback(Handler.java:725)
10-28 10:53:00.876: E/AndroidRuntime(3776): at android.os.Handler.dispatchMessage(Handler.java:92)
10-28 10:53:00.876: E/AndroidRuntime(3776): at android.os.Looper.loop(Looper.java:137)
10-28 10:53:00.876: E/AndroidRuntime(3776): at android.app.ActivityThread.main(ActivityThread.java:5293)
10-28 10:53:00.876: E/AndroidRuntime(3776): at java.lang.reflect.Method.invokeNative(Native Method)
10-28 10:53:00.876: E/AndroidRuntime(3776): at java.lang.reflect.Method.invoke(Method.java:511)
10-28 10:53:00.876: E/AndroidRuntime(3776): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
10-28 10:53:00.876: E/AndroidRuntime(3776): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
10-28 10:53:00.876: E/AndroidRuntime(3776): at dalvik.system.NativeStart.main(Native Method)


展开
收起
爱吃鱼的程序员 2020-06-22 14:48:08 453 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    你应该贴出错误信息及代码。<divclass="ref">

    引用来自“铂金小猫”的答案

    <divclass=ref_body>你应该贴出错误信息及代码。回复<aclass='referer'target='_blank'>@张婉玲:你的mPager对象估计存在这个问题http://blog.csdn.net/yaolingrui/article/details/7339913回复<aclass='referer'target='_blank'>@铂金小猫:报错信息已贴出,谢谢!贴一下报错信息。

    左右滑动只要viewpager就行了,要tabhost干嘛?Tab的效果完全可以自己用几个Button实现,或者用ActionBar的Tab,现在ActionBar有低版本support包了,v7,2.1以上都可以用了

    2020-06-22 14:48:27
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
58同城Android客户端Walle框架演进与实践之路 立即下载
Android组件化实现 立即下载
蚂蚁聚宝Android秒级编译——Freeline 立即下载