【问题标题】:Move between different tabs without create all the times the view在不同的选项卡之间移动,而无需始终创建视图
【发布时间】:2012-10-23 10:42:54
【问题描述】:

我对我的程序有疑问。

我在操作栏中有 3 个选项卡(由片段组成),每个选项卡都显示不同的视图。这些视图具有从数据库收集的大量信息以显示图表。问题是每次我从一个选项卡切换到另一个选项卡时,阅读的信息量都很大。 问题: 有没有办法只创建一次每个视图然后在它们之间移动?

活动:

    String label1 = "one day";              
    Tab tab = actionBar.newTab();           
    tab.setText(label1);                
    TabListener<Tab1Fragment> tl = new TabListener<Tab1Fragment>(this, label1, Tab1Fragment.class);     
    tab.setTabListener(tl);                     
    actionBar.addTab(tab);                  
    String label2 = "two days";
    tab = actionBar.newTab();
    tab.setText(label2); 
    TabListener<Tab2Fragment> tl2 = new TabListener<Tab2Fragment>(this, label2, Tab2Fragment.class);
    tab.setTabListener(tl2);
    actionBar.addTab(tab);        
    String label3 = "three days";
    tab = actionBar.newTab();
    tab.setText(label3);
    TabListener<Tab3Fragment> tl3 = new TabListener<Tab3Fragment>(this, label3, Tab3Fragment.class);
    tab.setTabListener(tl3);
    actionBar.addTab(tab);

标签监听类:

private class TabListener<T extends Fragment> implements ActionBar.TabListener{

    private Fragment fragment;              
    private final Activity activity; 
    private final String tag; 
    private final Class<T> classT; 

    public TabListener(Activity activityTab, String tagTab, Class<T> classTab) { 
        activity = activityTab; 
        tag = tagTab; 
        classT = classTab; 
    } 

    public void onTabReselected(Tab tab, FragmentTransaction ft) {  
    }

    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        if (fragment == null) {                                            
           fragment = Fragment.instantiate(activity, classT.getName()); 
           ft.add(android.R.id.content, fragment, tag); 
       } else { 
           ft.attach(fragment);                            }
    } 

    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        ft.detach(fragment);
    }

和其中一个片段(3个都是一样的,只是改变了R.layout.**):

public class Tab1Fragment extends Fragment {
public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    setRetainInstance(true);
    return (LinearLayout) inflater.inflate(R.layout.main, container, false);

谢谢!

【问题讨论】:

    标签: android tabs views android-fragments


    【解决方案1】:

    每个片段都可以保留其状态。在片段构造函数中调用setRetainInstance(true)

    然后,您应该仅在尚未获取数据时才获取数据(如果您将数据存储在 List 中,请在构造函数中将该列表设置为 null,在获取数据时创建并填充它,并在 onStart 方法中,如果列表为空,则获取数据。否则,什么都不做)。

    另请参阅:Persisting list items in ListAdapter on configurationChanges with setRetainInstance

    【讨论】:

    • 我在三个片段中都加了,还是不行。我将使用一些代码进行编辑。
    猜你喜欢
    • 2016-05-03
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多