我在一个活动中有多个片段,应该能够在它们之间传递数据。我用过教程来实现回调。我的MainActivity是我的片段类所在的外部类。此外,我有一个处理片段转换的FragmentPagerAdapter。 好吧,Eclipse不会让我实现我的回调接口,它包含在一个Fragments中,用于我的MainActivity外部类。
这是我的代码的结构:
public class MainActivity extends FragmentActivity **implements ConnectionFragment.dataCallback**{
//compiler error here:"ConnectionFragment cannot be resolved to a type"
//when i leave this out i get runtime error: "MainActivity java must
//implement dataCallback"
...
public class SectionsPagerAdapter extends FragmentPagerAdapter implements ConnectionFragment.dataCallback{
@Override
public void updateLog(View v, String line) {
DataFragment dataFrag = (DataFragment)getSupportFragmentManager().findFragmentByTag(DataFragment.class.getName());
if (dataFrag != null){
dataFrag.updateLog(v,line);
}
}
...
}
public static class ConnectionFragment extends Fragment {
...
public interface dataCallback{
public void updateLog(View v, String line);
}
dataCallback mCallback;
private static dataCallback dummyCallback=new dataCallback(){
@Override
public void updateLog(View v, String line){
}
};
@Override
public void onAttach(Activity activity){
super.onAttach(activity);
try {
mCallback = (dataCallback)activity;
} catch (ClassCastException e){
throw new ClassCastException(activity.toString() + " must implement dataCallback");
}
}
}
public static class DataFragment extends Fragment implements ConnectionFragment.dataCallback{
public void updateLog(View v,String line){
TextView logTextView=(TextView)v.findViewById(R.id.log_view);
logTextView.append("\n"+line);
}
...
}
public static class GraphFragment extends Fragment {
...
}
}
ConnectionFragment应该能够将数据发送到DataFragment。
感谢您的帮助!
答案 0 :(得分:3)
您无法实现内部接口或扩展内部类。只需将ConnectionFragment
移动到自己的文件中即可。
这是因为在编译时,这些内部类依赖于父类 - 而且从不相反。作为证据,如果您查看已编译的 .class 文件,这些内部对象将被编译为MainActivity$ConnectionFragment.class
或其他内容。但是,如果将ConnectionFragment
编译到自己的文件(ConnectionFragment.cass
)中,则MainActivity.class
可以依赖它,Eclipse将自动处理构建顺序。
答案 1 :(得分:0)
片段永远不会直接相互影响,因为这会产生不希望的耦合。
你的片段应该调用Activity实现的接口方法与Activity通信,然后Activity可以与其他片段进行通信/中继。
答案 2 :(得分:-1)
在您声明界面之前,您似乎无法使用界面。