2015-04-30 3 views
6

Я создаю приложение под названием Ping в Android Studio. Пока что мои действия - это ProfileActivity ProfileActivity и Timeline. Моя проблема заключается в том, что кнопка в макете, соответствующая активности временной шкалы, имеет метод onClick, который не работает. Когда кнопка нажата, эмулятор выдает «Unfortunatley, Ping остановился». Я определяю кнопки и методы onClick так же, как и для других кнопок, функции которых работают, только этот, похоже, не работает. Я получаю сообщение о том, что метод не найден, но я написал метод в соответствующем действии. Вот LogCat:java.lang.IllegalStateException: не удается найти метод кнопки onClick в 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) 

Вот мой класс 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); 
    } 
} 

А вот мой Timeline код макета 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> 

Я довольно положительный там нет проблемы с орфографией, а также нет других кнопок, которые имеют один и тот же идентификатор или методы, имеющие одно и то же имя. Застрял на этом в течение нескольких дней, любая помощь очень ценится!

+1

Почему вы не зарегистрировали его из java-кода 'Button.setOnClickListener (новый View.onClickListener'? –

+1

Не возражаете тестировать его без этой строки:' android: theme = "@ style/GeneralTheme"?? – AndroidEx

+1

Это та же проблема, что и в ссылке by @divyenduz, однако она скрыта там за дополнительной, не связанной с этим проблемой. Проблема заключается в том, что различные дочерние элементы Activity неправильно задают информацию о собственности View, поэтому она ищет пользовательскую метод в родовом родительском классе android.view.ContextThemeWrapper, а не в подклассе Custom Activity, где он действительно существует. –

ответ

3

Хорошо, поэтому я сделал свой собственный тест. Я собрал базовый относительный макет с помощью одной кнопки, положил в него android:theme="@style/AppTheme", а приложение с кнопкой с одной ошибкой. Затем я удалил атрибут android:theme - событие onclick было запущено как следует.

Все это произошло, когда я использовал AppCompatActivity вместо устаревших ActionBarActivity.

Мне сложно сказать, почему это не работает с android:theme. Это одна из функций Lollipop, но я попытался запустить эмулятор API 5.0. The article утверждает, что данный атрибут поддерживается только для android.support.v7.widget.Toolbar.

+0

Отлично! Оно работало завораживающе. Я хорошо прочитаю эту статью. Я ценю это! – ThePartyTurtle

+0

wtf ... он будет исправлен в appcompat? –

+0

@PavelBiryukov Надеюсь, когда мы сможем применить атрибут 'theme' к другим представлениям, а также ... – AndroidEx

Смежные вопросы