2015-03-15 4 views
3

Я пытаюсь создать nutiteq ViewLabel с пользовательским представлением, содержащим три Button s. Мой код и проблема очень похожа на этот пост nutiteq: Button resp. clickable Views not working in Custom ViewLabel.Nutiteq: ViewLabel: Задержка выполнения кнопки

С предоставленным ответом упомянутого сообщения я заметил, что вызывается метод вида onTouchEvent и что объект, который выполняет щелчок, отправляется обработчиком в runQueue, который запускается хореографом.

После нажатия Button в ViewLabel те внутренние вызовы, которые я описал выше случиться, но onClick -метод Button не выполняется, пока не будет нажата где-то за пределами ViewLabel. Затем закрывается ViewLabel (как и при нажатии на карту позади него) и Toast Я положил в onClick -Method запускается.

Я думаю, что проблема имеет что-то делать UIThread. Похоже, что performClick -Action помещается в неправильный runQueue, который активен, когда пользователь не открывает Label.

Было бы хорошо, если бы у кого-то была идея, как решить эту проблему.

Отредактировано: Вот как я создаю ViewLabel. Этот метод в классе, который называется по MapActivity:

public void createViewMarker(View markerView, Bitmap icon, MapPos pos, Category cat, String tag) { 
    MarkerStyle markerStyle = MarkerStyle.builder().setBitmap(icon).setSize(0.5f).setColor(
      Color.WHITE).build(); 
    ViewLabel label = new ViewLabel(markerView, new Handler(Looper.getMainLooper())); 
    label.setTouchHandlingMode(true); 
    markers.add(new MocaMarker(pos, label, markerStyle, cat, 
      markerLayer, tag)); 
} 
+0

Вы можете предоставить немного кода? Особенно, как вы строите 'ViewLabel'? –

+1

@ValentinoRu MapActivity вызывает класс Map, который имеет этот метод 'public void createViewMarker (View markerView, значок Bitmap, MapPos pos, категория cat, String tag) { MarkerStyle markerStyle = MarkerStyle.builder(). SetBitmap (значок) .setSize (0.5f) .setColor ( Color.WHITE) .build(); Метка ViewLabel = новая ViewLabel (markerView, новый обработчик (Looper.getMainLooper())); label.setTouchHandlingMode (true); markers.add (новый MocaMarker (pos, label, markerStyle, cat, markerLayer, tag)); } ' – pekayde

ответ

3

После реакции nutiteq команды в Google групп, которые также не имеют решения ( see here) я решил избавиться от ViewLabel полностью.

Мое решение теперь состояло в том, чтобы включить макет подготовленного представления poi в файл макета MapActivity и загрузить его вместе с моей пользовательской реализацией MapListener. Вся инициализация элементов вида poi, которые я сделал в конструкторе MapListener, и только что изменил видимость при вызове метода onVectorElementClicked. Вот отрывок, как это в основном выглядит:

@Override 
public void onMapClicked(double x, double y, boolean b) { 
    Toast.makeText(activity, "onMapClicked " + (new EPSG3857()).toWgs84(x, y).x + " " + (new EPSG3857()).toWgs84(x, y).y, Toast.LENGTH_SHORT).show(); 
    Log.d(TAG, "onMapClicked " + x + " " + y); 
    activity.runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      mPoiGlanceView.setVisibility(View.INVISIBLE); 
     } 
    }); 
} 

@Override 
public void onVectorElementClicked(VectorElement vectorElement, double v, double v2, boolean b) { 
    if (vectorElement != null && vectorElement instanceof Marker) { 
     showPopupView(vectorElement); 
     Toast.makeText(activity, "onLabelClicked Marker!", Toast.LENGTH_SHORT).show(); 
    } 
} 

private void showPopupView(VectorElement vectorElement) { 
    mPoiGlanceView.setVisibility(View.VISIBLE); 
    setUpUiElementsForView(); 
} 

Я был вдохновлен альтернативой ViewLabel на GitHub документации nutiteq see here «Использование Android стандартной компоновки инструментов»

+0

Где и как определяется «setUpUiElementsForView();»? –

+0

@ Gödel77 sry для его вставки. Это просто базовая инициализация элементов элемента в макете. – pekayde

1

ViewLabel конструктор в Nutiteq SDK принимает объект Handler в качестве аргумента. Он использует этот обработчик для перерисовки ярлыков и передачи сообщений. Сначала я бы проверил, правильно ли подключен ваш обработчик к потоку пользовательского интерфейса. Существует дополнительная информация об этом здесь: https://developer.android.com/training/multiple-threads/communicate-ui.html

+0

Итак, мы не можем просто передать' new Handler() 'в конструкторе ViewLabel? –

+0

Спасибо за предложение @MarkT. Я создал обработчик, как в опубликованном, как описано в «ViewLabel label = new ViewLabel (markerView, new Handler (Looper.getMainLooper())), и все тот же результат. Я предполагаю, что проблема заключается в том, что обработчик, который я кормлю, все равно находится в mainLooper, и открытая ViewLabel живет в другом потоке, так что MainLooper продолжается после закрытия Label. По крайней мере, это будет объяснение. – pekayde

1

Для тех, кто по-прежнему хочет использовать пользовательский взгляд, вот работа, которую я нашел. Я обнаружил, что событие, вызванное в пользовательском представлении, будет выполнено после onMapMoved Событие. Таким образом, я вручную запускаю его. Вот код:

Замените YourViewID на свой собственный идентификатор макета вида и YourButtonID с ID кнопки. Добавьте код, приведенный ниже, где вы создаете ViewLabel

View v = getLayoutInflater().inflate(R.layout.YourViewID, null); 
((Button)v.findViewById(R.id.YourButtonID)).setOnTouchListener(new View.OnTouchListener(){ 
    @Override 
    public boolean onTouch(View view, MotionEvent motionEvent) { 
     //Trigger only when users release the button 
     if(motionEvent.getActionMasked()==MotionEvent.ACTION_UP){ 
      //Do your work 
     } 
     //Do not consume the OnTouch event 
     return false; 
    } 
}); 

Заменить YourBaseLayoutID с корневой макет ID и yourMapView с объектом MapView. Добавьте код ниже в OnCreate().

findViewById(R.id.YourBaseLayoutID).setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View view, MotionEvent motionEvent) { 
     if(motionEvent.getActionMasked()==MotionEvent.ACTION_UP) 
      yourMapView.getOptions().getMapListener().onMapMoved(); 
     return false; 
    } 
}); 
Смежные вопросы