Android - Could not find a method playaudio(View)

2019-08-31 03:03发布

I am blocked for hours now, I am trying to handle a button click inside a listview using the xml onClick attribute.

Here is my result.xml:

<?xml version="1.0" encoding="utf-8"?>

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="5dp">

 <TextView
    android:id="@+id/url"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:visibility="gone"/>

<TextView
    android:id="@+id/title"
    style="@android:style/TextAppearance.Large"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_toLeftOf="@+id/play"
    android:singleLine="true"
    android:text="title"
    android:textColor="#000000" />

<TextView
    android:id="@+id/artist"
    style="@android:style/TextAppearance.Small"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@id/title"
    android:layout_toLeftOf="@+id/play"
    android:singleLine="true"
    android:text="artist"
    android:textColor="#7D7D7D" />

<TextView
    android:id="@+id/duration"
    style="@android:style/TextAppearance.Small"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/artist"
    android:layout_alignParentBottom="true"
    android:layout_below="@id/artist"
    android:layout_toLeftOf="@+id/play"
    android:singleLine="true"
    android:text="03:24"
    android:textColor="#7D7D7D" />

<ImageButton
    android:id="@+id/play"
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:layout_toLeftOf="@+id/download"
    android:src="@drawable/play"
    android:onClick="playAudio" />

<ImageButton
    android:id="@+id/download"
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:layout_alignParentRight="true"
    android:src="@drawable/download" />

 </RelativeLayout>

here is my search.java file

 package com.example.testxxx;

 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;

 import org.apache.http.HttpResponse;
 import org.apache.http.client.HttpClient;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.impl.client.DefaultHttpClient;
 import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;

 import android.app.ListActivity;
 import android.app.SearchManager;
 import android.content.Context;
 import android.content.Intent;
 import android.graphics.Color;
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.util.Log;
 import android.view.View;
 import android.widget.Button;
 import android.widget.LinearLayout;
 import android.widget.ListView;
 import android.widget.SimpleAdapter;
 import android.widget.TextView;
 import android.widget.Toast;



 public class Search extends ListActivity {

    private TextView mTextView;
     private ListView mListView;
     private String query;
     private String queryencoded;
     private static Context mContext;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.search);

        mTextView = (TextView) findViewById(R.id.text);
        mListView = (ListView) findViewById(android.R.id.list);

        mContext = getApplicationContext();

        // Get the intent, verify the action and get the query
        Intent intent = getIntent();
        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
          query = intent.getStringExtra(SearchManager.QUERY);
        try {
            queryencoded = URLEncoder.encode(query, "utf-8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
          Log.w("myApp", "aaaaa");
          Toast.makeText(Search.this, (query), Toast.LENGTH_LONG).show();


          mTextView.setText("testing connexion");

          if(isConnected()){
              mTextView.setText("Loading...");
              new HttpAsyncTask().execute("url to json");
          }
          else{
              mTextView.setBackgroundColor(0xffcc0000);
              mTextView.setText("You are NOT connected");
          } 
        }
    }

    public boolean isConnected(){
         ConnectivityManager connMgr = (ConnectivityManager) getSystemService(this.CONNECTIVITY_SERVICE);
             NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
             if (networkInfo != null && networkInfo.isConnected()) 
                 return true;
             else
                 return false;   
     }

    public static String GET(String url){
         InputStream inputStream = null;
         String result = "";
         try {

             // create HttpClient
             HttpClient httpclient = new DefaultHttpClient();

             // make GET request to the given URL
             HttpResponse httpResponse = httpclient.execute(new HttpGet(url));

             // receive response as inputStream
             inputStream = httpResponse.getEntity().getContent();

             // convert inputstream to string
             if(inputStream != null)
                 result = convertInputStreamToString(inputStream);
             else
                 result = "Did not work!";

         } catch (Exception e) {
             Log.d("InputStream", e.getLocalizedMessage());
         }

         return result;
     }

    private static String convertInputStreamToString(InputStream inputStream) throws IOException{
         BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream));
         String line = "";
         String result = "";
         while((line = bufferedReader.readLine()) != null)
             result += line;

         inputStream.close();
         return result;

     }

     private class HttpAsyncTask extends AsyncTask<String, Void, String> {
            @Override
            protected String doInBackground(String... urls) {

                return GET(urls[0]);
            }
            // onPostExecute displays the results of the AsyncTask.
            @Override
            protected void onPostExecute(String result) {
                Toast.makeText(getBaseContext(), "Received!", Toast.LENGTH_LONG).show();

                try {
                    JSONObject jsonobject = new JSONObject(result);
                    mTextView.setText((String) jsonobject.get("count"));

                    Integer count = Integer.parseInt((String) jsonobject.get("count"));

                    if (count == 0) {
                        // There are no results
                        mTextView.setText(getString(R.string.no_results, query));
                    } else {
                        // Display the number of results
                        String countString = getResources().getQuantityString(R.plurals.search_results,
                                count, new Object[] {count, query});
                        mTextView.setText(countString);



                        // Specify the columns we want to display in the result
                        String[] from = new String[] { "title",
                                                       "artist",
                                                       "duration",
                                                       "url"};

                        // Specify the corresponding layout elements where we want the columns to go
                        int[] to = new int[] { R.id.title,
                                               R.id.artist,
                                               R.id.duration,
                                               R.id.url};

                        // -- container for all of our list items
                        List<Map<String, String>> groupData = new ArrayList<Map<String, String>>();

                        // -- list item hash re-used
                        Map<String, String> group;

                        //create audio json array
                        JSONArray audios = jsonobject.getJSONArray("audio");

                        for (int i = 0; i < audios.length(); i++) {
                            JSONObject audio = audios.getJSONObject(i);

                            //get info
                            String title = audio.getString("title");
                            String artist = audio.getString("artist");
                            String duration = audio.getString("duration");
                            String durationformated = getDurationString(Integer.parseInt(duration));
                            String url = audio.getString("url");

                            // -- create record
                            group = new HashMap<String, String>();

                            group.put( "title", title );
                            group.put( "artist",  artist );
                            group.put( "duration",  durationformated );
                            group.put( "url",  url );

                            groupData.add(group);
                        }

                        SimpleAdapter adapter = new SimpleAdapter(mContext , groupData, R.layout.result, 
                                from,
                                 to );

                        setListAdapter( adapter );

                    }
                } 

                catch (JSONException e)           
                 {                
                    // TODO Auto-generated catch block   
                    Log.w("myApp", e);    
                 }
           }

            public void playAudio(View v) {

                //get the row the clicked button is in
                LinearLayout vwParentRow = (LinearLayout)v.getParent();

                TextView urlview = (TextView)vwParentRow.findViewById(R.id.url);
                String url = (String) urlview.getText();

                Toast.makeText(mContext, (url), Toast.LENGTH_LONG).show();

            }

        }

        private String getDurationString(int seconds) {

            int hours = seconds / 3600;
            int minutes = (seconds % 3600) / 60;
            seconds = seconds % 60;

            return twoDigitString(minutes) + ":" + twoDigitString(seconds);
        }

        private String twoDigitString(int number) {

            if (number == 0) {
                return "00";
            }

            if (number / 10 == 0) {
                return "0" + number;
            }

            return String.valueOf(number);
        }


 }

this is the error I get

 02-10 20:00:31.995: E/AndroidRuntime(19483): java.lang.IllegalStateException: Could          not find a method playAudio(View) in the activity class android.app.Application for onClick handler on view class android.widget.ImageButton with id 'play'

I have tried to place the playAudio method inside the Search class, inside the HttpAsyncTask and inside the MainActivity class, nothing is working I still have the same error.

I'm also wondering why is the error referencing to the android.app.application class as the layout is from Search > HttpAsyncTask

Maybe this is the cause of the error, but then what could I do to fix it?

Thank you much :)

2条回答
放荡不羁爱自由
2楼-- · 2019-08-31 03:12

See java.lang.illegalstateexception could not find a method (view) in the activity class android fragment

It seems that you can only set onClick listeners via XML for layouts inflated with setContentView().

Consider dynamically adding the onClick listener.

查看更多
淡お忘
3楼-- · 2019-08-31 03:32

here

mContext = getApplicationContext();

Means you are using the Application as a Context (usually not a very good idea.)

Here

SimpleAdapter adapter = new SimpleAdapter(mContext , groupData, R.layout.result

You are using that Application context in this adapter, meaning this context is used to inflate the result.xml layout.

The consequence is that the onClick parameter searches for a playAudio in the Application class.

Finally, public void playAudio(View v) { is not in your activity, it is in your AsyncTask

To solve this,

  • mContext = this; Also, don't make it static
  • move playAudio in the Activity
  • Voilà!
查看更多
登录 后发表回答