【发布时间】:2014-02-02 21:09:06
【问题描述】:
我目前正在构建一个相机应用,但遇到了一个问题:
我有一个应该包含相机预览的片段。现在这个 camerapreview 是一个自定义实现,因为它扩展了 SurfaceView。
现在我的实际问题是,我的自定义相机预览应该如何与片段对话?例如,我希望能够让我的片段知道发生了触摸事件。
我应该使用什么方法?
【问题讨论】:
标签: android android-fragments surfaceview
我目前正在构建一个相机应用,但遇到了一个问题:
我有一个应该包含相机预览的片段。现在这个 camerapreview 是一个自定义实现,因为它扩展了 SurfaceView。
现在我的实际问题是,我的自定义相机预览应该如何与片段对话?例如,我希望能够让我的片段知道发生了触摸事件。
我应该使用什么方法?
【问题讨论】:
标签: android android-fragments surfaceview
有多种方法可以做到这一点。如果您不需要它可重用,那么具有更高耦合量的解决方案是可以的。在这种情况下,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
}
}
【讨论】:
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
}
}
【讨论】: