尝试在android studio(Java)的infoWindow内使用EditText

问题描述 投票:0回答:1

我最近一直在尝试将 EditText 放置在 InfoWindow 中,以便用户可以单击 InfoWindow 并用他们想要的任何文本注释该字段。我知道 InfoWindows 只是渲染图像而不是实时图像,因此我尝试在 InfoWindow 上实现 OnInfoWindowClickListener 以调出键盘并直接编辑 EditText,但这也失败了。

这里是处理地图和 InfoWindows 的方法的代码。为了便于阅读,我删除了所有不必要的部分:

@Override
    public void onMapReady(@NonNull GoogleMap googleMap) {
        gMap = googleMap;

        gMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
            @Nullable
            @Override
            public View getInfoContents(@NonNull Marker marker) {
                View iwv = getLayoutInflater().inflate(R.layout.infowindow, null);
                return iwv;
            }

            @Nullable
            @Override
            public View getInfoWindow(@NonNull Marker marker) {
                return null;
            }
        });

       
        gMap.setOnMapClickListener(new GoogleMap.OnMapClickListener()
        {
            @Override
            public void onMapClick(@NonNull LatLng point) {
                
                if(flag) { //toggle the ability to turn markers on or off
                    gMap.addMarker(new MarkerOptions()
                            .position(point)).showInfoWindow();
                }
            }
        });

        gMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
            @Override
            public void onInfoWindowClick(@NonNull Marker marker) {
                View v = li.inflate(R.layout.infowindow, null);
                infoWindowText = v.findViewById(R.id.iw_et);
                handleKeyboard(infoWindowText);
            }
        });
    }

 public void handleKeyboard(View view)
    {
        if (view.requestFocus()) {

            InputMethodManager imm = getSystemService(InputMethodManager.class);
            imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
        }
    }

我还知道 imm.toggleSoftInput 已被贬值,因此问题可能是由它而不是点击侦听器引起的,但是尝试使用 imm.ShowSoftInput 根本无法调出键盘。

我想要做的事情根本不可能,还是我只是使用了错误的点击侦听器? 非常感谢。

java android android-edittext onclicklistener infowindow
1个回答
0
投票
        gMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
            @Override
            public void onInfoWindowClick(@NonNull Marker marker) {
                View v = li.inflate(R.layout.infowindow, null);
                infoWindowText = v.findViewById(R.id.iw_et);
                handleKeyboard(infoWindowText);
            }
        });

当用户单击信息窗口时,您:

  • 创建一个全新的
    EditText
    ,作为膨胀全新
    R.layout.infowindow
    布局的一部分
  • 要求键盘显示该内容
    EditText

但是,屏幕上没有那个

EditText
。您基本上为其创建了 Java 对象,但仅此而已。

对比:

            public View getInfoContents(@NonNull Marker marker) {
                View iwv = getLayoutInflater().inflate(R.layout.infowindow, null);
                return iwv;
            }

这是有效的,因为您正在返回膨胀的布局,并且调用代码对其执行一些有用的操作(在本例中,将该布局渲染为位图)。然而,即使在这种情况下,

EditText
本身也不会出现在屏幕上,而只是它的图像。

我想做的事情根本不可能

如果您有数百个小时可以度过,您可以:

  • 尝试得出信息窗口在屏幕上的准确位置以及原始信息窗口内容的有效范围
  • 安排在相同的坐标处显示新扩展的信息窗口内容,通过一些漂浮在信息窗口上的容器,位于您将新的信息窗口内容扩展到的正确位置
  • 用户执行某些操作(不确定做什么)后,摆脱该浮动容器并触发地图以重新加载真实信息窗口(或对用户输入的数据执行任何其他需要执行的操作)

最初执行此操作可能只需要数十个小时,但您不是 Google 地图的开发人员。用户设备上不仅会出现许多版本的 Google 地图,而且这些版本还会随着时间的推移而发生变化。您可能需要针对不同版本的 Google 地图定制此逻辑,以使其在当前和未来都能正常工作。您还需要考虑不同的硬件、不同的软键盘等。

就我个人而言,如果我的图形设计师要求此功能,我会用鳟鱼打他们,然后协商一些风险较小的事情(例如,点击信息窗口显示底部工作表,用户可以在其中进行数据输入)。

© www.soinside.com 2019 - 2024. All rights reserved.