读书人

Tabhost 和 android.support.v4.view.

发布时间: 2012-03-27 13:44:24 作者: rapoo

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

读书人网 >Android

热点推荐