2012-04-05 3 views
0

Ich versuche herauszufinden, wie man den Wert von einer Methode in der Aktivitätsklasse in das Fragment dieser Aktivität bekommt. Ich habe drei Dateien eingerichtet: AsyncTaskActivity.java, EventsList.java und ListFragment.java. AsyncTaskActivity.java verfügt über die Methode getOtakuEvents(), die einen Zeichenfolgenwert zurückgibt.Return String Wert von Activity zu einem Fragment

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 ist eine Schnittstelle, die Klassen hilft getOtakuEvents zu wissen() Wert für sie verfügbar ist.

package com.leobee; 

public interface EventsList { 

    String getOtakuEvents(); 

} 

Schließlich ist das Fragment, das ein Verfahren aufweist, das den Wert von den getOtakuEvents gets() genannt 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 

     } 




    } 

ich Fehler: Kann nicht einen statischen Verweis auf die nicht-statische Methode getOtakuEvents() vom Typ EventsList machen. Das ist verwirrend, weil ich in getOtakuEvents() oder im Fragment keinen statischen Typ deklariert habe.

Alternativ habe ich versucht, auch diese Version des Verfahrens in dem Fragment:

public String getStringfromActivity() { 

     return getActivity().getOtakuEvents(); 

     } 

ich eine Störung erhalte: Die Methode getOtakuEvents() ist für die Art Aktivität nicht definiert. Das ist verwirrend für mich, weil die Methode in der übergeordneten Aktivität definiert ist.

Insbesondere muss ich in der Lage sein, den Zeichenfolgenwert aus der Aktivität an das Fragment zu senden. Ich versuche es mit einer Schnittstelle oder der getActivity-Methode. Kannst du über meinen Code schauen und mich wissen lassen, wo ich falsch liege und wie ich es beheben kann? Ich war die ganze Zeit über 2 Tage dabei und kann es anscheinend nicht herausfinden. Jede Hilfe wird geschätzt.

Antwort

0

Sie könnten es wahrscheinlich von SharedPreferences speichern und abrufen

+0

Vielen Dank! Ich habe nicht in diese Richtung gedacht, aber es hat funktioniert. – Leoa

Verwandte Themen