我正在尝试使用infoWindow实现Google Map标记,如果有人单击此infoWindow,它将播放一首歌曲,如果再次单击,它将停止。为了可视化,我编写了一个自定义的infoWindow布局。在infoWindow中,您可以通过按钮查看用户和跟踪信息。如果曲目尚未开始播放,则此按钮显示播放图标,并且如果按下了该按钮(在infoWindow上,而不是在按钮上按下),则希望将其图标从“播放”更改为“停止”。但是,我不能根据infoWindowClickListener活动来更改自定义infoWindow的视图。我特别尝试更改infoWindowAdapter,但是我不想更改所有其他infoWindows的视图,并且我也想立即看到更改。这样,再次单击标记后,infoWindow将刷新其视图。换句话说,它不会与单击操作同时更改视图。

在这里您可以看到我在说什么。左侧为停止状态,右侧为播放状态:



这是我对适配器的徒劳的努力:

public class OrangeInfoWindowAdapter implements GoogleMap.InfoWindowAdapter {

    Context context;
    ImageButton playButton;
    boolean onPlay;

    public OrangeInfoWindowAdapter(Context context, boolean onPlay) {
        this.context = context;
        this.onPlay = onPlay;
    }

    @Override
    public View getInfoWindow(Marker arg0) {

        LayoutInflater inflater = LayoutInflater.from(context);
        View v = inflater.inflate(R.layout.orange_infowindow, null);

        v.setMinimumWidth(280);
        v.setMinimumHeight(120);

        TextView tvUsername = (TextView) v.findViewById(R.id.tv_username);
        TextView tvTrack = (TextView) v.findViewById(R.id.tv_track);

        int index = arg0.getTitle().indexOf("*");

        try {
            tvUsername.setText(arg0.getTitle().substring(0, index - 1) + "\n" + arg0.getTitle().substring(index + 2));
        } catch (StringIndexOutOfBoundsException e) {
        }

        tvUsername.setTextSize(10);
        tvUsername.setTextColor(Color.rgb(70, 70, 70));

        index = arg0.getSnippet().indexOf("*");

        try {
            tvTrack.setText(arg0.getSnippet().substring(0, index - 1) + "\n" + arg0.getSnippet().substring(index + 2));
        } catch (StringIndexOutOfBoundsException e) {
        }

        tvTrack.setTextSize(10);
        tvTrack.setTextColor(Color.rgb(230, 92, 1));

        playButton = (ImageButton) v.findViewById(R.id.playButton);

        if (onPlay)
            onPlay();

        return v;

    }

    public void onPlay() {
        playButton.setBackgroundResource(R.drawable.info_stop_button);
    }

    public void onStop() {
        playButton.setBackgroundResource(R.drawable.info_play_button);
    }

    @Override
    public View getInfoContents(Marker arg0) {
        return null;
    }
}


这是我的onInfoWindowClick():

@Override
public void onInfoWindowClick(Marker marker) {
    if (!infoWindowPlayerActive) {
        int index = findMarkerIndex(marker);
        OrangeInfoWindowAdapter infoWindowAdapter2 = new OrangeInfoWindowAdapter(getActivity().getApplicationContext(), true);
        googleMap.setInfoWindowAdapter(infoWindowAdapter2);
        new InfoWindowPlayerTask(mainActivity).execute(activities.get(index).getTrackId());
        infoWindowPlayerActive = true;
    }

    else {
        // same thing...
        infoWindowPlayerActive = false;
    }
}


如果您想获得更多信息以清楚地了解问题,请询问我。

最佳答案

GoogleMap API v.2除了打开和关闭它之外,不支持在InfoWindow上进行任何交互。


但是,有一个关于实现in this answer的惊人技巧,它涉及如何在InfoWindow中创建交互式View。请记住,同样的技术也适用于片段。

official documentation


  注意:绘制的信息窗口不是实时视图。该视图在返回时呈现为图像(使用View.draw(Canvas))。这意味着对视图的任何后续更改都不会在地图上的信息窗口中反映出来。要稍后更新信息窗口(例如,在加载图像后),请调用showInfoWindow()。此外,信息窗口将不考虑正常视图的任何交互性,例如触摸或手势事件。但是,您可以按照以下部分中的说明在整个信息窗口上侦听一般的click事件。

关于android - 根据点击监听器更改infoWindow View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30014690/

10-13 03:01