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 :)
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.
here
Means you are using the
Application
as aContext
(usually not a very good idea.)Here
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 aplayAudio
in theApplication
class.Finally,
public void playAudio(View v) {
is not in your activity, it is in yourAsyncTask
To solve this,
mContext = this;
Also, don't make it staticplayAudio
in theActivity