2015-06-18 23 views
8

Tôi gặp sự cố trong đó Nút của tôi (id i_am_a_problem) được khai báo trong XML bố cục của đoạn, tạo ra lỗi khi nút được nhấp. Android cố gắng gọi phương thức onClick public void calculate(View v) nhưng không thể tìm thấy nó (mặc dù nó được khai báo trong MainActivity). Chi tiết mã của tôi bên dưới và lỗi sau đó. Vui lòng giúp tôi xác định lý do android không thể tìm thấy phương thức onClick. Cảm ơn.Android không thể tìm thấy phương thức onClick của tôi

Có thực sự là không bất cứ điều gì khác đang xảy ra trong mã này (dự án mới mẻ)

MainActivity.java

package supercali.FRAG.alistic; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.TextView; 

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { /*snip - irrelevance*/ } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { /*snip - irrelevance*/ } 

    public void calculcate(View v){ 
     TextView tv = (TextView)findViewById(R.id.results); 
     tv.setText(calculate_value()); 
    } 

    private String calculate_value(){ 
     return "Abra Kadabra"; 
    } 
} 

bố trí MainActivity của chỉ chứa một đoạn

<fragment 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/fragment" 
    android:name="supercali.FRAG.alistic.MainActivityFragment" 
    tools:layout="@layout/fragment_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

Và cách bố trí cho Fragment đó là:

<LinearLayout 
    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" 
    tools:context=".MainActivityFragment"> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/calculate" 
     android:onClick="calculate" 
     android:id="@+id/i_am_a_problem"/> 

    <TextView android:text="@string/results_pending" android:layout_width="wrap_content" 
     android:layout_height="wrap_content" android:id="@+id/results"/> 

</LinearLayout> 

Vấn đề Nút chỉ là có ^^ với id i_am_a_problem

LogCat:

06-18 09:49:41.280 31642-31642/supercali.FRAG.alistic E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: supercali.FRAG.alistic, PID: 31642 
    java.lang.IllegalStateException: Could not find method calculate(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatButton 
      at android.view.View$DeclaredOnClickListener.resolveMethod(View.java:4441) 
      at android.view.View$DeclaredOnClickListener.onClick(View.java:4405) 
      at android.view.View.performClick(View.java:5147) 
      at android.view.View$PerformClick.run(View.java:21069) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:148) 
      at android.app.ActivityThread.main(ActivityThread.java:5401) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:725) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:615) 
+0

Có thể thực tế là nó nằm trong 'FrameLayout' là vấn đề. Dù sao, cố gắng tránh XML 'onClick', và làm điều đó bằng mã với' setOnClickListener() 'và xem nếu nó hoạt động. – shkschneider

Trả lời

17

Bạn sai chính tả phương pháp. XML đang tìm kiếm tính toán nhưng phương pháp của bạn là calculcate

+0

Yup. Tôi biết đó là một cái gì đó ngu ngốc như thế. Nhìn qua nó rất nhiều lần quá. – Zerp

+0

Trong trường hợp của tôi, lỗi là tôi không chuyển đối tượng View trong phương thức như tính toán (Xem v) :) – Omama

+0

Tôi đơn giản không thể tin rằng tôi đã dành hơn 2 giờ để đấu tranh với một kiểm tra chính tả đơn giản. Chết tiệt tâm trí cố định của tôi. –

1

Viết tên Phương pháp chính xác:

public void calculate(View v){ 
     TextView tv = (TextView)findViewById(R.id.results); 
     tv.setText(calculate_value()); 
    } 
3

phương pháp onclick của bạn được gọi là "calculcate" trong hoạt động. Trong XML nó "tính toán".

1

Chỉ cần cả hai chính tả khác nhau ....

<Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/calculate" 
     android:onClick="calculcate" 
     android:id="@+id/i_am_a_problem"/> 

Tôi chỉ android đặt: onClick = "calculcate" Trong khi bạn sử dụng từ "calculcate"

public void calculcate(View v){ 
..... 
} 

Và bạn sử dụng android:onClick="calculate"

2

Tôi gặp lỗi tương tự nhưng phương pháp onClick của tôi bị ghi đè từ hoạt động cơ sở của tôi lớp và khi tôi ghi đè lên nó với trình soạn thảo giúp chữ ký của nó đã được bảo vệ và do đó là vấn đề.

Sự cố đã được giải quyết khi tôi công khai.

1

Bạn đã viết sai chính tả. Và nếu điều đó không hiệu quả, hãy thử chế độ xem Chế độ xem thay vì Xem v.

0

Thực tế, trong AndroidManifest tệp để xác minh tên có chính xác hay không. AndroidManifest hiển thị dòng màu đã đọc nếu tên tệp xml và tên tệp lớp không liên quan.

Căn cứ vào sự cố, onClickListener không thể tìm thấy tệp lớp học của bạn do tên sai. Lỗi sẽ chỉ hiển thị lỗi Onclick.Vấn đề này có thể gây nhầm lẫn rằng bạn có thể đặt sai onClickListener nhưng vấn đề thực tế là bạn đặt sai tên trong tệp xml và lớp hoạt động.

Thỉnh thoảng, bạn sẽ không thấy lỗi trong tệp xml và hoạt động vì cùng một tên android. Trong trường hợp này, bạn có thể xác minh dễ dàng những gì đã sai trong tệp AndroidManifest.

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