首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nutiteq: ViewLabel:延迟按钮执行

Nutiteq: ViewLabel:延迟按钮执行
EN

Stack Overflow用户
提问于 2015-03-15 18:29:21
回答 3查看 111关注 0票数 3

我正在尝试创建一个包含三个ViewLabel的自定义视图的nutiteq Button,我的代码和问题非常类似于这个post 纽扣重装。不能在自定义ViewLabel中工作的可单击视图

在提供了引用帖子的答复后,我注意到视图的onTouchEvent-Method被调用,执行单击的对象由处理程序提交给由编排人员触发的runQueue。

在按下ViewLabel中的ViewLabel之后,会发生上述的内部调用,但是直到我按下ViewLabel之外的某个位置,才会执行ButtononClick-Method。然后,ViewLabel关闭(就像它应该关闭的那样,当按下它后面的映射时),并且触发我在onClick-Method中放置的Toast

我认为这个问题与UIThread有关。performClick-Action似乎被放入了错误的runQueue中,当用户没有打开Label时,runQueue是活动的。

如果有人有办法解决这个问题,那就太好了。

编辑的:下面是我如何构建ViewLabel的方法。此方法位于由MapActivity调用的类中:

代码语言:javascript
复制
    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));
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-11 08:20:48

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

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

代码语言:javascript
复制
 @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文档“使用Android标准布局工具”中的请看这里选项。

票数 3
EN

Stack Overflow用户

发布于 2015-03-16 08:24:07

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

票数 1
EN

Stack Overflow用户

发布于 2015-06-29 03:08:20

对于那些仍然想使用自定义视图的人,这里是我发现的一项工作。我发现在自定义视图中触发的事件将在onMapMoved事件之后执行。因此,我手动触发它。以下是代码:

用自定义视图布局ID替换YourViewID,用按钮ID替换YourButtonID

代码语言:javascript
复制
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()

代码语言:javascript
复制
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;
    }
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29064524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档