Всплывающее окно MapView с макетом теряет фокус - PullRequest
2 голосов
/ 30 августа 2010

Я пытаюсь реализовать информационное окно, подобное веб-версии карт Google.Я создал пользовательский макет, расширяющий линейный макет, и заполнил его TextView и кнопкой.

Я переопределил метод dispatchDraw объекта balloonLayout (который расширяет LinearLayout), чтобы нарисовать контейнер с закругленными углами и всплывающее окноtip.

В своем пользовательском классе наложения я сохраняю координаты касания в переменной и рисую информационное окно в переопределенном методе рисования в ранее сохраненных координатах.В окне «Информация» отображается «ОК», но кнопка теряет фокус и никогда не вызывает ее. «Слушатель». На нее можно нажать (она не получает нажатого желтого состояния), и я не могу понять, почему ...

Спасибозаранее.

Это мой способ отправки drawballlayout.class:

@Override
protected void dispatchDraw(Canvas canvas)
{
    Paint panelPaint  = new Paint();
    panelPaint.setARGB(0, 0, 0, 0);

    RectF panelRect = new RectF();
    panelRect.set(0,0, getMeasuredWidth(), getMeasuredHeight());
    canvas.drawRoundRect(panelRect, 5, 5, panelPaint);

    RectF baloonRect = new RectF();
    baloonRect.set(0,0, getMeasuredWidth(), 2*(getMeasuredHeight()/3));
    panelPaint.setARGB(230, 255, 255, 255);        
    canvas.drawRoundRect(baloonRect, 10, 10, panelPaint);

    Path baloonTip = new Path();
    baloonTip.moveTo(5*(getMeasuredWidth()/8), 2*(getMeasuredHeight()/3));
    baloonTip.lineTo(getMeasuredWidth()/2, getMeasuredHeight());
    baloonTip.lineTo(3*(getMeasuredWidth()/4), 2*(getMeasuredHeight()/3));

    canvas.drawPath(baloonTip, panelPaint);

    super.dispatchDraw(canvas);
}   

Это ballonlayout.xml

    <?xml version="1.0" encoding="utf-8"?>
<com.forgottenprojects.preciotaxi.balloonLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/transparent_panel"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="5px"
    android:paddingTop="5px"
    android:paddingRight="5px"
    android:paddingBottom="5px"
    android:orientation="vertical"
    >

  <TextView
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:id="@+id/ballonLabel"
  android:text="coordenadas"
  />  

  <Button 
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:id="@+id/ballonButton"
  android:text="Ir aquí"
  android:clickable="true"

  />
  </com.forgottenprojects.preciotaxi.balloonLayout>

И tapOverlay.class

class tapOverlay extends Overlay
{
public GeoPoint lastTap=null;
private Context context;
LayoutInflater inflater;
balloonLayout noteBaloon;
public tapOverlay(Context c)
{
    this.context=c;
    inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    noteBaloon = (balloonLayout) inflater.inflate(R.layout.balloonlayout, null);

    RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(200,100); 
    layoutParams.addRule(RelativeLayout.CENTER_VERTICAL);
    layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
    noteBaloon.setLayoutParams(layoutParams); 

}
@Override
public boolean onTap(GeoPoint p, MapView mapView) {
    lastTap = p;
    mapView.getController().animateTo(p);
    return true;        
}

@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) 
{
    Projection p = mapView.getProjection();
    Paint paint = new Paint();
    paint.setColor(0xFFFFFF00);
    paint.setStrokeWidth(5);
    paint.setAntiAlias(true);
    if(lastTap!=null)
    {           
        drawInfoWindow(canvas, p, shadow, mapView);
    }
   super.draw(canvas, mapView, shadow);
}

private void drawInfoWindow(Canvas canvas, Projection myprojection,
        boolean shadow, MapView mapView) 
{
    try{
        mapView.removeView(noteBaloon);
        noteBaloon.setVisibility(View.VISIBLE);

        TextView textmsg = (TextView) noteBaloon.findViewById(R.id.ballonLabel);
        textmsg.setText(lastTap.getLatitudeE6()+","+lastTap.getLongitudeE6());
        Button btn = (Button) noteBaloon.findViewById(R.id.ballonButton);
        btn.setFocusable(true);
        btn.setOnClickListener(btn_onclick);
        mapView.addView(noteBaloon, new MapView.LayoutParams(200,200,lastTap,MapView.LayoutParams.BOTTOM_CENTER));
        mapView.setEnabled(true);

        mapView.invalidate();
    } catch (Exception e)
    {
        Toast.makeText(context, e.getMessage(), Toast.LENGTH_LONG).show();
    }
}

private OnClickListener btn_onclick = new OnClickListener() {
    //This never shows...
    @Override
    public void onClick(View v) {
        Toast.makeText(context, "Se hizo clic... y ahora?", Toast.LENGTH_LONG).show();
    }
};

}

...