Tabhost 和 android.support.v4.view.ViewPager 整合的问题
最近在做一个将tabhost 改成 tabcontent 部位可左右滑动的东西。使用了谷歌提供的android.support.v4 包里面的viewpager组件.
原理就是把tabhost 里原有的的tabcontent 隐藏掉,加一个viewpager,捕捉事件进而进行互相刷新的动作。
唯一有所不同的就是tabhost里的content是各个单独的Activity.
具体代码如下:
主窗口
- Java code
package org.xzx;import android.app.Activity;import android.app.LocalActivityManager;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.os.Parcelable;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager.OnPageChangeListener;import android.view.View;import android.widget.TabHost;import android.widget.TabHost.OnTabChangeListener;import java.util.ArrayList;public class TestViewpageActivity extends Activity { Context context = null; LocalActivityManager manager = null; ViewPager pager = null; TabHost tabHost = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); context = TestViewpageActivity.this; manager = new LocalActivityManager(this, true); manager.dispatchCreate(savedInstanceState); tabHost = (TabHost) findViewById(android.R.id.tabhost); tabHost.setup(); tabHost.setup(manager); tabHost.addTab(tabHost.newTabSpec("A").setIndicator("A") .setContent(new Intent(context, A.class))); tabHost.addTab(tabHost.newTabSpec("B").setIndicator("B") .setContent(new Intent(context, B.class))); tabHost.addTab(tabHost.newTabSpec("C").setIndicator("C") .setContent(new Intent(context, C.class))); tabHost.addTab(tabHost.newTabSpec("D").setIndicator("D") .setContent(new Intent(context, D.class))); tabHost.setOnTabChangedListener(new OnTabChangeListener() { @Override public void onTabChanged(String tabId) { if ("A".equals(tabId)) { pager.setCurrentItem(0); } else if ("B".equals(tabId)) { pager.setCurrentItem(1); } else if ("C".equals(tabId)) { pager.setCurrentItem(2); } else { pager.setCurrentItem(3); } } }); pager = (ViewPager) findViewById(R.id.viewpage); final ArrayList<View> list = new ArrayList<View>(); Intent intent = new Intent(context, A.class); list.add(getView("A", intent)); Intent intent2 = new Intent(context, B.class); list.add(getView("B", intent2)); Intent intent3 = new Intent(context, C.class); list.add(getView("C", intent3)); Intent intent4 = new Intent(context, D.class); list.add(getView("D", intent4)); pager.setAdapter(new PagerAdapter() { @Override public void destroyItem(View arg0, int arg1, Object arg2) { ViewPager pViewPager = ((ViewPager) arg0); pViewPager.removeView(list.get(arg1)); } @Override public void finishUpdate(View arg0) { } @Override public int getCount() { return list.size(); } @Override public Object instantiateItem(View arg0, int arg1) { ViewPager pViewPager = ((ViewPager) arg0); pViewPager.addView(list.get(arg1)); return list.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) { } }); pager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int arg0) { tabHost.setCurrentTab(arg0); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int arg0) { } }); } private View getView(String id, Intent intent) { return manager.startActivity(id, intent).getDecorView(); }}
对应的布局:
- XML code
<?xml version="1.0" encoding="utf-8"?><TabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/tabhost" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:id="@+id/linearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TabWidget android:id="@android:id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" > </TabWidget> <android.support.v4.view.ViewPager android:id="@+id/viewpage" android:layout_width="match_parent" android:layout_height="match_parent" /> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone" > </FrameLayout> </LinearLayout></TabHost>
子窗口A:
- Java code
/** * */package org.xzx;import android.app.Activity;import android.os.Bundle;/** * @author sharl * @date 2012-2-23 上午10:51:57 * @usage */public class A extends Activity { /** * */ public A() { } /* * (non-Javadoc) * @see android.app.Activity#onCreate(android.os.Bundle) */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.a); }}对应的布局:
- XML code
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:text="AAAAAAAAAAAA" /></LinearLayout>
还有类似于A.class 的B.class、C.class、D.class. 不列举.
问题来了,当我左右滑动viewpager的时候,A 和 B 不能同时显示出来,只有等滑过来了之后,才会显示下一个标签里的内容。
求高手解释,谢谢.
[解决办法]
使用官方的代码时,提示找不到FragmentStackSupport、LoaderCursorSupport、LoaderCustomSupport、LoaderThrottleSupport四个类,我去android-support-v4.jar中找不到相应的类,应该怎么处理呀?
[解决办法]
官方有个例子呀,可以去研究一下!
[解决办法]
主Activity继承TabActivity,
然后
tabHost = (TabHost) findViewById(android.R.id.tabhost);
tabHost.setup();
tabHost.setup(manager);
改成 tabHost = getTabHost();
就可以实现内容的和动画同步了
另外你的OnTabChangeListener()有问题,跨一个tab点击就会出错,
是if判断的问题,不用else