2013-05-29 151 views
2

我在我的android應用程序中使用片段。目前,我有兩個片段以分割視圖樣式顯示,我們可以調用片段A和片段B.片段B經常更改,並且可以更改許多不同類型的片段。在不知道類類型的情況下調用對象的方法

我正在尋找調用碎片B上的方法。這種方法存在於大多數但不是所有可以顯示的碎片類型中。

以下是我有:

FragmentManager fm = getSupportFragmentManager(); 
Fragment frag = fm.findFragmentByTag("ContentFrag"); 
if (frag != null) { 
    if (frag.getClass().equals(ExampleFragment1.class)) 
     ((ExampleFragment1)frag).refresh(); 
    else if (frag.getClass().equals(ExampleFragment2.class)) 
     ((ExampleFragment2)frag).refresh(); 
    else if (frag.getClass().equals(ExampleFragment3.class)) 
     ((ExampleFragment3)frag).refresh(); 
} 

這裏是我想什麼:

FragmentManager fm = getSupportFragmentManager(); 
Fragment frag = fm.findFragmentByTag("ContentFrag"); 
if (frag != null) { 
    frag.refresh(); 
} 

是否有實現這一目標的任何方式或將我寫的if語句的負載?

感謝

回答

3

你可以讓你Fragment小號實施例如Refreshable界面,你可以檢查它。

if(frag instanceof Refreshable) 
    ((Refreshable)frag).refresh(); 
} 

這並不漂亮,但比上面的代碼更漂亮。

+0

偉大的思想家都會想:P看到你的回答讓我意識到我忘了演員! – user1646196

+0

主要問題是你不能用android框架推理,作爲最後的手段,你必須做這樣的醜陋的事情。這就像'Canvas''' drawLine'方法,與任何矢量繪圖庫相比,大多數時候都有'moveTo'和'lineTo'方法,這是遠遠不明智的。 –

2

您可以使用instanceof關鍵字來查看片段是否是這些特殊片段之一的實例。這種方法只是在你自己製作的一些片段中,或者是API的一部分?

如果是你自己讓這些片段實現了一個叫做RefreshableFragment的接口。這個接口將包含所述方法,那麼所有你需要做的是:

if(frag!=null && frag instanceof RefreshableFragment) 
    frag.refresh(); 
+0

你忘了演員。 –

+0

我對你的一個評論說,我做了,因爲我們幾乎在同一時間回答... – user1646196

+0

哦,我明白了。我沒有注意到:) –

2

的解決方案是創建一個名爲RefreshableFragment父類,有刷新()方法:

public class RefreshableFragment extends Fragment { 

public void refresh(); 
} 

所有片段類應該繼承這個類:

public class ExampleFragment1 extends RefreshableFragment { 

    public void refresh() { 
     // implementation 
    } 

} 

,那麼你可以使用刷新片段在代碼:

FragmentManager fm = getSupportFragmentManager(); 
RefreshableFragment frag = (RefreshableFragment)fm.findFragmentByTag("ContentFrag"); 
if (frag != null) { 
    frag.refresh(); 
} 
+0

'Fragment'是一個類,不是一個接口。 –

+0

@AdamArold你是對的。我編輯它。 – TalDroid

相關問題