2015-11-11 55 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