3

我正在尝试ViewLabel使用包含三个Buttons 的自定义视图创建一个 nutiteq。我的代码和问题与这篇文章nutiteq: Button resp非常相似。可点击的视图在自定义 ViewLabel 中不起作用

通过引用帖子提供的答案,我注意到onTouchEvent视图的 -Method 被调用,并且执行点击的对象由处理程序发布到由 Choreographer 触发的 runQueue。

在我上面描述Button的那些内部调用中按下 a 之后,会发生,但是直到我按下. 然后关闭(就像它应该的那样,当按下它后面的地图时)和我放入的-Method 被触发。ViewLabelonClickButtonViewLabelViewLabelToastonClick

我认为问题与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));
}
4

3 回答 3

3

在谷歌小组中的 nutiteq 团队也没有解决方案( 见这里)的回应之后,我决定完全摆脱 ViewLabel。

我现在的解决方案是将准备好的 poi 视图的布局包含到 MapActivity 布局文件中,并将其与我的 MapListener 自定义实现一起加载。我在 MapListener 的构造函数中对 poi 视图元素进行了所有初始化,并在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();
}

我受到 nutiteq 的 github 文档中的 ViewLabel 替代方案的启发,请参见此处“使用 Android 标准布局工具”

于 2015-06-11T08:20:48.587 回答
1

Nutieq SDK 中的 ViewLabel 构造函数将 Handler 对象作为参数。它使用此处理程序发布标签重绘和触摸事件消息。首先,我会检查您的处理程序是否正确连接到 UI 线程。这里有关于此的其他信息:https ://developer.android.com/training/multiple-threads/communicate-ui.html

于 2015-03-16T08:24:07.887 回答
1

对于那些仍然想使用自定义视图的人,这是我发现的一种解决方法。我发现自定义视图中触发的事件会在onMapMovedEvent之后执行。因此,我手动触发它。这是代码:

替换YourViewID为您的自定义视图布局 ID 和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;
    }
});
于 2015-06-29T03:08:20.890 回答