所以我遇到了一些设计模式混乱/问题。我有一个Fragment需要调用MainActivity中未在Fragment接口中定义的方法。一个明显的解决方案就是将附加的Activity转换为MainActivity,但这不会破坏接口的目的吗?
这是我的MainActivity有方法a(),b()和c():
public class MainActivity extends Activity implements AInterface, CInterface {
@Override
public void a(){//method A body}
public void b(){//method b body} //no Override
@Override
public void c(){//method C body}
}
这是我的片段类,需要a(),b()和c()。 方法c()来自另一个Fragment的接口:
public class SomeFragment extends Fragment{
private AInterface mActivity;
@Override
public void onAttach(Activity activity) {
mActivity = (AInterface)activity;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.my_layout, container, false);
mActivity.a();
(MainActivity) mActivity.b(); //is it ok to just call it like this?
(MainActivity) mActivity.c(); //is it ok to just call it like this?
return v;
}
public interface AInterface{
public void a();
}
}
这是调用这些方法的正确方法吗?感谢。
答案 0 :(得分:1)
我不这样做,因为你在你的Activity和你的片段之间建立了紧密耦合。
更好的方法是使用回调。
public class MenuFragment extends Fragment {
public interface Interface1{
public void b();
}
public interface Interface2 extends Interface1{
public void a();
}
public interface Interface3 extends Interface1{
public void c();
}
Interface2 mCallback;
@Override
public void onAttach(Activity activity){
super.onAttach(activity);
try {
mCallback = (Interface2 ) activity;
}
catch (ClassCastException e) {
throw new ClassCastException(activity.toString()+ " must implement ItemselectedCallback");
}
}
@Override
public void onDetach(){
mCallback = null;
super.onDetach();
}
//somewhere
mCallback.a();
}
然后,您的活动将实现回调接口并处理回调。
public class TaskActivity extends Activity implements MenuFragment.Inferface2, MenuFragment.Interface3{
public void a() {
//do something
}
public void b() {
//do something
}
public void c() {
//do something
}
}
答案 1 :(得分:0)
是的,你可以做到这一点,它会起作用,但是你也需要在铸造失败时小心(可以用instanceof解决)
它还会使您的SomeFragment类与您的MainActivity类相关联,这不是最佳实践
我认为更好更安全的方法是使用界面。