0

我试图弄清楚如何从 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&param2=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 方法来做到这一点。您能否查看我的代码并让我知道哪里出错以及如何解决?我已经在这两天的大部分时间里,似乎无法弄清楚。任何帮助表示赞赏。

4

1 回答 1

0

您可能可以从 SharedPreferences 存储和检索它

于 2012-04-05T22:44:23.137 回答