2015-04-30 9 views
6

Sto costruendo un'app chiamata Ping in Android Studio. Finora le mie attività sono LoginActivity ProfileActivity and Timeline. Il mio problema è che un pulsante nel layout corrispondente all'attività della linea temporale ha un metodo onClick che non funziona. Quando si fa clic sul pulsante, l'emulatore restituisce "Unfortunatley, Ping si è fermato". Sto definendo i pulsanti e i metodi onClick nello stesso modo in cui ho per gli altri pulsanti le cui funzioni funzionano, solo che questo non sembra funzionare. Ricevo un errore che dice che il metodo non può essere trovato, ma ho scritto il metodo nell'attività corrispondente. Ecco l'logcat:java.lang.IllegalStateException: impossibile trovare il metodo onClick del pulsante in Android Studio

04-30 10:40:08.727 2075-2075/com.ping_social.www.ping E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.ping_social.www.ping, PID: 2075 
    java.lang.IllegalStateException: Could not find a method onProfilePress(View) in the activity class android.view.ContextThemeWrapper for onClick handler on view class android.widget.Button with id 'profileButton' 
      at android.view.View$1.onClick(View.java:4007) 
      at android.view.View.performClick(View.java:4780) 
      at android.view.View$PerformClick.run(View.java:19866) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5257) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
    Caused by: java.lang.NoSuchMethodException: onProfilePress [class android.view.View] 
      at java.lang.Class.getMethod(Class.java:664) 
      at java.lang.Class.getMethod(Class.java:643) 
      at android.view.View$1.onClick(View.java:4000) 
            at android.view.View.performClick(View.java:4780) 
            at android.view.View$PerformClick.run(View.java:19866) 
            at android.os.Handler.handleCallback(Handler.java:739) 
            at android.os.Handler.dispatchMessage(Handler.java:95) 
            at android.os.Looper.loop(Looper.java:135) 
            at android.app.ActivityThread.main(ActivityThread.java:5257) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:372) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

Qui è la mia classe di attività Timeline:

package com.ping_social.www.ping; 

import android.content.Intent; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 

public class TimeLine extends ActionBarActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

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

     /*print log that shows we've got here*/ 
     Log.i("LoginActivity", "Layout has been set"); 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_time_line, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    /*called when user presses the Log in button*/ 
    public void onProfilePress(View view){ 
     /*Log the button press*/ 
     Log.i("TimeLine", "Has reached the onProfilePress method"); 

     Intent intent = new Intent(this, ProfileActivity.class); 
     startActivity(intent); 
    } 
} 

E qui è il mio Timeline codice del layout xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:theme="@style/GeneralTheme" 
    tools:context="com.ping_social.www.ping.TimeLine"> 

    <TextView android:text="@string/no_pings" android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="30sp" 
     android:layout_centerVertical="true" 
     android:layout_centerHorizontal="true" 
     android:textIsSelectable="false" 
     android:textColor="@color/PING_TOP_BAR_RED" 
     android:id="@+id/textView4" /> 

    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="60dp" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true"> 

     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/timeline_button" 
      android:id="@+id/timelineButton" 
      android:textColor="@color/PING_TOP_BAR_RED" 
      android:layout_weight="1"/> 

     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/new_ping_button" 
      android:id="@+id/newPingButton" 
      android:layout_weight="1"/> 

     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/activity_button" 
      android:id="@+id/activityButton" 
      android:layout_weight="1"/> 

     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/profile_button" 
      android:id="@+id/profileButton" 
      android:layout_weight="1" 
      android:onClick="onProfilePress"/> 
    </LinearLayout> 

</RelativeLayout> 

Sono abbastanza positivo non ci sono problemi di ortografia e non ci sono altri pulsanti che condividono lo stesso ID o i metodi che condividono lo stesso nome. Sono rimasto bloccato su questo per alcuni giorni, ogni aiuto è molto apprezzato!

+1

Perché non si registra da codice Java 'Button.setOnClickListener (nuova View.onClickListener' –

+1

Ti dispiace testarlo senza questa linea per favore:?' Android: theme = "@ stile/GeneralTheme" ' – AndroidEx

+1

questo? è lo stesso problema del link di @divyenduz, ma è nascosto dietro un altro problema non correlato. Il problema sembra essere che i vari figli di Activity non impostano correttamente le informazioni sulla proprietà della View, quindi va alla ricerca della custom metodo nella classe genitore generica android.view.ContextThemeWrapper piuttosto che nella sottoclasse Attività personalizzata in cui esiste effettivamente. –

risposta

3

Ok, quindi ho fatto il mio test. Ho creato un layout relativo di base con un solo pulsante, inserisco android:theme="@style/AppTheme" e un pulsante: l'app si è bloccata con lo stesso errore. Quindi ho rimosso l'attributo android:theme - l'evento onclick è stato attivato come dovrebbe.

Lo stesso è accaduto quando ho usato AppCompatActivity invece di ora deprecato ActionBarActivity.

È difficile per me dire perché non funziona con android:theme. È una delle funzionalità di Lollipop, ma ho provato a lanciarmi con l'emulatore API 5.0. The article afferma che attualmente questo attributo è supportato solo per android.support.v7.widget.Toolbar.

+0

Perfetto! Ha funzionato come un fascino. Darò a quell'articolo una buona lettura. Lo apprezzo! – ThePartyTurtle

+0

wtf ... verrà risolto in appcompat? –

+0

@PavelBiryukov Spero che una volta saremo in grado di applicare l'attributo 'theme' ad altre viste così come dovrebbe essere ... – AndroidEx

Problemi correlati