2015-04-30 16 views
6

Tôi đang tạo ứng dụng có tên Ping trong Android Studio. Cho đến nay các hoạt động của tôi là LoginActivity ProfileActivity và Timeline. Vấn đề của tôi là một nút trong bố cục tương ứng với hoạt động Dòng thời gian có phương thức onClick không hoạt động. Khi nút được nhấp, trình giả lập cho "Unfortunatley, Ping đã dừng lại." Tôi đang xác định các nút và phương pháp onClick giống như cách tôi có cho các nút khác có chức năng đang hoạt động, chỉ có một nút này dường như không hoạt động. Tôi nhận được một lỗi nói rằng phương pháp này không thể được tìm thấy, nhưng tôi đã viết phương thức trong hoạt động tương ứng. Đây là logcat:java.lang.IllegalStateException: không thể tìm thấy phương thức onClick của nút trong 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) 

Đây là lớp hoạt động Timeline của tôi:

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); 
    } 
} 

Và đây là Timeline mã bố trí xml của tôi:

<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> 

Tôi khá tích cực không có các vấn đề chính tả và cũng không có các nút khác chia sẻ cùng một ID hoặc các phương thức có cùng tên. Bị mắc kẹt về điều này trong một vài ngày, bất kỳ trợ giúp được đánh giá rất nhiều!

+1

Tại sao bạn không đăng ký nó từ mã java 'Button.setOnClickListener (mới View.onClickListener'? –

+1

Bạn có nhớ thử nghiệm nó không có dòng này không:" android: theme = "@ style/GeneralTheme" '? – AndroidEx

+1

Vấn đề có vẻ là các trẻ em khác nhau của Hoạt động không đặt đúng thông tin quyền sở hữu của Chế độ xem, vì vậy nó sẽ tìm kiếm tùy chỉnh trong lớp cha mẹ chung android.view.ContextThemeWrapper thay vì trong lớp con Hoạt động tùy chỉnh nơi nó thực sự tồn tại –

Trả lời

3

Ok, vì vậy tôi đã thực hiện bài kiểm tra của riêng mình. Tôi đã đặt cùng một bố cục tương đối cơ bản với một nút duy nhất, đặt android:theme="@style/AppTheme" vào trong đó và một nút - ứng dụng bị lỗi với cùng một lỗi. Sau đó, tôi đã xóa thuộc tính android:theme - sự kiện onclick được kích hoạt như mong muốn.

Tất cả điều tương tự cũng xảy ra khi tôi sử dụng AppCompatActivity thay vì không dùng nữa ActionBarActivity.

Thật khó để tôi nói lý do tại sao nó không hoạt động với android:theme. Đó là một trong những tính năng của Lollipop, nhưng tôi đã cố gắng khởi chạy trình mô phỏng API 5.0. The article tuyên bố rằng hiện tại thuộc tính này chỉ được hỗ trợ cho android.support.v7.widget.Toolbar.

+0

Hoàn hảo! Nó làm việc như một say mê. Tôi sẽ cho bài viết đó một bài đọc tốt. Tôi đánh giá cao nó! – ThePartyTurtle

+0

wtf ... là nó sẽ được cố định trong appcompat? –

+0

@PavelBiryukov Tôi hy vọng một khi chúng tôi có thể áp dụng thuộc tính 'chủ đề' cho các chế độ xem khác cũng như có nghĩa là ... – AndroidEx

Các vấn đề liên quan