2013-05-22 74 views
2

我是Android新手。我已經開始使用ActivityLifeCycle應用程序。在這我有3個活動課。從第一個活動開始,我想在第一個活動中點擊一個按鈕時使用意圖進入第二個活動課程。但它給錯誤。並且我已經導入了正確的android.view.View包。java.lang.IllegalStateExeption:在活動類中找不到方法finishA(View)

同樣的問題之前被別人問過,但是我沒有得到解決方案,這裏有 這是容易出錯的代碼。

activity_main.xml中:

<Button 
    android:id="@+id/button1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/textView1" 
    android:layout_marginTop="22dp" 
    android:layout_toRightOf="@+id/textView1" 
    android:onClick="startActivityB" 
    android:clickable="true" 
    android:text="startb" /> 

<Button 
    android:id="@+id/button2" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignLeft="@+id/button1" 
    android:layout_below="@+id/button1" 
    android:layout_marginTop="31dp" 
    android:onClick="finishA" 
    android:clickable="true" 
    android:text="FinishA" /> 

<Button 

MainActivity.java:(這是第一次活動)

保護無效startActivityB(視圖v){

Intent intent = new Intent(getApplicationContext(), Activity_B.class); 
    startActivity(intent); 
} 
protected void finishA(View v) 
{ 
    MainActivity.this.finish(); 
} 

這是錯誤我得到了logcat:

D/Avtivity_A(1333): onStart()of Activity_A started 
D/Avtivity_A(1333): onResume()Activity_A started 
D/AndroidRuntime(1333): Shutting down VM 
W/dalvikvm(1333): threadid=1: thread exiting with uncaught exception (group=0x4001d800) 
E/AndroidRuntime(1333): FATAL EXCEPTION: main 
E/AndroidRuntime(1333): java.lang.IllegalStateException: Could not find a method 
    finishA(View) in the activity class com.example.lifecycle.MainActivity for 
    onClick handler on view class android.widget.Button with id 'button2' 
E/AndroidRuntime(1333): at android.view.View$1.onClick(View.java:2059) 
E/AndroidRuntime(1333): at android.view.View.performClick(View.java:2408) 
E/AndroidRuntime(1333): at android.view.View$PerformClick.run(View.java:8816) 
E/AndroidRuntime(1333): at android.os.Handler.handleCallback(Handler.java:587) 
E/AndroidRuntime(1333): at android.os.Handler.dispatchMessage(Handler.java:92) 
E/AndroidRuntime(1333): at android.os.Looper.loop(Looper.java:123) 
E/AndroidRuntime(1333): at android.app.ActivityThread.main(ActivityThread.java:4627) 
E/AndroidRuntime(1333): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(1333): at java.lang.reflect.Method.invoke(Method.java:521) 
E/AndroidRuntime(1333): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
E/AndroidRuntime(1333): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
E/AndroidRuntime(1333): at dalvik.system.NativeStart.main(Native Method) 
+0

finishA(查看)這是什麼功能是你確定它在你的代碼中,或者它完成了();並且你錯放了某些東西 – NetStarter

+1

你很少看到button1的XML,但錯誤似乎在button2中,所以請顯示正確的文件。 – Devolus

回答

2

在你定義一個onClick處理函數的xml中,這個名字是處理程序的函數名。我想你沒有實現這個功能。

i.E.

在XML

您有:

android:onClick="finishA" 

,並在課堂上,你必須實現一個功能:

public void finishA(View view) 
{ 
} 

不知道這是否是原因,但它看起來像它。如果不是,則發佈XML和類(它的相關部分)。

更新

在你的問題的錯誤引用BUTTON2和你的XML是關於Button1的,所以你應該向我們展示了正確的文件。

更新

你的onClick處理程序是protected但它需要public作爲樣本我上面顯示英寸當我在我的應用程序中測試這個時,我使它受到保護時出現同樣的錯誤。

+0

我認爲OP已經改變了你的答案後發佈的問題沒有線'android:onClick =「finishA」' – NetStarter

+0

是的,XML不在那裏,所以我認爲這是原因,因爲問題是不完整的。 – Devolus

+0

sry我已添加代碼 – rms27

2

在你的代碼已經調用的函數的地方(而不是在代碼中你已經在你的問題中提供)

java.lang.IllegalStateException:找不到在活動的方法 finishA(查看)類com.example.lifecycle.MainActivity對視圖類android.widget.Button 的onClick處理程序ID爲「按鈕2」

它說,在你的mainActivity這是對button2點擊不button1 WH實現的功能ich你在你的代碼中顯示。 它可能包含一行表示調用finishA(View v),並且編譯器在類的聲明中搜索相同的內容時缺少該行。

更新後質疑

通過Devolus的建議你有你的功能finishA()使用受保護的訪問修飾符應爲同一個,而不是保護公衆使用。

如果您使用protected作爲訪問修飾符,那麼它使該功能僅對類和相同類的子類可用。因此,當您從活動B調用finishA()時,無法找到finishA()函數。

受保護的變量和方法允許類本身來訪問它們,類相同的包訪問它們的內部,而類的子類來訪問它們

凡爲使用公共訪問修飾符的功能將可每一個實現類的對象類Activity-A

你可以讀到更多在:http://www.java-made-easy.com/java-access-modifiers.html

this問題上的SO將有助於

如果您的012xx和Activity-B類在同一個包中,您可以繼續在您的函數中使用受保護的訪問修飾符,方法是在Activity-B類中創建類Activity-A的對象(注意:如果要使用類名稱而不創建一個對象,你將不得不使用protected static,同時聲明函數)。

隨着

protected void finishA(View v) 
{ 
    MainActivity.this.finish(); 
} 

呼叫在活動-B類中的方法(它會如果這兩個類在同一個包才起作用)

ActivityA obj = new ActivityA(); 
obj.finishA(View v); 

隨着

public void finishA(View v) 
    { 
     MainActivity.this.finish(); 
    } 

呼叫中活動-B類中的方法爲

ActivityA obj = new ActivityA(); 
obj.finishA(View v); 

隨着

public static void finishA(View v) 
    { 
     MainActivity.this.finish(); 
    } 

呼叫中活動-B類中的方法爲

ActivityA.finishA(View v); 

protected static void finishA(View v) 
    { 
     MainActivity.this.finish(); 
    } 

呼叫在活動-B類中的方法(它會如果這兩個類在同一個包才起作用)

ActivityA.finishA(View v); 
相關問題