2013-12-20 54 views
1

我正在製作一個使用操作欄選項卡(我使用支持庫的操作欄)的Android應用程序,每個都與我動態生成的片段相關聯。爲什麼FragmentTransaction.hide()不會隱藏我的片段?

這個想法是通過使用FragmentTransaction.show()選擇其選項卡並使用FragmentTransaction.hide()隱藏取消選中的選項卡來顯示片段,但是當我這樣做時,「隱藏」片段會變得略顯灰色。

事實上,用戶界面通過灰顯隱藏標籤指示某些事情不同可能表明這是故意行爲,但我的印象是hide()實際上隱藏了標籤。

我在做什麼錯了,該怎麼辦?如果需要,選項卡偵聽程序的代碼如下所示:

public class VarientTabListener implements ActionBar.TabListener 
{ 
    VarientFragment Arch_Fragment; 
    VarientFragment Plane_Fragment; 
    ActionBarActivity parent; 

    public VarientTabListener(ActionBarActivity act) 
    { 
     parent = act; 
    } 

    @Override 
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) 
    { 
     //Work out which tab was selected 
     if (tab.getText() == "Arch_Tab") 
     { 
      //Create the tab if it doesn't exist 
      if (Arch_Fragment == null) 
      { 
       Arch_Fragment = (VarientFragment) Fragment.instantiate(parent, VarientFragment.class.getName()); 
       ft.add(android.R.id.content, Arch_Fragment, "Arch"); 
      } 
      //Otherwise show it 
      else 
      { 
       ft.show(Arch_Fragment); 
      } 
     } 
     else if (tab.getText() == "Plane_Tab") 
     { 
      if (Plane_Fragment == null) 
      { 
       Plane_Fragment = (VarientFragment) Fragment.instantiate(parent, VarientFragment.class.getName()); 
       ft.add(android.R.id.content, Plane_Fragment, "Plane"); 
      } 
      else 
      { 
       ft.show(Plane_Fragment); 
      } 
     } 
    } 

    @Override 
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) 
    { 
     if (tab.getText() == "Arch_Tab") 
     { 
      if (Arch_Fragment != null) 
      { 
       //Hide the unselected tab 
       ft.hide(Arch_Fragment); 
      } 

     } 
     else if (tab.getText() == "Plane_Tab") 
     { 
      if (Plane_Fragment != null) 
      { 
       ft.hide(Plane_Fragment); 
      } 
     } 
    } 

    @Override 
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) 
    { 

    } 
} 

回答

2

因爲您以錯誤的方式比較字符串。不要用==運算符comapare字符串。

使用equals()方法比較字符串...

if (tab.getText().equals("Arch_Tab")) { 
    if (Arch_Fragment != null) { 
     //Hide the unselected tab 
     ft.hide(Arch_Fragment); 
    } 
} 
+1

不要忘記爲Hardik說... –

+0

嗯,我會同意,這是更好的做法,但因爲種種原因,這些線路實際上工作,以提交事務意圖(也許Android覆蓋了==運算符,或者這可能是純運氣),所以這不成問題。如果代碼從未運行,爲什麼隱藏的片段會變灰? – Miguel

3

你需要提交的片段

ft.hide(Arch_Fragment); 
ft.commit(); 
+0

我很確定ft.commit()是由標籤自動調用的。我從來沒有見過使用ft.commit的TabListener的例子(例如[1](http://ramsandroid4all.blogspot.com.au/2013/06/android-actionbar-tab-example-1.html),[ 2](http://arvid-g.de/12/android-4-actionbar-with-tabs-example),[3](http://www.lucazanini.eu/2012/android/tab-layout-如果我使用ft.commit() – Miguel

+0

你可以檢查這個答案==> http:// stackoverflow。我有'java.lang.IllegalStateException:提交已經調用' COM /問題/ 8432193 /如何做 - 實施 - 展示和隱藏片段的內部片段功能於安卓 – Hardik

1

雖然我沒能真正解決這個問題,解決方法是簡單地得到一個新的FragmentTransaction並在最後提交,忽略你作爲參數傳遞的事務。

例如,對於onTabUnselected方法:

@Override 
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft_unused) 
{ 
    FragmentTransaction ft = parent.getSupportFragmentManager().beginTransaction(); 
    if (tab.getText() == "Arch_Tab") 
    { 
     if (Arch_Fragment != null) 
     { 
      //Hide the unselected tab 
      ft.hide(Arch_Fragment); 
     } 

    } 
    else if (tab.getText() == "Plane_Tab") 
    { 
     if (Plane_Fragment != null) 
     { 
      ft.hide(Plane_Fragment); 
     } 
    } 
    ft.commit(); 
}