2012-01-02 10 views
43

El siguiente código genera este mensaje de error en la línea public void onClick.¿Por qué me aparece "debe anular un método de superclase" con @Override?

múltiples marcadores en esta línea
- implementos android.view.View.OnClickListener.onClick
- El método onClick (View) de tipo nuevo View.OnClickListener() {} debe reemplazar un método superclase

No puedo entender por qué. Este código está tomado de numerosos ejemplos que he visto. ¿Qué puede estar posiblemente mal?

private Button audioButton; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    audioButton = (Button) findViewById(R.id.imageButton1); 
    audioButton.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View button) { 
      if (button.isSelected()) { 
       button.setSelected(false); 
      } 
      else { 
       button.setSelected(true); 
      } 
     } 
    }); 
} 
+0

http://stackoverflow.com/questions/1678122/must-override-a-superclass-method -errors-after-importing-a-project-into-eclips –

Respuesta

108

Comprobar las propiedades y del proyecto verifique que compilador Java -> nivel de cumplimiento del compilador se establece en 1,6 .

+10

Gracias! Eso lo solucionó Esto es tan arcano. ¿Cómo se supone que un novato debe saber este tipo de cosas? –

+0

Sin embargo, ahora el programa falla con un cierre forzado - "se detuvo inesperadamente". Wow, eso es útil. –

+0

Comenté la declaración setOnClickListener, pero dejé la línea findViewById sola, ¡y todavía se cuelga! ¿Cómo puede el simple acto de obtener el objeto Button hacer que el programa se detenga inesperadamente? –

40

Esto es muy probablemente debido a una incompatibilidad de nivel de código fuente entre Java 1.5 y 1.6.

  • En Java 5, el @Override anotación requiere que el método es en realidad sustituir un método de una superclase.

  • En Java 6 y más tarde, el @Override anotación también se cumplirá si el método se implementa un método abstracto en una superclase o interfaz.

Así que la razón más probable para ver esto en el código que se puede esperar para trabajar es que está compilando Java 6 (o posterior) de código con un 5 compilador de Java (o algún otro compilador con el nivel de cumplimiento de la fuente del compilador establecido en 5).

+7

Gracias por explicar realmente * por qué * el nivel de cumplimiento del compilador es importante. – Dalbergia

3

Si establece el compilador a 1,6 y aún así obtener este error, tratar de comprobar sus importaciones, porque lo que Eclipse hace es que siempre trato de hacer esto

import android.content.DialogInterface.OnClickListener 

en lugar de ->

import android.view.View.OnClickListener 

Eso resuelve mi problema.

0

Poner una View.onCLickListener() me resolvió el problema. Mi compilador Java -> nivel de compilación del compilador ya está configurado en 1.6, pero aun así tuve el mismo problema.

Pero cambiar el código

rdBtn.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       onRadioButtonClicked(v); 
      } 
     }); 

a

rdBtn.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       onRadioButtonClicked(v); 
      } 
     }); 

resuelto el problema en mi caso.

2

MAVEN USERS Si usa Maven para compilación, puede anular las configuraciones de eclipse durante la compilación. Por lo tanto, si configura Eclipse en 1.7 pero no establece específicamente la versión de compilación de Maven JDK (que en el momento de escribir esto está predeterminada en 1.5), restablecerá el compilador de destino de eclipse a 1.5. Establezca el compilador Maven de la siguiente manera.

<build> 
     ... 
     <plugins> 
      .... 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.5.1</version> 
       <configuration> 
        <source>1.7</source> 
        <target>1.7</target> 
       </configuration> 
      </plugin> 
     </plugins>    
    </build> 
0

Para mí esto ocurrió debido a que el método que quería era anular paquete privado y yo trataba de anularlo de un paquete diferente.

Eclipse, además, poner una advertencia en ese caso que no me di cuenta a causa de una tonelada de otras advertencias

Cuestiones relacionadas