2

I have a strange event. I have two phones 4.1.2 and 2.3.6 android versions, 4.1.2 works fine but older one throws this error.

My XML:

  <?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

<RelativeLayout 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<ImageButton 

    android:id="@+id/IB_Nearest"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="IB_Nearest"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:src="@drawable/marker"
    android:background="@null"
    android:layout_margin="30dp"
    />     
    <ImageButton 
    android:id="@+id/IB_Category"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="IB_Category"
    android:src="@drawable/book"
    android:layout_alignParentTop="true"
    android:layout_alignParentRight="true"
    android:background="@null"
    android:layout_margin="30dp"
    />
<ImageButton 

    android:id="@+id/IB_Map"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="IB_Map"
    android:layout_below="@id/IB_Category"
    android:layout_alignParentRight="true"
    android:src="@drawable/mappp"
    android:background="@null"
    android:layout_margin="30dp"
    />




<ImageButton 
    android:id="@+id/IB_Search"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="IB_Search"
    android:src="@drawable/search"
    android:layout_below="@id/IB_Nearest"
    android:layout_alignParentLeft="true"
    android:background="@null"
    android:layout_margin="30dp"
    />
<ImageButton 

    android:id="@+id/IB_NewPlace"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="IB_NewPlace"
    android:layout_below="@id/IB_Search"
    android:layout_alignParentLeft="true"
    android:src="@drawable/info"
    android:background="@null"

    />

<ImageButton 
    android:id="@+id/IB_Statistics"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="IB_Statistics"
    android:src="@drawable/chart"
    android:layout_below="@id/IB_Map"
    android:layout_alignParentRight="true"
    android:background="@null"

    />
</RelativeLayout>
</ScrollView>

My Main:

public class MainActivity extends FragmentActivity implements
LoaderManager.LoaderCallbacks<Cursor>{



    @Override
    protected void onCreate(Bundle savedInstanceState) {
         requestWindowFeature(Window.FEATURE_NO_TITLE); 
        super.onCreate(savedInstanceState);


    }




    public void IB_Map (View v){
        Intent intent = new Intent(MainActivity.this, Map.class);
        startActivity(intent);
    }
    public void IB_Category(View v){

        Intent intent = new Intent(MainActivity.this, TreeChoice.class);
        startActivity(intent);
    }
    public void IB_Nearest (View v){
        Intent intent = new Intent(MainActivity.this, NearPlaces.class);
        startActivity(intent);
    }
    public void IB_Search (View v){

        Intent intent = new Intent(MainActivity.this, Search.class);
        startActivity(intent);
    }
    public void IB_NewPlace (View v){
        Intent intent = new Intent(MainActivity.this, NewPlace.class);
        startActivity(intent);
    }
    public void IB_Statistics (View v){

        Intent intent = new Intent(MainActivity.this, Statistics.class);
        startActivity(intent);
    }














    /**
     * Background Async Task to Load all product by making HTTP Request
     * */
    public class LoadAllProducts extends AsyncTask<String, String, String> {



        /**
         * Before starting background thread Show Progress Dialog
         * */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();

        }

        /**
         * getting All products from url
         * */
        protected String doInBackground(String... args) {

            return null;
        }

        /**
         * After completing background task Dismiss the progress dialog
         * **/
        protected void onPostExecute(String file_url) {

        }



    }













    @Override
    public android.support.v4.content.Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
        // TODO Auto-generated method stub
        return null;
    }


    public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) {
        // TODO Auto-generated method stub

    }


    public void onLoaderReset(Loader<Cursor> arg0) {
        // TODO Auto-generated method stub

    }


    @Override
    public void onLoadFinished(
            android.support.v4.content.Loader<Cursor> arg0, Cursor arg1) {
        // TODO Auto-generated method stub

    }


    @Override
    public void onLoaderReset(android.support.v4.content.Loader<Cursor> arg0) {
        // TODO Auto-generated method stub

    }

}

But if I use this listener implementation:

 final ImageButton rightButton = (ImageButton) findViewById(R.id.IB_Map);
                rightButton.setOnClickListener(new ImageButton.OnClickListener() {  
                    public void onClick(View v)
                        {
                        Intent intent = new Intent(MainActivity.this, Map.class);
                        startActivity(intent);
                        }
                     });

Everything works, could someone explain why this happens?

12-10 00:05:21.875: E/AndroidRuntime(28537): FATAL EXCEPTION: main
12-10 00:05:21.875: E/AndroidRuntime(28537): java.lang.IllegalStateException: Could not find a method IB_Map(View) in the activity class lt.whitegroup.workplaces.ui.MainActivity for onClick handler on view class android.widget.ImageButton with id 'IB_Map'
12-10 00:05:21.875: E/AndroidRuntime(28537):    at android.view.View$1.onClick(View.java:2131)
12-10 00:05:21.875: E/AndroidRuntime(28537):    at android.view.View.performClick(View.java:2485)
12-10 00:05:21.875: E/AndroidRuntime(28537):    at android.view.View$PerformClick.run(View.java:9080)
12-10 00:05:21.875: E/AndroidRuntime(28537):    at android.os.Handler.handleCallback(Handler.java:587)
12-10 00:05:21.875: E/AndroidRuntime(28537):    at android.os.Handler.dispatchMessage(Handler.java:92)
12-10 00:05:21.875: E/AndroidRuntime(28537):    at android.os.Looper.loop(Looper.java:130)
12-10 00:05:21.875: E/AndroidRuntime(28537):    at android.app.ActivityThread.main(ActivityThread.java:3687)
12-10 00:05:21.875: E/AndroidRuntime(28537):    at java.lang.reflect.Method.invokeNative(Native Method)
12-10 00:05:21.875: E/AndroidRuntime(28537):    at java.lang.reflect.Method.invoke(Method.java:507)
12-10 00:05:21.875: E/AndroidRuntime(28537):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
12-10 00:05:21.875: E/AndroidRuntime(28537):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
12-10 00:05:21.875: E/AndroidRuntime(28537):    at dalvik.system.NativeStart.main(Native Method)
12-10 00:05:21.875: E/AndroidRuntime(28537): Caused by: java.lang.NoSuchMethodException
12-10 00:05:21.875: E/AndroidRuntime(28537):    at java.lang.Class.getDeclaredMethods(Native Method)
12-10 00:05:21.875: E/AndroidRuntime(28537):    at java.lang.ClassCache.getDeclaredPublicMethods(ClassCache.java:153)
12-10 00:05:21.875: E/AndroidRuntime(28537):    at java.lang.ClassCache.getMethodsRecursive(ClassCache.java:216)
12-10 00:05:21.875: E/AndroidRuntime(28537):    at java.lang.ClassCache.findMethods(ClassCache.java:175)
12-10 00:05:21.875: E/AndroidRuntime(28537):    at java.lang.ClassCache.getMethods(ClassCache.java:167)
12-10 00:05:21.875: E/AndroidRuntime(28537):    at java.lang.Class.getMethod(Class.java:961)
12-10 00:05:21.875: E/AndroidRuntime(28537):    at android.view.View$1.onClick(View.java:2124)
12-10 00:05:21.875: E/AndroidRuntime(28537):    ... 11 more
Shobhit Puri
  • 25,769
  • 11
  • 95
  • 124
whiteLT
  • 338
  • 7
  • 21

1 Answers1

2

How exactly does the android:onClick XML attribute differ from setOnClickListener? question might help you. See the most upvoted answer. It mentiones:

Note that Android will look for the onClick method only in the current Activity. This is important to remember if you are using Fragments. Since even if you add the XML above using a fragment, Android will not look for the onClick method in the .java file of the fragment used to add the XML.

Hope this answers you why it is not working the first way.

Community
  • 1
  • 1
Shobhit Puri
  • 25,769
  • 11
  • 95
  • 124
  • yes, because they all give the same error, I copy paste only one of them. – whiteLT Dec 09 '13 at 22:03
  • It might help if you could please post the rest. – Shobhit Puri Dec 09 '13 at 22:05
  • 1
    @whiteLT See the updated answer. It might hint you why the first method does not work with fragments. – Shobhit Puri Dec 09 '13 at 22:35
  • 2
    The accepted answer does not explain why the code from the question doesn't work on API<=10. The code from the question seems alright. If I got it, all you have to do is to implement a public method with a View paramter. I have the exact same issue and none of the answers is helpful. It works on 4.x but not on 2.x. For now I will implement a listener in code, but I'm curious what's the issue here. – cybergen Jun 24 '14 at 11:17
  • 1
    @cybergen I have the same problem: java.lang.IllegalStateException occurs for an ImageButton onClick method which is clearly defined, it occurs ONLY for API <= 10. I have found the cause is that the app used a class available in higher API. Instead of giving NoClassDefFoundError error, it throws this. It works fine now after removing the code using those classes. It is very weird. This may be true only for my case. – Hong Jan 23 '16 at 23:21