片段如何与Android中的另一个类进行通信?

时间:2014-02-02 21:09:07

标签: android android-fragments surfaceview

我正在构建一个相机应用程序并遇到问题: 我有一个应该包含camerapreview的片段。现在,这个camerapreview是一个自定义实现,因为它扩展了SurfaceView

现在我的实际问题是,我的自定义相机应如何与片段对话?例如,我希望能够让我的片段知道触摸事件发生了。

我应该使用什么方法?

2 个答案:

答案 0 :(得分:2)

有多种方法可以做到这一点。如果您不需要它可以重复使用,那么具有更高耦合量的解决方案就可以了。在这种情况下,片段告诉视图自身,视图可以调用方法:

class CustomCameraPreview extends SurfaceView
{
  FragmentA fragment;
  // Call from onCreateView() in the framgnet
  public void setFragment(FragmentA fragment)
  {
    this.fragment = fragment;
  }

  private void someMethod() {
    if ( fragment != null)
      fragment.callback();

  }

}

public class FragmentA extends Fragment {

  public void callback() {
    // called from the view
  }
}

如果您需要更通用和可重用,那么创建一个接口,其中包含视图需要调用的回调类型,并让片段实现该接口。这基本上是观察者模式:http://en.wikipedia.org/wiki/Observer_pattern

interface CameraPreviewListener {

   public void callback1() ;
   public void callback2() ;

}

class CameraPreview extends SurfaceView 
{
  CameraPreviewListener listener;
  // Call from onCreateView() in the framgnet
  public void setFragment(CameraPreviewListener listener)
  {
    this.listener = listener;
  }

  private void someMethod1() {
    if ( listener != null)
      listener.callback1();    
  }

  private void someMethod2() {
    if ( listener != null)
      listener.callback2();    
  }

}

public class FragmentA extends Fragment implements CameraPreviewListener{

  public void callback1() {
    // called from the view
  }

  public void callback2() {
    // called from the view
  }
}

答案 1 :(得分:1)

Fragment对象获得了字段CameraPreview因此,如果您创建了CameraPreview内部类,则应该很容易通知您的片段类。

如果您不想将CustomCameraPreview类设为内部,请使您的片段实现MyOnClickListener,然后将此侦听器传递给您的cameraPreview对象。如果发生某些事件,请通过合适的方法通知听众

class CustomCameraPreview extends SurfaceView
{
  MyOnClickListener listener;
  // some stuff
  public void setListneer(MyOnClickListener listener)
  {
    this.listener = listener;
  }

  //// if someone touch something
  if(listener!=null)
  {
    listener.somethingWasTouched();
  }
}

interface MyOnClickListener 
{
  public void somethingWasTouched();
}

class MyFragment extends Fragment implements MyOnClickListener 
{
    @Override
    public void somethingWasTouched()
    {
     //info that something was touched / profit
    }
}