我正在构建一个相机应用程序并遇到问题:
我有一个应该包含camerapreview的片段。现在,这个camerapreview是一个自定义实现,因为它扩展了SurfaceView
。
现在我的实际问题是,我的自定义相机应如何与片段对话?例如,我希望能够让我的片段知道触摸事件发生了。
我应该使用什么方法?
答案 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
}
}