I'm trying to figure out how to get the value from a method in the Activity class into the Fragment of that Activity. I have set up three files: AsyncTaskActivity.java, EventsList.java, and ListFragment.java. AsyncTaskActivity.java has the method getOtakuEvents() that returns a string value.
package com.leobee;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.http.HttpResponse;
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 com.google.android.maps.MapActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class AsyncTasksActivity extends MapActivity implements EventsList{
LocationManager locationManager;
String stxtLat ;
String stxtLong;
double pLong;
double pLat;
String x;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Acquire a reference to the system Location Manager
locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
// Define a listener that responds to location updates
LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
pLong=location.getLongitude();
pLat=location.getLatitude();
stxtLat=Double.toString(pLat);
stxtLong=Double.toString(pLong);
Toast.makeText(AsyncTasksActivity.this, stxtLong, Toast.LENGTH_SHORT).show();
Toast.makeText(AsyncTasksActivity.this, stxtLat, Toast.LENGTH_SHORT).show();
}
public void onStatusChanged(String provider, int status, Bundle extras) {}
public void onProviderEnabled(String provider) {}
public void onProviderDisabled(String provider) {}
};
// Register the listener with the Location Manager to receive location updates
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
DownloadWebPageTask task = new DownloadWebPageTask();
double numRand = Math.floor(Math.random()*1000);
String userLat= stxtLat;
String userLong= stxtLong;
task.execute(new String[] { "http://www.leobee.com/otakufinder/scripts/geoloco.php?userLat="+userLat+"&userLong="+userLong+"&randNum="+numRand });
}
private class DownloadWebPageTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
String response = "";
for (String url : urls) {
DefaultHttpClient client = new DefaultHttpClient();
//HttpGet myGet = new HttpGet("http://foo.com/someservlet?param1=foo¶m2=bar");
HttpGet httpGet = new HttpGet(url);
try {
HttpResponse execute = client.execute(httpGet);
InputStream content = execute.getEntity().getContent();
BufferedReader buffer = new BufferedReader(
new InputStreamReader(content));
String s = "";
while ((s = buffer.readLine()) != null) {
response += s;
}
} catch (Exception e) {
e.printStackTrace();
}
}
return response;
}
@Override
protected void onPostExecute(String result) {
x =result;
Log.v("values",x);
}
}
@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
@Override
public String getOtakuEvents() {
// TODO Auto-generated method stub
return x;
}
}
EventsList.java is an interface that helps the classes to know getOtakuEvents() value is available to them.
package com.leobee;
public interface EventsList {
String getOtakuEvents();
}
Lastly, the fragment has a method that gets the value from the getOtakuEvents() called getStringfromActivity().
package com.leobee;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
// shows list view of items if fragment is not null this class will also show the item selected form Detailfragment class
public class ListFragment extends android.app.ListFragment{
String events;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String events =getStringfromActivity();
}
public String getStringfromActivity() {
String i;
i=EventsList.getOtakuEvents();
return i;
}
/* public String getStringfromActivity() {
return getActivity().getOtakuEvents();
}*/
@Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
String[] values = new String[] { "Android", "iPhone", "WindowsMobile",
"Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X",
"Linux", "OS/2" };
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1,values);
setListAdapter(adapter);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id){
String item =(String)getListAdapter().getItem(position);
DetailFragment fragment = (DetailFragment) getFragmentManager().findFragmentById(R.id.detailFragment);
if (fragment != null && fragment.isInLayout()){
fragment.setText(item);
}else{Intent intent = new Intent(getActivity().getApplicationContext(),
DetailActivity.class);
intent.putExtra("value", item);
startActivity(intent);
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.e("text","config change detail fragment");
// Checks the orientation of the screen
}
}
I get error: Cannot make a static reference to the non-static method getOtakuEvents() from the type EventsList. This is confusing because I did not declare static type in getOtakuEvents() or in the fragment.
Alternatively, I also tried this version of the method in the fragment :
public String getStringfromActivity() {
return getActivity().getOtakuEvents();
}
I am getting an error :The method getOtakuEvents() is undefined for the type Activity. This is baffling to me because the method is defined in the parent activity.
Specifically, I need to be able to send the string value from the activity to the fragment. I am trying to do it using an interface or the getActivity method. Can you look over my code and let me know where I'm going wrong and how to fix it? I've been at this for the majority of 2 days and can't seem to figure it out. Any help is appreciated.
You could probably store and retrieve it from SharedPreferences