как вызвать интерфейс из класса TouchableWrapper в Android

Мне нужно вызвать интерфейс, дважды нажав на google mapFragment.

Теперь я могу обнаружить двойной тап по карте.

Это мой класс TouchableWrapper

public class TouchableWrapper extends FrameLayout {


GestureDetectorCompat mGestureDetector;



public TouchableWrapper(Context context) {

    super(context);
    mGestureDetector = new GestureDetectorCompat(context, mGestureListener);
}
private final GestureDetector.SimpleOnGestureListener mGestureListener
        = new GestureDetector.SimpleOnGestureListener() {
    @Override
    public boolean onDoubleTap(MotionEvent e) {
        Log.e("GestureDetector", "Executed");

      //here i need to call my interface method

        return true;
    }
};
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    mGestureDetector.onTouchEvent(ev);


    return super.onInterceptTouchEvent(ev);
}
}

это мой интерфейс

public interface OnMapInterCept {

void OnInterCeptMap(String isMapTap);

}

Ниже MapFragment я использую

public class CustomMapFragment extends MapFragment {
public View mOriginalContentView;
public TouchableWrapper mTouchView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
    mOriginalContentView = super.onCreateView(inflater, parent, savedInstanceState);
    mTouchView = new TouchableWrapper(getActivity());
    mTouchView.addView(mOriginalContentView);


    return mTouchView;

}

@Override
public View getView() {
    return mOriginalContentView;
}

}

Как я буду называть этот интерфейс, мне нужно увеличить карту по центру, дважды нажав на MapFragment внутри фрагмента.

Пожалуйста, мне нужна помощь. Спасибо.


person sunil    schedule 20.01.2017    source источник


Ответы (2)


Вы должны реализовать свой интерфейс OnMapInterCept в MainActivity или любой вашей активности или фрагменте, из которого вы вызываете свой класс TouchableWrapper, и отправить его ссылку с контекстом, как код ниже.

 public class MainActivity extends Activity implements OnMapInterCept{

 // other code here


 // when you will call TouchableWrapper, call it like this-
 TouchableWrapper(context,this);

 @Override
 void OnInterCeptMap(String isMapTap){
    // do what you want 

 }
 }

Теперь внесите некоторые изменения в класс TouchableWrapper.

 public class TouchableWrapper extends FrameLayout {


 GestureDetectorCompat mGestureDetector;
 OnMapInterCept mapInterCept;



 public TouchableWrapper(Context context, OnMapInterCept mapInterCept) {

     super(context);
     mGestureDetector = new GestureDetectorCompat(context, mGestureListener);
     this.mapInterCept = mapInterCept;
 }
 private final GestureDetector.SimpleOnGestureListener mGestureListener
    = new GestureDetector.SimpleOnGestureListener() {
     @Override
     public boolean onDoubleTap(MotionEvent e) {
         Log.e("GestureDetector", "Executed");

       //here i need to call my interface method

        // here is your interface's method body
         mapInterCept.OnInterCeptMap("your string value as a result");

         return true;
     }
 };
 @Override
 public boolean onInterceptTouchEvent(MotionEvent ev) {
     mGestureDetector.onTouchEvent(ev);


     return super.onInterceptTouchEvent(ev);
 }
 }

Я надеюсь, что это будет полезно, и не забудьте проголосовать за ответ.

person D_Alpha    schedule 20.01.2017
comment
Я не могу вызвать TouchableWrapper (контекстный контекст, это), я вызываю его из customMapFragment. - person sunil; 20.01.2017
comment
проверьте мой отредактированный код. Куда бы вы ни звонили, передайте два аргумента вашему классу TouchableWrapper(context, this) . - person D_Alpha; 20.01.2017
comment
Я реализовал mTouchView = new TouchableWrapper(getActivity()); в customMapFragment. и я реализовал интерфейс, но приложение вылетает, я не могу добавить TouchableWrapper(context,this); потому что расширен с помощью FrameLayout - person sunil; 20.01.2017
comment
реализовать интерфейс в вашем классе customMapFragment, подобно этому: общедоступный класс customMapFragment extends MapFragment реализует OnMapInterCept . И измените реализацию TouchableWrapper следующим образом: mTouchView = new TouchableWrapper(getActivity(), this); - person D_Alpha; 21.01.2017

Я расширяю SupportMapFragment для обработки касаний. Проверь это:

public class WorkaroundMapFragment extends SupportMapFragment {
    private OnTouchListener mListener;

    @Override
    public View onCreateView(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle savedInstance) {
        View layout = super.onCreateView(layoutInflater, viewGroup, savedInstance);

        TouchableWrapper frameLayout = new TouchableWrapper(getActivity());

        frameLayout.setBackgroundColor(getResources().getColor(android.R.color.transparent));

        ((ViewGroup) layout).addView(frameLayout,
                new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));

        return layout;
    }

    public void setListener(OnTouchListener listener) {
        mListener = listener;
    }

    public interface OnTouchListener {
        public abstract void onTouch();
    }

    public class TouchableWrapper extends FrameLayout {

        public TouchableWrapper(Context context) {
            super(context);
        }

        @Override
        public boolean dispatchTouchEvent(MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    mListener.onTouch();
                    break;
                case MotionEvent.ACTION_UP:
                    mListener.onTouch();
                    break;
            }
            return super.dispatchTouchEvent(event);
        }
    }
}
person ramin eftekhari    schedule 20.01.2017