在活动中找不到方法 onClick(View) [英] Could not find a method onClick(View) in the activity
问题描述
inflate 布局中的按钮单击在运行时失败,因为找不到方法.E/AndroidRuntime(921): java.lang.IllegalStateException: 在活动中找不到方法 onClick(View)但是,如果单击主布局中的按钮,效果很好.我做错了什么?
The button click in inflate layout fails at runtime because the method cannot be found. E/AndroidRuntime(921): java.lang.IllegalStateException: Could not find a method onClick(View) in the activity but, if click on button from main layout, work good. What have I done wrong?
更新:更改代码...仍然失败...添加错误日志我想让我的所有按钮都用 ome 方法处理.
UPDATE: change code... stil fail ... add error log I want to have all of my buttons were processed in ome method.
主要活动类
package com.android.insertview;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Toast;
public class InsertViewActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/*LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ViewGroup parent = (ViewGroup)findViewById(R.id.main_view);
inflater.inflate(R.layout.volume_control, parent);*/
LayoutInflater vi = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = vi.inflate(R.layout.volume_control, null);
View insertPoint = findViewById(R.id.main_view);
((ViewGroup) insertPoint).addView(v, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT
, ViewGroup.LayoutParams.WRAP_CONTENT));
}
public void btnclick(View v) {
// TODO Auto-generated method stub
Context context = getApplicationContext();
Toast toast = Toast.makeText(context,
"This is Toast Notification", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
}
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" android:id="@+id/main_view">
</LinearLayout>
膨胀布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" android:background="@drawable/service_button_container_background"
android:id="@+id/volume_view">
<Button
android:id="@+id/volume_up"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/button_volume_up"
android:onClick="btnclick" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/button_volume_mute_off"
android:onClick="btnclick"/>
<Button
android:id="@+id/volume_down"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/button_volume_down"
android:onClick="btnclick"/>
</LinearLayout>
错误日志
03-19 15:31:45.184: W/dalvikvm(1071): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
03-19 15:31:45.184: E/AndroidRuntime(1071): Uncaught handler: thread main exiting due to uncaught exception
03-19 15:31:45.194: E/AndroidRuntime(1071): java.lang.IllegalStateException: Could not find a method genclick(View) in the activity
03-19 15:31:45.194: E/AndroidRuntime(1071): at android.view.View$1.onClick(View.java:2020)
03-19 15:31:45.194: E/AndroidRuntime(1071): at android.view.View.performClick(View.java:2364)
03-19 15:31:45.194: E/AndroidRuntime(1071): at android.view.View.onTouchEvent(View.java:4179)
03-19 15:31:45.194: E/AndroidRuntime(1071): at android.widget.TextView.onTouchEvent(TextView.java:6541)
03-19 15:31:45.194: E/AndroidRuntime(1071): at android.view.View.dispatchTouchEvent(View.java:3709)
03-19 15:31:45.194: E/AndroidRuntime(1071): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
03-19 15:31:45.194: E/AndroidRuntime(1071): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
03-19 15:31:45.194: E/AndroidRuntime(1071): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
03-19 15:31:45.194: E/AndroidRuntime(1071): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
03-19 15:31:45.194: E/AndroidRuntime(1071): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
03-19 15:31:45.194: E/AndroidRuntime(1071): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
03-19 15:31:45.194: E/AndroidRuntime(1071): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
03-19 15:31:45.194: E/AndroidRuntime(1071): at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
03-19 15:31:45.194: E/AndroidRuntime(1071): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
03-19 15:31:45.194: E/AndroidRuntime(1071): at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
03-19 15:31:45.194: E/AndroidRuntime(1071): at android.os.Handler.dispatchMessage(Handler.java:99)
03-19 15:31:45.194: E/AndroidRuntime(1071): at android.os.Looper.loop(Looper.java:123)
03-19 15:31:45.194: E/AndroidRuntime(1071): at android.app.ActivityThread.main(ActivityThread.java:4363)
03-19 15:31:45.194: E/AndroidRuntime(1071): at java.lang.reflect.Method.invokeNative(Native Method)
03-19 15:31:45.194: E/AndroidRuntime(1071): at java.lang.reflect.Method.invoke(Method.java:521)
03-19 15:31:45.194: E/AndroidRuntime(1071): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
03-19 15:31:45.194: E/AndroidRuntime(1071): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
03-19 15:31:45.194: E/AndroidRuntime(1071): at dalvik.system.NativeStart.main(Native Method)
03-19 15:31:45.194: E/AndroidRuntime(1071): Caused by: java.lang.NoSuchMethodException: genclick
03-19 15:31:45.194: E/AndroidRuntime(1071): at java.lang.ClassCache.findMethodByName(ClassCache.java:308)
03-19 15:31:45.194: E/AndroidRuntime(1071): at java.lang.Class.getMethod(Class.java:1014)
03-19 15:31:45.194: E/AndroidRuntime(1071): at android.view.View$1.onClick(View.java:2017)
03-19 15:31:45.194: E/AndroidRuntime(1071): ... 22 more
更新 2:
好的,如果我这样做了,我可以在一个方法 genericClick() 中处理所有按钮点击
ok, if i do so, i can handled all buttons click in one method genericClick()
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/front_end"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<!-- Main -->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:background="@drawable/service_button_container_background" >
<ImageButton
android:id="@+id/radio"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/button_radio"
android:clickable="true"
android:onClick="genericClick" />
<ImageButton
android:id="@+id/player"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/button_player"
android:onClick="genericClick" />
<ImageButton
android:id="@+id/navi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/button_navigation"
android:onClick="genericClick" />
</LinearLayout>
<!-- Volume controls -->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/volume_controls"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:background="@drawable/service_button_container_background"
android:orientation="vertical" >
<ImageButton
android:id="@+id/volume_up"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/button_volume_up"
android:onClick="genericClick" />
<ImageButton
android:id="@+id/volume_mute"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/button_volume_mute_off"
android:onClick="genericClick" />
<ImageButton
android:id="@+id/volume_down"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/button_volume_down"
android:onClick="genericClick" />
</LinearLayout>
<!-- Radio controls -->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/radio_controls"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignRight="@+id/main_view"
android:layout_marginRight="100dp"
android:background="@drawable/service_button_container_background"
android:visibility="invisible" >
<ImageButton
android:id="@+id/radio_preset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="genericClick" android:background="@drawable/button_menu"/>
<ImageButton
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/button_rewind"
android:onClick="genericClick" />
<ImageButton
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/button_play"
android:onClick="genericClick" />
<ImageButton
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/button_forward"
android:onClick="genericClick" />
</LinearLayout>
<!-- Radio Info -->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/radio_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/radio_controls"
android:layout_alignLeft="@+id/main_view"
android:layout_marginLeft="100dp"
android:background="@drawable/service_button_container_background"
android:orientation="vertical"
android:visibility="invisible">
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="FM"
android:textSize="18.0px" />
<TextView
android:id="@+id/preset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1"
android:textColor="#ffd6d6d6"
android:textSize="18.0px" />
<TextView
android:layout_width="10.0dip"
android:layout_height="wrap_content"
android:text=" "
android:textSize="18.0px" />
<TextView
android:id="@+id/frequency"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="108.0"
android:textColor="#ffd6d6d6"
android:textSize="18.0px" />
</LinearLayout>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/title"
android:layout_width="195.0dip"
android:layout_height="24.0dip"
android:text="Русское радио"
android:textColor="#ffd6d6d6"
android:textSize="18.0px" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
推荐答案
去掉 @Override
注释.查看 android:onClick 的官方 文档 - 在他们的案例中selfDestruct(View)"处理方法.
Remove the @Override
annotation. Check out the official documentation for android:onClick - in their case the "selfDestruct(View)" handler method.
更新:正如其他人所建议的,您不应该为您的事件处理程序方法使用这样的通用命名 - onClick"太通用了.如果你有 10 个按钮呢?尝试类似onClickLoginButton"、onClickSaveBtn"等.我认为您不能将onClick"用作偶数处理程序方法的名称,因为 View.OnClickListener 有 "onClick" 方法,所以无论如何你都需要更改名称.
Update: as the others suggested, you should not use such a generic naming for your event-handler method - "onClick" is too generic. What if you have 10 buttons? Try something like "onClickLoginButton", "onClickSaveBtn" etc. I think you cannot use "onClick" as name for your even-handler method, because View.OnClickListener has "onClick" method, so you need to change the name anyways.
<Button
android:id="@+id/volume_up"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/button_volume_up"
android:onClick="handleVolumeUp" />
在你的 Activity 类中
And in your Activity class
public void handleVolumeUp(View view) {
// TODO Auto-generated method stub
}
去掉 OnClickListener 的实现,这样你的类的定义就变成了:
Remove the implementation of OnClickListener so that the definition of your class becomes:
public class InsertViewActivity extends Activity
更新 2:如果您希望所有按钮都由 1 单击侦听器处理,请执行以下操作:
UPDATE2: If you want all buttons to be handled by 1 click listener do something like that:
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn1 = (Button)findViewById(R.id.btn1);
btn1.setOnClickListener(btnListener);
Button btn2 = (Button)findViewById(R.id.btn2);
btn2.setOnClickListener(btnListener);
Button btn3 = (Button)findViewById(R.id.btn3);
btn3.setOnClickListener(btnListener);
}
private OnClickListener btnListener = new OnClickListener()
{
public void onClick(View v)
{
//do the same stuff or use switch/case and get each button ID and do different
//stuff depending on the ID
}
};
这篇关于在活动中找不到方法 onClick(View)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!