2

私はAndroidが初めてです。ActivityLifeCycle アプリでやり始めました。これには、3つのアクティビティクラスがあります。最初のアクティビティから、最初のアクティビティでボタンがクリックされたときにインテントを使用して 2 番目のアクティビティ クラスに移動したいと考えています。しかし、それはエラーを出しています。android.view.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: (これが最初のアクティビティです)

protected void 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)
4

2 に答える 2

2

アクティビティの xml で onClick ハンドラーを定義しました。この名前はハンドラーの関数名です。機能を実装していないと思います。

iE

あなたが持っているXMLで:

android:onClick="finishA"

クラスでは、関数を実装する必要があります。

public void finishA(View view)
{
}

これが原因かどうかは定かではありませんが、そのように見えます。そうでない場合は、XML とクラス (その関連部分) を投稿してください。

アップデート

あなたの質問では、エラーはbutton2を参照しており、XMLはbutton1に関するものであるため、正しいファイルを表示する必要があります。

アップデート

onClick ハンドラーはありますが、上記のサンプルのようにprotectedする必要があります。publicアプリでこれをテストすると、保護すると同じエラーが発生します。

于 2013-05-22T13:35:26.613 に答える
2

あなたのコードでは、どこかで関数を呼び出しました(質問で提供したコードではありません)

java.lang.IllegalStateException: ID 'button2' のビュー クラス android.widget.Button の onClick ハンドラのアクティビティ クラス com.example.lifecycle.MainActivity でメソッド finishA(View) が見つかりませんでした

mainActivity では、コードに表示されたものではbutton2なく、クリック時に実装される関数であることがわかりbutton1ます。への呼び出しを示す行が含まれている可能性がありfinishA(View v)、コンパイラが同じものを検索すると、クラスの宣言に欠落しています。

質問への更新後

Devolusが示唆するように、関数に保護されたアクセス修飾子をfinishA()使用しました。保護されたのではなく、同じものにパブリックを使用する必要があります。

アクセス修飾子として protected を使用すると、関数は同じクラスのクラスとサブクラスでのみ使用できるようになります。そのため、アクティビティ B から を呼び出しているときにfinishA()、関数を見つけることができませんfinishA()

保護された変数とメソッドにより、クラス自体がそれらにアクセスし、同じパッケージ内のクラスがそれらにアクセスし、そのクラスのサブクラスがそれらにアクセスできます。

パブリックアクセス修飾子を使用すると、関数はクラスのオブジェクトを実装する各クラスで利用可能になりますActivity-A

詳細については、 http : //www.java-made-easy.com/java-access-modifiers.html を参照してください。

SOに関するこの質問は役に立ちます

Activity-A両方とActivity-Bクラスが同じパッケージにある場合は、クラスActivity-Aでクラスのオブジェクトを作成することにより、関数で保護されたアクセス修飾子を使用することもできますActivity-B(注: オブジェクトを作成せずにクラス名を使用する場合は、protected static関数の宣言時に使用します。)

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

Activity-Bクラスのメソッドを次のように呼び出します(両方のクラスが同じパッケージにある場合にのみ機能します)

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

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

Activity-B クラスのメソッドを次のように呼び出します。

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

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

Activity-B クラスのメソッドを次のように呼び出します。

ActivityA.finishA(View v);

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

Activity-Bクラスのメソッドを次のように呼び出します(両方のクラスが同じパッケージにある場合にのみ機能します)

ActivityA.finishA(View v);
于 2013-05-22T13:59:36.427 に答える