2015-11-11 56 views
2

我已經搜索過這個問題,但無法找到任何可以解決我的問題的東西。我的問題是,我有一個活動,其中包含不斷更新不同片段的FrameLayout。頂視圖和底視圖將保持相同,因此它們在 活動的佈局中。使用界面從活動與片段之間的溝通

正如你所看到的底部視圖有一個單擊按鈕,我想對將出現在FrameLayout中的片段進行更改。

enter image description here

我創建了一個接口

public interface ShowFormula { 

    void showFormula(boolean show); 

} 

,我將使用在片段來實現。 現在在我的MainActivity類別主要的問題我試圖初始化界面,但不能因爲我得到類轉換異常

showFormula = (ShowFormula) this;//yes i know this is wrong 

我應該怎樣才能與該片通信初始化此。 主要目標是在點擊活動中的按鈕時切換片段中的視圖。

在此先感謝。

+1

在片段上實現您的接口,並在片段創建時將其分配給您的接口變量。你按照相反的順序來做,它沒有意義存儲對此的引用,並且因爲你已經在片段中實現了接口(Thats OK),所以它會崩潰。 – Nanoc

+0

但我怎麼會得到按鈕點擊監聽事件的片段,因爲按鈕是在活動的佈局中存在。多數民衆贊成我已經試圖以相反的順序實施,所以當用戶點擊活動中的按鈕,我可以切換目前在片段中的視圖的可見性。 – Swapnil

+0

使用接口通知您的按鈕片段單擊 – Nanoc

回答

3

你並不需要使用一個接口,從活動的片段撥打電話。只需保留對當前片段的引用,並從該活動中調用碎片中的公共方法。

如果你有多個Fragments並且你不想爲每個Fragment保留一個引用,你可以創建一個Fragment基類,在基類中聲明常用的方法,然後在你所有的方法中實現該方法覆蓋從基礎片段繼承的片段。然後,保留基本片段類型的一個引用,並始終將其設置爲當前顯示的片段。

+1

是......的確如此。謝謝@Daniel Nugent – Swapnil

1

一個乾淨的解決方案:

`public interface ShowFormula { 
    public void showFormula(boolean show); 
}` 

`public class MyActivity implements ShowFormula { 
    ... 
    @Override 
    public void showFormula(boolean show) { 
    /** Your Code **/ 
    } 
    ... 
}` 

`public class MyFragment { 
    private ShowFormula listener; 
    ... 
    @Override 
    public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    try { 
     listener = (ShowFormula) activity; 
     // listener.showFormula(show?); 
    } catch (ClassCastException castException) { 
     /** The activity does not implement the listener. **/ 
    } 
    } 
    ... 
}` 
+0

這是片段 - >活動,而不是活動 - >片段 – Linxy