Android FragmentActivity如何在片段可见时刷新片段

时间:2013-09-04 15:34:18

标签: android android-fragments android-tabhost android-fragmentactivity

我正在为Android开发一个应用程序,需要一些帮助来实现Tabs

我需要它与android 2.2兼容 我开始实现Tabs,但现在我不知道这是不是最好的想法

我想要的基本上是:

我想打开一个活动,它会有标签
在每个选项卡中,我想加载dinamicly内容,比如play store apk:

Play Store Tabs

我的主要问题是:

我为每个片段创建了一个带有ProgressDialog的AsyncTask来加载数据并在片段上显示它,但是当片段活动打开时,它会初始化所有选项卡并使得同时加载所有片段。 / p>

我只想在Tab变为可见时加载Tab内容,因为用户可能只想看到一个标签,所以不需要获取其他标签

我该怎么做? 我应该使用TabFragments还是其他方法?

我当前的标签活动是:

public class Tabs2 extends FragmentActivity implements OnTabChangeListener, OnPageChangeListener{
ViewPagerAdapter pageAdapter;
private ViewPager mViewPager;
private TabHost mTabHost;
private String interID;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Infla o layout
    setContentView(R.layout.tablayout);

    mViewPager = (ViewPager) findViewById(R.id.viewpager);

    // Tab Initialization
    initialiseTabHost();

    // Fragments and ViewPager Initialization
    List<Fragment> fragments = getFragments();
    pageAdapter = new ViewPagerAdapter(getSupportFragmentManager(), fragments);
    mViewPager.setAdapter(pageAdapter);
    mViewPager.setOnPageChangeListener(Tabs2.this);

}

// Method to add a TabHost
private static void AddTab(Tabs2 activity, TabHost tabHost, TabHost.TabSpec tabSpec) {
    tabSpec.setContent(activity.new MyTabFactory(activity));
    tabHost.addTab(tabSpec);
}

// Manages the Tab changes, synchronizing it with Pages
public void onTabChanged(String tag) {
    int pos = this.mTabHost.getCurrentTab();
    this.mViewPager.setCurrentItem(pos);
}

// Manages the Page changes, synchronizing it with Tabs
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
    int pos = this.mViewPager.getCurrentItem();
    this.mTabHost.setCurrentTab(pos);
}

@Override
public void onPageScrollStateChanged(int arg0) {
}

@Override
public void onPageSelected(int arg0) {
}

private List<Fragment> getFragments(){

    List<Fragment> fList = new ArrayList<Fragment>();

    // Put here your Fragments
    fList.add(Fragment.instantiate(this, TabFragmentA.class.getName()));
        fList.add(Fragment.instantiate(this, TabFragmentB.class.getName()));
    fList.add(Fragment.instantiate(this, TabFragmentC.class.getName()));

    return fList;
}

// Tabs Creation
private void initialiseTabHost() {
    mTabHost = (TabHost) findViewById(android.R.id.tabhost);
    mTabHost.setup();
    // Put here your Tabs
    Tabs2.AddTab(this, this.mTabHost, this.mTabHost.newTabSpec("Tab1").setIndicator("Detalhes"));
    Tabs2.AddTab(this, this.mTabHost, this.mTabHost.newTabSpec("Tab2").setIndicator("Comentários"));
    Tabs2.AddTab(this, this.mTabHost, this.mTabHost.newTabSpec("Tab3").setIndicator("cenas"));
    mTabHost.setOnTabChangedListener(this);
}

// Um simples factory que retorna View para o TabHost
class MyTabFactory implements TabContentFactory {

    private final Context mContext;

    public MyTabFactory(Context context) {
        mContext = context;
    }

    public View createTabContent(String tag) {
        View v = new View(mContext);
        v.setMinimumWidth(0);
        v.setMinimumHeight(0);
        return v;
    }
}

}

ViewPagerAdatper:

public class ViewPagerAdapter extends FragmentPagerAdapter {
    private List<Fragment> mFragments;

    public ViewPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
        super(fm);
        mFragments = fragments;
    }

    @Override
    public Fragment getItem(int i) {  
        return mFragments.get(i);
    }

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

}

选项卡的XML活动

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
android:layout_width="fill_parent"  
android:layout_height="fill_parent"  
android:orientation="vertical" >

<TabHost 
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <LinearLayout  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:orientation="vertical" >

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="35dp"
            android:orientation="horizontal"
            android:gravity="bottom"
            android:padding="0dip" />

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="0" />

        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:isScrollContainer="true"
            android:scrollbars="vertical" />

    </LinearLayout>
</TabHost>

对于我使用片段的每个标签

public class TabFragmentA extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (container == null) {
            return null;
        }
        // HERE I Call the AsyncTask and return the data with the layout
        return (RelativeLayout) inflater.inflate(R.layout.layout_a, container, false);
    }
}

1 个答案:

答案 0 :(得分:4)

因为您正在使用viewpager,所以这是一个viewpager的工作方式,并且有充分的理由。默认情况下,视图寻呼机会加载上一个,当前和下一个选项卡,以便在用户到达选项卡时准备好内容。您不能将viewpager更改为一次只加载一个页面。

如果你发现这正是游戏商店的运作方式