1

我有一個片段活動,它包含三個片段。選擇ActionbarSherlock選項卡時創建片段

public class MainActivity extends SherlockFragmentActivity { 
/** Called when the activity is first created. */ 

@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    ActionBar bar = getSupportActionBar(); 
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    ActionBar.Tab tab1 = bar.newTab(); 
    ActionBar.Tab tab2 = bar.newTab(); 
    ActionBar.Tab tab3 = bar.newTab(); 
    tab1.setText(""); 
    tab1.setIcon(R.drawable.abs__ic_menu_share_holo_dark); 
    tab2.setText(""); 
    tab2.setIcon(R.drawable.abs__ic_voice_search); 
    tab3.setText(""); 
    tab3.setIcon(R.drawable.abs__ic_cab_done_holo_dark); 

    if (savedInstanceState == null) { 

     tab1.setTabListener(new MyTabListener()); 
     tab2.setTabListener(new MyTabListener()); 
     tab3.setTabListener(new MyTabListener()); 
     bar.addTab(tab1); 
     bar.addTab(tab2); 
     bar.addTab(tab3); 

    } 
} 

private class MyTabListener implements ActionBar.TabListener { 
    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 

     switch (tab.getPosition()) { 
     case 0: 

      FeedsActivity frag = new FeedsActivity(); 

      ft.replace(android.R.id.content, frag); 
      return; 

     case 1: 
      ProfileActivity frag2 = new ProfileActivity(); 
      ft.replace(android.R.id.content, frag2); 
      return; 
     case 2: 
      MyMemoirsActivity frag3 = new MyMemoirsActivity(); 
      ft.replace(android.R.id.content, frag3); 
      return; 

     } 

    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
     // TODO Auto-generated method stub 
    } 
} 

}

這裏是第一個片段,

public class FeedsActivity extends SherlockFragment { 

public static String[] MainCategory; 
public static String[] MainCategoryId; 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup group, 
     Bundle saved) { 
    setRetainInstance(true); 
    return inflater.inflate(R.layout.activity_feeds, group, false); 
} 



@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 



     new GetMainCategory(getActivity()).execute(); 




} 
} 

當我選擇第二個選項卡,然後選擇第一個選項卡中的第一個片段異步任務被稱爲again.How我能保持狀態的第一個片段,以便它的視圖被創建一次?我用setRetainInstance(true)但沒有工作。

+1

不要替換這些片段,而是在需要時隱藏/使它們可見。 – Luksprog 2013-04-18 06:31:43

+0

謝謝。你能幫我解決嗎?我該怎麼做? – 2013-04-18 06:33:47

回答

2

我通過使用show和hide代替attach和detach來解決這個問題。

private class MyTabListener implements ActionBar.TabListener { 
     @Override 
     public void onTabSelected(Tab tab, FragmentTransaction ft) { 

      switch (tab.getPosition()) { 
      case 0: 

       if (frag1 == null) { 
        // If not, instantiate and add it to the activity 
        frag1 = Fragment.instantiate(getApplicationContext(), 
          FeedsActivity.class.getName()); 
        ft.add(android.R.id.content, frag1, "Feeds"); 
       } else { 
        // If it exists, simply attach it in order to show it 
        ft.show(frag1); 
       } 
       return; 

      case 1: 
       if (frag2 == null) { 
        // If not, instantiate and add it to the activity 
        frag2 = Fragment.instantiate(getApplicationContext(), 
          ProfileActivity.class.getName()); 
        ft.add(android.R.id.content, frag2, "Profile"); 
       } else { 
        // If it exists, simply attach it in order to show it 
        ft.show(frag2); 
       } 
       return; 
      case 2: 

       if (frag3 == null) { 
        // If not, instantiate and add it to the activity 
        frag3 = Fragment.instantiate(getApplicationContext(), 
          History.class.getName()); 
        ft.add(android.R.id.content, frag3, "History"); 
       } else { 
        // If it exists, simply attach it in order to show it 
        ft.show(frag3); 
       } 

       return; 

      } 

     } 

     @Override 
     public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
      // TODO Auto-generated method stub 
      if (frag1 != null) { 
       // Detach the fragment, because another one is being attached 
       switch (tab.getPosition()) { 
       case 0: 
        ft.hide(frag1); 
        return; 
       case 1: 
        ft.hide(frag2); 
        return; 
       case 2: 
        ft.hide(frag3); 
        return; 

       } 

      } 
     } 

     @Override 
     public void onTabReselected(Tab tab, FragmentTransaction ft) { 
      // TODO Auto-generated method stub 
     } 
    } 
+0

你在哪裏得到frag1變量@BasimSherif? – gumuruh 2014-09-12 06:59:45

1

使用TabListener正確的方法是這樣的:

@Override 
public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    // Check if the fragment is already initialized 
    if (mFragment == null) { 
     // If not, instantiate and add it to the activity 
     mFragment = Fragment.instantiate(mActivity, mClass.getName()); 
     ft.add(android.R.id.content, mFragment, mTag); 
    } else { 
     // If it exists, simply attach it in order to show it 
     ft.attach(mFragment); 
    } 
} 

@Override 
public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
    if (mFragment != null) { 
     // Detach the fragment, because another one is being attached 
     ft.detach(mFragment); 
    } 
} 

@override 
public void onTabReselected(Tab tab, FragmentTransaction ft) { 
    // User selected the already selected tab. Usually do nothing. 
} 

基本上你需要檢查,如果這是第一次,當你的片斷被初始化。如果不是,則應將其添加到屏幕中,並且當用戶取消選擇一個選項卡時,應該分離當前可見片段並添加新片段。這是它應該工作的方式。每次用戶單擊選項卡時,都不需要創建新的Fragment實例。

+0

Thanks.I嘗試了這段代碼,但是當調用ft.attach(mFragment)時,視圖被重新創建並且異步任務再次執行。 – 2013-04-18 06:58:10

+0

唯一的地方,你可以把這個代碼,所以它不會執行每次你的片段是可見的onCreateView我記得(但你應該嘗試它)。 onActivityCreated,onCreate每次你的片段變得可見時都會觸發。\ – hardartcore 2013-04-18 07:02:37

+0

我在onCreateView中放置了「new GetMainCategory(getActivity())。execute()」。但沒有運氣:( – 2013-04-18 07:04:48

相關問題