Nutiteq:ViewLabel:延迟按钮执行

时间:2015-03-15 18:29:21

标签: android android-handler nutiteq android-looper

我正在尝试使用包含三个ViewLabel的自定义视图创建一个nutiteq Button。 我的代码和问题与此帖nutiteq: Button resp. clickable Views not working in Custom ViewLabel非常相似。

通过提到的帖子回答,我注意到onTouchEvent - 视图的方法被调用,并且执行点击的对象由处理程序发布到由编排者触发的runQueue。

Button中按ViewLabel之后我发生了上述内部调用,但onClick - Button的方法在我按下之前未执行在ViewLabel之外的某个地方。然后ViewLabel关闭(就像它应该,当按下它后面的地图时)和Toast我放入onClick - 方法被触发。

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

3 个答案:

答案 0 :(得分:3)

在谷歌团体中的nutiteq团队的反应之后,他们也没有解决方案( see here)我决定完全摆脱ViewLabel。

我现在的解决方案是将准备好的poi视图的布局包含到MapActivity布局文件中,并将其与我的MapListener的自定义实现一起加载。 我在MapListener的构造函数中对poi视图元素进行了所有初始化,并在调用方法onVectorElementClicked时更改了visiblity。以下是它基本上看起来的片段:

 @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 see here github文档的ViewLabel替代方案的启发“使用Android标准布局工具”

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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;
    }
});

用你的根布局ID替换YourBaseLayoutID,用你的MapView对象替换yourMapView。 将以下代码添加到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;
    }
});