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?
UPDATE: change code... stil fail ... add error log I want to have all of my buttons were processed in ome method.
main activity class
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>
inflating layout
<?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>
error log
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
UPDATE 2:
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>
and you should be note another : public void onclick_method(){your logic;}.the studio do not give you a hint. I just write like this and waste much time to find the answer, finally i found that the right method is like this : public void onclick_method(View view){your logic;} so, donot be forget the parameter in the bracket!
Remove the
@Override
annotation. Check out the official documentation for android:onClick - in their case the "selfDestruct(View)" handler method.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.
And in your Activity class
Remove the implementation of OnClickListener so that the definition of your class becomes:
UPDATE2: If you want all buttons to be handled by 1 click listener do something like that:
A common problem I've seen is that beginners will declare the onClick method as protected or private. When you do this the XML engine cannot access the method which creates this problem.
Is your second activity in the manifest.xml?
You need to add al your activity's in there. See code below Change SecondActivity in your activity. And set the package name to were your activity is located
The problem in themes of layouts for Android 5.X The main activity do not have tag theme in layout.xml other has and it's a mistake for Android OS.
Solution is here: android 5 and onClick in xml layout
In short: 1) remove tag sheme from all layouts; 2) add tag with correct sheme in manifest
I have tryed for android 5.X phones - it works.
Your not overriding a method so remove
@Override
To avoid this in the future you can create your own annotation to declare your methods that are added in the Android XML layout.
Here is a blog post tutorial:
http://blog.blundell-apps.com/using-annotations-for-android-xml-onclick-visibility/