我试图弄清楚如何从 Activity 类中的方法获取值到该 Activity 的片段中。我设置了三个文件:AsyncTaskActivity.java、EventsList.java 和 ListFragment.java。AsyncTaskActivity.java 具有返回字符串值的 getOtakuEvents() 方法。
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 是一个接口,可以帮助类知道 getOtakuEvents() 值可供它们使用。
package com.leobee;
public interface EventsList {
String getOtakuEvents();
}
最后,片段有一个从 getOtakuEvents() 获取值的方法,称为 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
}
}
我收到错误:无法从类型 EventsList 中对非静态方法 getOtakuEvents() 进行静态引用。这很令人困惑,因为我没有在 getOtakuEvents() 或片段中声明静态类型。
或者,我也在片段中尝试了这个版本的方法:
public String getStringfromActivity() {
return getActivity().getOtakuEvents();
}
我收到一个错误:方法 getOtakuEvents() 未定义 Activity 类型。这让我感到困惑,因为该方法是在父活动中定义的。
具体来说,我需要能够将字符串值从活动发送到片段。我正在尝试使用接口或 getActivity 方法来做到这一点。您能否查看我的代码并让我知道哪里出错以及如何解决?我已经在这两天的大部分时间里,似乎无法弄清楚。任何帮助表示赞赏。