【问题标题】:Android FragmentActivity How to refresh fragment when it become visibleAndroid FragmentActivity 如何在片段可见时刷新片段
【发布时间】:2013-09-04 15:34:17
【问题描述】:

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

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

我想要的基本上是:

我想打开一个包含标签的活动
在每个选项卡中,我想动态加载内容,例如 play store apk:


我的主要问题是:

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

我只想在选项卡可见时才加载选项卡内容,因为用户可能只想看到一个选项卡,所以不需要获取其他选项卡

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

我当前的 Tab 活动是:

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);
    }
}

【问题讨论】:

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


    【解决方案1】:

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

    如果您注意到这正是 Play 商店的运作方式

    【讨论】:

    • 我应该用别的东西代替viewpager吗?
    • 你可以在没有viewpager的情况下做标签,你只会失去滑动
    • 我发现它可以在片段上运行:@Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { //do something } } 这是一个丑陋的解决方案,但它可以工作 xD
    • @Daniel Dias 在片段中在哪里使用上述函数以及如何告诉。!!
    • 我在片段类中添加了“setUserVisibleHint”方法
    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多