2014-02-02 4 views
1

В настоящее время я создаю приложение для камеры и имею проблему: У меня есть фрагмент, который должен содержать camerapreview. Теперь этот camerapreview представляет собой обычную реализацию, поскольку он расширяет SurfaceView.Как фрагмент взаимодействует с другим классом в Android?

Теперь мой вопрос заключается в том, как мой пользовательский операторский просмотр поговорит с фрагментом? Например, я хотел бы, чтобы мой фрагмент знал, что произошло событие касания.

Какой подход я должен использовать?

ответ

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

отлично, очень нравится подход с обратными вызовами! – user2426316

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 
    } 
} 
Смежные вопросы