“后退按钮”不会关闭活动

时间:2012-01-08 23:39:25

标签: java android android-activity back-button

我的申请中有两项活动。

第一个是地图,其中项目覆盖BBDD中的过程作为地理点。如果我点击其中一个点,它会显示mostrarLugar活动,该活动仅显示用户选择的网站的名称,说明和照片。

我有下一个问题: 如果在我的BBDD中我有10个站点,当我看到其中一个站点时,如果我单击后退按钮,我必须进行10次后退按钮点击,因为app会重新加载相同的活动10次,所有都使用相同的数据。 / p>

我对问题所在的方面没有任何想法。我试图用

强制完成
  public boolean onKeyDown(int keyCode, KeyEvent event)

但没有任何反应。

我认为问题可能出在onTap方法中。以下是我的活动:

public class Capas extends ItemizedOverlay<OverlayItem> implements OnGestureListener

    private GestureDetector gestureDetector;
    Context contexto;
    MapView Map;
    private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
    private final Activity parent;
    DataBaseHelper ayudabbdd;
    MotionEvent evento;



    public Capas(Drawable defaultMarker, Context context, Activity parent)
        {
            super(boundCenterBottom(defaultMarker));
            contexto = context;
            gestureDetector = new GestureDetector((OnGestureListener)this); 
            this.parent = parent;
            Map= (MapView) parent.findViewById(R.id.mapaTab);
            contexto = parent.getApplicationContext();

        }  

     /****
     * Evento que se inicia al tocar
     * para detectar el tipo de movimiento
     * 
     *****/
     @SuppressWarnings("static-access")
    @Override 
     public boolean onTouchEvent(MotionEvent event, MapView mapView) { 
               if(this.gestureDetector.onTouchEvent(event)) 
               { 
                   return true; }
       else{ 
           evento = event.obtain(event);
           Map = mapView;
           return super.onTouchEvent(event, mapView); 
       }
     } 

    public boolean onTap(int index) {


        return onTap(index, evento, Map);
    }

    public boolean onTap(int index,MotionEvent e, MapView map) {

        ayudabbdd = new DataBaseHelper(contexto);

        ArrayList<Object> datosLugar = ayudabbdd.getLugarPorID(index+1);
        //Paso los datos de array a las variables
        String nombre = (String) datosLugar.get(1).toString();
        muestraElPunto(nombre);
        ayudabbdd.close();

        return super.onTap(index);
    }

这是showMeSite活动。 我不认为这是错误的来源,但我也把它包括在内。

   public class mostrarLugar extends Activity{

    Context context;
    DataBaseHelper ayudabbdd;
    int id;
    String nombre;

    public void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);   
        setContentView(R.layout.mostrarlugar);

        View nombreDelLugar = (TextView)findViewById(R.id.tnombreLugar);
        View descDelLugar = (TextView) findViewById(R.id.tDescLugar);


       /********************
       * Obtengo los datos del item, con intent procedente 
       * de otro activity        
       ************************/

        String nombreClick = null;
        final Bundle extras = getIntent().getExtras();



        if(extras!=null){
            nombreClick = extras.getString("nombre");
          }

        //Conectamos a la base de datos y obtenemos el array de datos 
        ayudabbdd = new DataBaseHelper(this);
        ArrayList<Object> datosLugar = ayudabbdd.getLugarPorNombre(nombreClick);
        //Paso los datos de array a las variables
         nombre = (String) datosLugar.get(1).toString();
        String descripcion = (String) datosLugar.get(2).toString();
        String foto = (String)datosLugar.get(3).toString();
        //Los seteo
        ((TextView) nombreDelLugar).setText(nombre);
        ((TextView) descDelLugar).setText(descripcion);
        int compienzoBusquedaExtension = foto.length() - 4;
        String sFoto;//String del path real de la foto
        if(foto.indexOf(".jpg",compienzoBusquedaExtension)!=-1)
            sFoto=foto;
        else
            sFoto=obtenerPatchReal(Uri.parse(foto));
        BitmapFactory.Options options=new BitmapFactory.Options();
        options.inSampleSize = 5;
        Bitmap bitmap = BitmapFactory.decodeFile(sFoto, options);
        ImageView iLugar = (ImageView) findViewById(R.id.iDelLugar);
        iLugar.setImageBitmap(bitmap);

   }

      @Override
      public void onDestroy()
      {
          ayudabbdd.close();
          super.onDestroy();
      }
      /*
       * Si presiona atras, cerramos la aplicacion
       */
      @Override
      public boolean onKeyDown(int keyCode, KeyEvent event)
      {
          if ((keyCode == KeyEvent.KEYCODE_BACK))
          {
              finish();
          }
          return super.onKeyDown(keyCode, event);
      }

这是我在onTap方法中使用的getLugarPorID方法:

/*********************************************
         * Obtener un lugar completo a partir del ID
         * @param ID del lugar que queremos saber
         * @return Un array con los datos del lugar
         ***********************************************/
        public ArrayList<Object> getLugarPorID(int id)
        {
            CustomSQLiteOpenHelper helper = new CustomSQLiteOpenHelper(context);
            db = helper.getWritableDatabase();

            ArrayList<Object> rowArray = new ArrayList<Object>();
            Cursor cursor;

            try
            {

                cursor = db.query
                (
                        TABLE_NAME,new String[]{TABLE_ROW_ID, CNOMBRE, CDESC, CFOTO,CLAT,CLONG},TABLE_ROW_ID+"="+id,null, null, null, null, null
                );

                //movemos el puntero a la primera posicion
                cursor.moveToFirst();

                // Si hay datos los añado al array que sera devuelto
                if (!cursor.isAfterLast())
                {
                    do
                    {
                        rowArray.add(cursor.getLong(0));
                        rowArray.add(cursor.getString(1));
                        rowArray.add(cursor.getString(2));
                        rowArray.add(cursor.getString(3));
                        rowArray.add(cursor.getDouble(4));
                        rowArray.add(cursor.getDouble(5));

                    }
                    while (cursor.moveToNext());
                }

                cursor.close();
                db.close();
                return rowArray;


            }
            catch (SQLException e) 
            {
                Log.e("Error obteniendo datos de lugar", e.toString());
                e.printStackTrace();
            }
            return rowArray;

        }

3 个答案:

答案 0 :(得分:2)

应该是

@Override
  public boolean onKeyDown(int keyCode, KeyEvent event)
  {
      if ((keyCode == KeyEvent.KEYCODE_BACK))
      {
          finish();
      return true; // you missed this line
      }
      return super.onKeyDown(keyCode, event);
  }

答案 1 :(得分:1)

试试这个

 public boolean onKeyDown(int keyCode, KeyEvent msg) {
        if ((keyCode == KeyEvent.KEYCODE_BACK)) {
            //Add Dest View
            finish();

            return false;
        }
        else {
            return true;
        }
    }

答案 2 :(得分:1)

尝试使用

finishAffinity(); 

而不是

finish();