【问题标题】:How should a fragment communicate with another class in Android?片段应该如何与 Android 中的另一个类进行通信?
【发布时间】:2014-02-02 21:09:06
【问题描述】:

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

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

我应该使用什么方法?

【问题讨论】:

    标签: android android-fragments surfaceview


    【解决方案1】:

    有多种方法可以做到这一点。如果您不需要它可重用,那么具有更高耦合量的解决方案是可以的。在这种情况下,fragment 会告诉视图它自己,视图可以调用一个方法:

    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
      }
    }
    

    【讨论】:

    • 太棒了,真的很喜欢回调的方法!
    【解决方案2】:

    Fragment object got field 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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多