2012-03-20 18 views
15

Il pulsante scatto nel layout gonfiare non riesce a runtime perché il metodo non può essere trovato. E/AndroidRuntime (921): java.lang.IllegalStateException: Impossibile trovare un metodo onClick (View) nell'attività ma, se, clicca sul pulsante dal layout principale, funziona bene. Cosa ho fatto di sbagliato?Impossibile trovare un metodo onClick (View) nell'attività

UPDATE: codice di cambiamento ... stil fallire ... aggiungi log degli errori voglio avere tutti i miei tasti sono stati elaborati a Ome metodo.

principale classe di attività

package com.android.insertview; 


import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.view.Gravity; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.Toast; 

public class InsertViewActivity extends Activity { 
    /** Called when the activity is first created. */ 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     /*LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     ViewGroup parent = (ViewGroup)findViewById(R.id.main_view); 
     inflater.inflate(R.layout.volume_control, parent);*/ 

     LayoutInflater vi = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);   
     View v = vi.inflate(R.layout.volume_control, null);  
     View insertPoint = findViewById(R.id.main_view); 
     ((ViewGroup) insertPoint).addView(v, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT 
                      , ViewGroup.LayoutParams.WRAP_CONTENT)); 
    } 


    public void btnclick(View v) { 
     // TODO Auto-generated method stub 
     Context context = getApplicationContext(); 
     Toast toast = Toast.makeText(context, 
      "This is Toast Notification", Toast.LENGTH_SHORT); 
     toast.setGravity(Gravity.CENTER, 0, 0); 
     toast.show();  
    } 
} 

main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" android:id="@+id/main_view"> 
</LinearLayout> 

layout di gonfiaggio

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" android:background="@drawable/service_button_container_background" 
    android:id="@+id/volume_view"> 

    <Button 
     android:id="@+id/volume_up" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@drawable/button_volume_up" 
     android:onClick="btnclick" /> 

    <Button 
     android:id="@+id/button2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@drawable/button_volume_mute_off" 
     android:onClick="btnclick"/> 

    <Button 
     android:id="@+id/volume_down" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@drawable/button_volume_down" 
     android:onClick="btnclick"/> 

</LinearLayout> 

log degli errori

03-19 15:31:45.184: W/dalvikvm(1071): threadid=3: thread exiting with uncaught exception (group=0x4001b188) 
03-19 15:31:45.184: E/AndroidRuntime(1071): Uncaught handler: thread main exiting due to uncaught exception 
03-19 15:31:45.194: E/AndroidRuntime(1071): java.lang.IllegalStateException: Could not find a method genclick(View) in the activity 
03-19 15:31:45.194: E/AndroidRuntime(1071):  at android.view.View$1.onClick(View.java:2020) 
03-19 15:31:45.194: E/AndroidRuntime(1071):  at android.view.View.performClick(View.java:2364) 
03-19 15:31:45.194: E/AndroidRuntime(1071):  at android.view.View.onTouchEvent(View.java:4179) 
03-19 15:31:45.194: E/AndroidRuntime(1071):  at android.widget.TextView.onTouchEvent(TextView.java:6541) 
03-19 15:31:45.194: E/AndroidRuntime(1071):  at android.view.View.dispatchTouchEvent(View.java:3709) 
03-19 15:31:45.194: E/AndroidRuntime(1071):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
03-19 15:31:45.194: E/AndroidRuntime(1071):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
03-19 15:31:45.194: E/AndroidRuntime(1071):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
03-19 15:31:45.194: E/AndroidRuntime(1071):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
03-19 15:31:45.194: E/AndroidRuntime(1071):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
03-19 15:31:45.194: E/AndroidRuntime(1071):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659) 
03-19 15:31:45.194: E/AndroidRuntime(1071):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107) 
03-19 15:31:45.194: E/AndroidRuntime(1071):  at android.app.Activity.dispatchTouchEvent(Activity.java:2061) 
03-19 15:31:45.194: E/AndroidRuntime(1071):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643) 
03-19 15:31:45.194: E/AndroidRuntime(1071):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1691) 
03-19 15:31:45.194: E/AndroidRuntime(1071):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-19 15:31:45.194: E/AndroidRuntime(1071):  at android.os.Looper.loop(Looper.java:123) 
03-19 15:31:45.194: E/AndroidRuntime(1071):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
03-19 15:31:45.194: E/AndroidRuntime(1071):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-19 15:31:45.194: E/AndroidRuntime(1071):  at java.lang.reflect.Method.invoke(Method.java:521) 
03-19 15:31:45.194: E/AndroidRuntime(1071):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
03-19 15:31:45.194: E/AndroidRuntime(1071):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
03-19 15:31:45.194: E/AndroidRuntime(1071):  at dalvik.system.NativeStart.main(Native Method) 
03-19 15:31:45.194: E/AndroidRuntime(1071): Caused by: java.lang.NoSuchMethodException: genclick 
03-19 15:31:45.194: E/AndroidRuntime(1071):  at java.lang.ClassCache.findMethodByName(ClassCache.java:308) 
03-19 15:31:45.194: E/AndroidRuntime(1071):  at java.lang.Class.getMethod(Class.java:1014) 
03-19 15:31:45.194: E/AndroidRuntime(1071):  at android.view.View$1.onClick(View.java:2017) 
03-19 15:31:45.194: E/AndroidRuntime(1071):  ... 22 more 

UPDATE 2:

ok, se lo faccio, posso gestito tutti i pulsanti cliccare in un metodo genericClick()

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/front_end" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <!-- Main --> 
    <LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/main_view" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:background="@drawable/service_button_container_background" > 

     <ImageButton 
      android:id="@+id/radio" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="@drawable/button_radio" 
      android:clickable="true" 
      android:onClick="genericClick" /> 

     <ImageButton 
      android:id="@+id/player" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="@drawable/button_player" 
      android:onClick="genericClick" /> 

     <ImageButton 
      android:id="@+id/navi" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="@drawable/button_navigation" 
      android:onClick="genericClick" /> 
    </LinearLayout> 

    <!-- Volume controls --> 
    <LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/volume_controls" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_centerVertical="true" 
     android:background="@drawable/service_button_container_background" 
     android:orientation="vertical" > 

     <ImageButton 
      android:id="@+id/volume_up" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="@drawable/button_volume_up" 
      android:onClick="genericClick" /> 

     <ImageButton 
      android:id="@+id/volume_mute" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="@drawable/button_volume_mute_off" 
      android:onClick="genericClick" /> 

     <ImageButton 
      android:id="@+id/volume_down" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="@drawable/button_volume_down" 
      android:onClick="genericClick" /> 
    </LinearLayout> 

    <!-- Radio controls --> 
    <LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/radio_controls" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_alignRight="@+id/main_view" 
     android:layout_marginRight="100dp" 
     android:background="@drawable/service_button_container_background" 
     android:visibility="invisible" > 

     <ImageButton 
      android:id="@+id/radio_preset" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:onClick="genericClick" android:background="@drawable/button_menu"/> 

     <ImageButton 
      android:id="@+id/button2" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="@drawable/button_rewind" 
      android:onClick="genericClick" /> 

     <ImageButton 
      android:id="@+id/button3" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="@drawable/button_play" 
      android:onClick="genericClick" /> 

     <ImageButton 
      android:id="@+id/button4" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="@drawable/button_forward" 
      android:onClick="genericClick" /> 
    </LinearLayout> 

    <!-- Radio Info --> 
    <LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/radio_info" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/radio_controls" 
     android:layout_alignLeft="@+id/main_view" 
     android:layout_marginLeft="100dp" 
     android:background="@drawable/service_button_container_background" 
     android:orientation="vertical" 
     android:visibility="invisible"> 

     <LinearLayout 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" > 

      <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="FM" 
       android:textSize="18.0px" /> 

      <TextView 
       android:id="@+id/preset" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="1" 
       android:textColor="#ffd6d6d6" 
       android:textSize="18.0px" /> 

      <TextView 
       android:layout_width="10.0dip" 
       android:layout_height="wrap_content" 
       android:text=" " 
       android:textSize="18.0px" /> 

      <TextView 
       android:id="@+id/frequency" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="108.0" 
       android:textColor="#ffd6d6d6" 
       android:textSize="18.0px" /> 
     </LinearLayout> 

     <LinearLayout 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" > 

      <TextView 
       android:id="@+id/title" 
       android:layout_width="195.0dip" 
       android:layout_height="24.0dip" 
       android:text="Русское радио" 
       android:textColor="#ffd6d6d6" 
       android:textSize="18.0px" /> 
     </LinearLayout> 
    </LinearLayout> 
</RelativeLayout> 
+2

Non è necessario implementare OnClickListener e sovrascrivere il metodo onClick: è possibile definire il proprio. Se rimuovi l'implementazione e il tag @ Override ed esegui di nuovo il tuo programma, fallisce ancora? – Guillaume

+0

Inoltre dovresti chiamare il tuo metodo con quello che effettivamente fa, non un generico "onClick" – Guillaume

+0

@Guillaume, Hmmm. Hai ragione. Sono anche confuso vedendo che ... – Prem

risposta

11

Rimuovere il @Override annotazione. Controlla il documentation ufficiale per android: onClick - nel loro caso il metodo di gestione "SelfDestruct (Visualizza)".

Aggiornamento: come suggerito dagli altri, non si dovrebbe usare una denominazione generica per il metodo del gestore di eventi: "onClick" è troppo generico. Cosa succede se hai 10 pulsanti? Prova qualcosa come "onClickLoginButton", "onClickSaveBtn" ecc. Penso che non si possa usare "onClick" come nome per il metodo del gestore di corrispondenza, perché View.OnClickListener ha il metodo "onClick", quindi è necessario cambiare il nome comunque.

<Button 
    android:id="@+id/volume_up" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@drawable/button_volume_up" 
    android:onClick="handleVolumeUp" /> 

E nella classe di attività

public void handleVolumeUp(View view) { 
    // TODO Auto-generated method stub  
} 

Rimuovere l'attuazione di OnClickListener in modo che la definizione della classe diventa:

public class InsertViewActivity extends Activity 

UPDATE2: Se si desidera che tutti i pulsanti per essere gestito da 1 click listener fai qualcosa del genere:

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Button btn1 = (Button)findViewById(R.id.btn1); 
    btn1.setOnClickListener(btnListener); 
    Button btn2 = (Button)findViewById(R.id.btn2); 
    btn2.setOnClickListener(btnListener); 
    Button btn3 = (Button)findViewById(R.id.btn3); 
    btn3.setOnClickListener(btnListener); 
} 

private OnClickListener btnListener = new OnClickListener() 
{ 

    public void onClick(View v) 
    { 
     //do the same stuff or use switch/case and get each button ID and do different 

     //stuff depending on the ID 
    } 

}; 
+0

Sta dando il nome del metodo come onClick nel file di layout. È possibile dare quel nome? Perché mentre implementi onClickListner questo metodo è obbligatorio da implementare. Per favore fatemi sapere se ho torto ... Non ho mai usato methodName onClick nel file di layout .... Quindi sono curioso di sapere questo – Prem

+0

Non sono sicuro che se è possibile, dovrebbe sicuramente usare più dettagli/nome specifico per il metodo del gestore di eventi. – hovanessyan

+0

rimuovere l'implementazione e il metodo @Override e rinominare su oClick1, ancora non riuscito. – SpuDy

0

è la vostra seconda attività nel manifest.xml?

È necessario aggiungere tutte le attività in là. Vedi il codice qui sotto Modifica SecondActivity nella tua attività. E impostare il nome del pacchetto a erano la vostra attività si trova

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="PackageName.MainActivity" android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <activity 
     android:name="PackageName.SecondActivityName" >  
    </activity> 

</application> 

2

Il problema in temi di layout per 5.X Android L'attività principale non hanno tag tema layout.xml altro ha e è un errore per il sistema operativo Android.

Solution è qui: android 5 and onClick in xml layout

In breve: 1) rimuovere tag sheme da tutti i layout; 2) aggiungi il tag con sheme corretta nel manifest

Ho provato per telefoni Android 5.X: funziona.

+0

Cosa intendi per rimuovere il tag sheme. Ti piacciono gli uomini o il tema? Inoltre, cosa intendi rimuovendolo. puoi dimostrare? –

+0

Sheme. Rimozione = cancella. – Denis

-1

e dovresti prenderne nota un'altra: public void onclick_method() {your logic;}. Lo studio non ti dà un suggerimento. Ho appena scritto così e ho perso molto tempo per trovare la risposta, finalmente ho trovato che il metodo giusto è questo: public void onclick_method (View view) {your logic;} quindi, non dimenticare il parametro nel staffa!

Blockquote

0

Un problema comune che ho visto è che i principianti potranno dichiarare il metodo onClick come protected o private. Quando si esegue questa operazione, il motore XML non può accedere al metodo che crea questo problema.

Problemi correlati