由于被压缩,谷歌地图在警报对话框下闪烁

时间:2017-08-16 05:44:39

标签: java android google-maps

我在我的标记信息框点击监听器上实现了一个对话框,代码逻辑工作正常,但是当我显示对话框时,地图被推高并在后台闪烁。我在Pixel模拟器和Galaxy S8上尝试了它,并且都在警报对话框后面显示地图闪烁。

这是图像,你不能真正看到它闪烁,但文字扭曲和闪烁。看起来它在键盘和顶部之间被压缩了。单词...计算在屏幕的底部,没有对话框,所以不确定为什么它在顶部。

任何帮助将不胜感激。我确实检查了类似的问题以及我认为我想要的是键盘只是覆盖图像而不是推动它。

googleMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
            @Override
            public void onInfoWindowClick(Marker marker) {                
                showEditTextDialog();
            }
        });

public void showEditTextDialog()
    {

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        LayoutInflater layoutInflater = LayoutInflater.from(this);

        final View dialogView = layoutInflater.inflate(R.layout.mymap_marker_alert_dialog, null);
        final EditText editText = (EditText) dialogView.findViewById(R.id.alert_dialog_editText);

        // Keyboard
        final InputMethodManager imm = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);

        // Auto show keyboard
        editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean isFocused) {

                if (isFocused)
                {
                    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
                }
            }
        });

        builder.setView(dialogView)
                .setPositiveButton("Okay", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        String regNum = editText.getText().toString();
                        Log.d("STACKOVERFLOW", "Registration number: " + regNum);

                        // Hide keyboard
                        imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
                    }
                })
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        // Hide keyboard
                        imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);

                        dialog.cancel();
                    }
                });

        AlertDialog alertDialog = builder.create();
        alertDialog.show();
    }

Map distorted

1 个答案:

答案 0 :(得分:0)

因此Adview试图在键盘上方的压缩屏幕区域显示。我必须找到一种方法来删除adview,同时键盘可见,然后在键盘上再次返回它被解雇。在我的情况下,我必须确保在Alert Dialog onclick方法中重新启用adview,完整的解决方案如下:

  1. 设置LinearLayout并注意LinearLayout和adView的@id。

        <TextView
            android:id="@+id/mydistanceToMarker"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentStart="true"
            android:gravity="fill"
            android:text="Tap to change map type."
            android:textAlignment="center"
            android:textSize="36sp"
            android:textColor="@color/colorBlack"
            android:textStyle="bold" />
    
        <com.google.android.gms.ads.AdView
            xmlns:ads="http://schemas.android.com/apk/res-auto"
            android:id="@+id/myAdMapView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            ads:adUnitId="@string/UNIT_ID"
            ads:adSize="BANNER"/>
    </LinearLayout>
    
  2. 将变量连接到LinearLayout

    private LinearLayout parentLinearLayout;
    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_map);
        parentLinearLayout = (LinearLayout) findViewById(R.id.mydistanceLayout);
    
  3. 注意:我的xml文件中有一些LinearLayout图层,所以这个@id用于LinearLayout,它只包含我需要删除并在需要时重新添加的adView,而不是顶级的LinearLayout。

    1. 在我没有包含且不相关的程序逻辑中,我调用警报对话框方法

      public void showEditTextDialog()
      {
          parentLinearLayout.removeView((View) adMapView);
      

      这里我在警报对话框的开头删除了添加,因为我强制键盘立即显示,我需要广告不可见。

    2. 现在,在Alert Dialog中的OK和Cancel响应中,我添加了视图。

      builder.setView(dialogView).setPositiveButton("Okay", new DialogInterface.OnClickListener() {
                      @Override
                      public void onClick(DialogInterface dialog, int which) {
                        imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
                          parentLinearLayout.addView((View) adMapView);
                      }
                  })
                  .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                      @Override
                      public void onClick(DialogInterface dialog, int which) {                       imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
                          dialog.cancel();
                          parentLinearLayout.addView((View) adMapView);
                      }
                  });
          AlertDialog alertDialog = builder.create();
          alertDialog.show();
      
    3. 这解决了这个问题。不确定它是否是最好的解决方案,并且很高兴编辑或修复解决方案,如果有更好的方法,但它解决了我的问题。希望它可以帮助处于相同情况的人。