Android:使用MainActivity中的方法未在界面中定义的片段?

时间:2015-03-25 08:22:44

标签: java android android-fragments

所以我遇到了一些设计模式混乱/问题。我有一个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();
     }
}

这是调用这些方法的正确方法吗?感谢。

2 个答案:

答案 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类相关联,这不是最佳实践 我认为更好更安全的方法是使用界面。