当我尝试实现Parcelable接口时出错

时间:2020-08-28 09:32:02

标签: java android

我当时正在使用Android Studio,Google Maps Services Location开发一个Android App,并且在基于API Android实现的POJO(Lineas类)中尝试使用Parcelable接口传递参数时遇到错误。

应用程序应根据您当前的位置,使用马德里火车站的不同线路显示最佳路线。

我发现错误的Lineas类代码是:

package com.example.rutas_metro_madrid;

import android.location.Location;
import android.os.Parcel;
import android.os.Parcelable;

import static android.content.ComponentName.readFromParcel;

public class Lineas extends Location implements Parcelable {

    private String nombre;
    Location[] estaciones;
    protected int origenRuta;
    protected int finalRuta;
    private double datosParadaOrigen;
    private double datosParadaDestino;
    private Parcel parcel;


    public void distancias(Location origen, Location destino){
        //Almacenamos la distancia a la primera estacion, desde el origen
        // y comprobamos cual es la menor.
        datosParadaOrigen = origen.distanceTo(estaciones[0]);
        datosParadaDestino = destino.distanceTo(estaciones[0]);

        for (int i =0; i<estaciones.length; i++){

            if(origen.distanceTo(estaciones[i])<datosParadaOrigen){

                origenRuta = i;
                datosParadaOrigen = origen.distanceTo(estaciones[i]);
            }
            if(destino.distanceTo(estaciones[i])<datosParadaDestino){

                finalRuta = i;
                datosParadaDestino = destino.distanceTo(estaciones[i]);
            }
        }
    }

    public double sumaDisMetro(){

        return datosParadaOrigen+datosParadaDestino;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public void setEstaciones(Location[] estaciones) {
        this.estaciones = estaciones;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    public static final Parcelable.Creator<Lineas> CREATOR
            = new Parcelable.Creator<Lineas>() {
        public Lineas createFromParcel(Parcel parcel) {
            return new Lineas(parcel);
        }

        public Lineas[] newArray(int size) {
            return new Lineas[size];
        }
    };

    public Lineas(){
    }

    //Constructor de la Clase Parcelable.
    public Lineas(Parcel parcel) {
        readFromParcel(parcel);
    }

    @Override
    public void writeToParcel(Parcel parcel, int flags) {

        //Almacenamos el objeto Linea en un Parcel.
        parcel.writeString(nombre);
        parcel.writeTypedArray(estaciones, 0);
        parcel.writeInt(origenRuta);
        parcel.writeInt(finalRuta);
        parcel.writeDouble(datosParadaDestino);
        parcel.writeDouble(datosParadaOrigen);
    }

    private void readFromParcel(Parcel parcel){

        //Hay que leerlo en el mismo sentido en el que lo escribimos.
        nombre = parcel.readString();
        estaciones = parcel.createTypedArray(Location.CREATOR);
        origenRuta = parcel.readInt();
        finalRuta = parcel.readInt();
        datosParadaOrigen = parcel.readDouble();
        datosParadaDestino = parcel.readDouble();
    }
}


我得到的错误是:

C:\Users\manul\AndroidStudioProjects\Rutas_metro_madrid\app\src\main\java\com\example\rutas_metro_madrid\Lineas.java:74: error: no suitable constructor found for Location(no arguments)
    public Lineas(){
                   ^
    constructor Location.Location(String) is not applicable
      (actual and formal argument lists differ in length)
    constructor Location.Location(Location) is not applicable
      (actual and formal argument lists differ in length)

如果您对为什么会这样有任何想法,感谢您的合作。

感谢前进!

3 个答案:

答案 0 :(得分:0)

尝试在读取或写入时将位置数组转换为通用可打包数组。 您可以参考此问题以获取更多信息- Writing arrays of Parcelables to a Parcel in Android

答案 1 :(得分:0)

出现此错误的原因是,父Location类中没有默认构造函数。

您可以通过从类声明中删除extends Location来纠正错误。我看不出您为什么需要Location作为父类的任何原因。

答案 2 :(得分:0)

类Rutas:

package com.example.rutas_metro_madrid;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.location.Location;
import android.os.Bundle;
import android.os.Parcelable;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.Arrays;

public class Rutas extends AppCompatActivity {

    private String linea;
    private Lineas[]paradas;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_rutas);

        //ALMACENAMOS LOS DATOS DE LA MEJOR RUTA
        Intent datosRuta = this.getIntent();
        String linea = datosRuta.getStringExtra("LINEAS");
        //ESTABLECEMOS SU NOMBRE EN EL TEXTVIEW
        ((TextView)findViewById(R.id.Linea)).setText(linea);

        Bundle extras = getIntent().getExtras();
        Parcelable [] datos = datosRuta.getParcelableArrayExtra("PARADAS");
        Location [] ruta = Arrays.copyOf(datos, datos.length, Location[].class);

        LinearLayout rutaContenedor = ((LinearLayout)findViewById(R.id.pantalla));

        LayoutInflater inflador = (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);

        pintaRuta(inflador, R.drawable.esferainiciofin, ruta[0].getProvider(), rutaContenedor);

        String texto = getString(R.string.a_pie) + " " + (int) (ruta[0].distanceTo(ruta[1]));
        texto += " " + getString(R.string.metros);

        pintaRuta(inflador, R.drawable.caminando, texto, rutaContenedor);

        for (int i = 1; i<ruta.length; i++){

            pintaRuta(inflador, R.drawable.esferainiciofin, ruta[i].getProvider(), rutaContenedor);
        }

        if(ruta.length>2){
            texto = getString(R.string.a_pie) + " " + (int) (ruta[ruta.length-2].distanceTo((ruta[ruta.length-1])));

            pintaRuta(inflador, R.drawable.caminando, texto, rutaContenedor);
        }

        pintaRuta(inflador, R.drawable.esferainiciofin, ruta[ruta.length-1].getProvider(), rutaContenedor);

    }

    private void pintaRuta(LayoutInflater inflador, int imagen, String textoImagen, LinearLayout contendor){

        LinearLayout distanciaEstaciones = (LinearLayout) inflador.inflate(R.layout.distancia_estaciones, null);

        ((ImageView) distanciaEstaciones.findViewById(R.id.icono)).setImageResource(imagen);

        ((TextView) findViewById(R.id.texto)).setText(textoImagen);

        //Le pasamos a ActivityRutas, la Ruta que hemos confeccionado.
        contendor.addView(distanciaEstaciones);
    }

    public void mapa(View vista){

        Bundle miBundle = getIntent().getExtras();
        Intent intento = new Intent(this, MapsActivity.class);

        intento.putExtras(miBundle);
        startActivity(intento);

    }
    public void mejorRuta(Location origen, Location destino, Lineas[]lasLineas){

        Lineas mejorLinea = null;

        for (Lineas linea: lasLineas){

            linea.distancias(origen, destino);

            //Alamacenamos la mejor linea.
            if(mejorLinea==null || linea.sumaDisMetro() < mejorLinea.sumaDisMetro()){
                mejorLinea=linea;
            }
            //Si la distancia al destino es menor que la recorrida en metro, no establecemos ninguna linea.
            if(mejorLinea==null || origen.distanceTo(destino)<mejorLinea.sumaDisMetro()){

                linea=null;

                paradas = new Lineas[2];
                paradas[0]= (Lineas) origen;
                paradas[1]= (Lineas) destino;

                return;
            }
            //En el caso de que sea mejor coger el metro, calculamos al paradas.
            paradas = (Lineas[]) new Location[(mejorLinea.finalRuta - mejorLinea.origenRuta) + 2];

            paradas[0] = (Lineas) origen;

            paradas[paradas.length-1] = (Lineas) destino;
            //No recorremos las posiciones de origen y destino.
            for (int i=1;i<paradas.length-2;i++){
                paradas[i]= (Lineas) mejorLinea.estaciones[i+mejorLinea.origenRuta-1];
            }
        }
    }
}
相关问题