1

Ich habe echte Probleme mit Fragmenten! Ich habe eine Ergebnisse Aktivität Klasse, die zwei Fragmente, untere Hälfte Karte mit Ort und in der Nähe von Google Place Marker, obere Hälfte wird (oder ich will es auch, aber es wird nicht rötlich arbeiten) halten Sie die Adresse und Details zu einem Benutzer ausgewählten Marker. Ich habe alles, ich kann die Marker auswählen! Ich kann meinen Standort laden, ich kann die nächsten Orte finden und ich kann sogar die Ortsdetails auf ein anderes Fragment übertragen (aber es wird außerhalb des Bildschirms geladen). Aber denkst du, ich kann die Details in die obere Bildschirmhälfte laden !! (NEIN!) Ich brauche Hilfe, ich kratze mich ziemlich lange über diesen Kopf. Es ist 20 bis 2 und ich kann keinen anderen Tag davon sehen ... und ich weiß, es ist etwas wirklich kleines (es ist immer wenn ich frage auf Stack), aber ich kann es einfach nicht erkennen. Kannst du mir bitte helfen?
XML-Code, Fragment, map_fragment, links search_frag für dynamischeDual Android Karte/Google Places Details Bildschirm

<RelativeLayout 
    android:id="@+id/search_frag" 
    android:layout_width="match_parent" 
    android:layout_height="@dimen/results" 
    android:background="@color/cream" 
    android:layout_below="@+id/top_banner" 
    android:orientation="horizontal" 
    tools:layout="@layout/result_hint"> 
    </RelativeLayout> 
<fragment 
    android:layout_below="@id/search_frag" 
    android:id="@+id/map_fragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/cream" 
    android:orientation="horizontal" 
    android:name="boo.thefoodhunt.fragment.MapFragment" 
    tools:layout="@layout/template_map_view"/> 

ResultsActivitiy.java hält: habe ich ein Dummy-Fragment in dort zu sehen, ob es geladen wird, und es ist, dachte, es könnte leichter sein, sie zu ersetzen mit einem neuen Fragmente (es ist nicht)

public class ResultsActivity extends FragmentActivity 
     implements MapFragment.MarkerClickCB { 
    //Log 
    private final String TAG = this.getClass().getName(); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_results); 
    //Master data list Fragment 

     FragmentManager fm = getSupportFragmentManager(); 

     SelectFrag firstFragment = new SelectFrag(); 

     FragmentTransaction ft = fm.beginTransaction(); 

     ft.add(R.id.search_frag, firstFragment); 
     ft.commit(); 
} 

MapFragment.java ein Teil der else if-Anweisung auf public boolean onMarkerClick (Marker Marker). Der unkommentierte Code funktioniert und kommuniziert die Google-Platzdetails, die ein Benutzer auswählt, adressiert und die Details an ein Vollbildfragment sendet.

if (marker.equals(this.myLocMarker) && nearby != null) { 
      for (Marker placeMarker : nearby.keySet()) { 
       placeMarker.setVisible(!placeMarker.isVisible()); 
      } 
     } else if (nearby != null && nearby.containsKey(googLocation)) { 
      Intent intent = new Intent(getActivity(), TempPlaceActivity.class); 
      intent.putExtra("PLACE", nearby.get(googLocation)); 
      startActivity(intent); 
      // mCallbacks.onMarkerSelected("PLACE", nearby); 
      return true; 

Der Code ist ein bisschen vaugue Es tut mir leid ich nicht alles bis stellen aufgrund dort etwa 5 verschiedene java.classes zu sein ... nur einen Punkt in die richtige Richtung wird fantastisch sein. Die ResultsActivity.java enthält die 2 Fragmente und hat eine results.xml. Die MapFragment.java enthält die Map und Google Places Details befinden sich in einer frame.xml. Die PlacesDetailsFragments enthält die Details und wird in einer places.xml-Datei gespeichert. Jedes Fragment hat Aktivitäten, sie sind überall da, wo sie als Paar zu erscheinen scheinen.

+0

Korrekturdetails laden nicht aus dem Bildschirm, wollte ich auf einem anderen sagen Bildschirm – Boo

Antwort

0

Ich arbeitete es aus und dachte ID teilen. Ok werden die Fragmente wie so ...

in der XML-Layout geschrieben
<RelativeLayout 
    android:id="@+id/search_frag" 
    android:layout_width="match_parent" 
    android:layout_height="@dimen/results" 
    android:layout_below="@+id/top_banner" 
    android:background="@color/cream" 
    android:orientation="horizontal" 
    tools:layout="@layout/result_hint"></RelativeLayout> 

<RelativeLayout 
    android:id="@+id/map_fragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_below="@id/search_frag" 
    android:background="@color/cream" 
    android:orientation="horizontal" 
    tools:layout="@layout/template_map_view" /> 

search_frag und map_fragment werden muss RelativeLayout wie gehen in der Aktivität programmiert werden Sie sie

Aktivitätsklasse erscheinen zu wollen, search_frag

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_results); 
     setUpMapIfNeeded(); 

     .... 
     //sets up default fragment, will later be replaced with fragment when marker is selected 
     if (findViewById(R.id.fragment_container) == null) { 

      if (savedInstanceState != null) { 
       return; 
      } 

      FragmentManager fm = getSupportFragmentManager(); 
      SelectFrag firstFragment = new SelectFrag(); 
      FragmentTransaction ft = fm.beginTransaction(); 
       ft.add(R.id.search_frag, firstFragment); 
       ft.commit(); 
      } 
... 

map_frag

private void setUpMapIfNeeded() { 
     if (mMap != null) { 
      return; 
     } 
     mMap = new MapFragment(); 
     mMap.setArguments(getIntent().getExtras()); 
     getSupportFragmentManager().beginTransaction() 
       .add(R.id.map_fragment, mMap).commit(); 
    } 

MAP FRAGMENT

MarkerClickCB mCallbacks; //communicates with the activity 
    //interface set up 
    public interface MarkerClickCB { 
      void onMarkerSelected(String place, GoogePlaces place1); 
     } 

    .... 

mMap.setOnMarkerClickListener(new OnMarkerClickListener() { 

     @Override 
     public boolean onMarkerClick(Marker marker) { 

      if (!mClusterManager.onMarkerClick(marker)) { 
       googLocation = marker; 
       cluster.getPosition(); 
       if (googLocation.equals(userLocMarker) && clusts2 == null) { 
        searchFilter(); 
       } 
       if (marker.equals(userLocMarker) && nearby != null) { 
        for (Marker placeMarker : nearby.keySet()) { 
         placeMarker.setVisible(!placeMarker.isVisible()); 
        } 
       } else if (cluster != null) { 

        mCallbacks.onMarkerSelected("PLACE", clickedClusterItem.getPlace()); 
        getDistance(clickedClusterItem.getPosition().latitude, clickedClusterItem.getPosition().longitude); 

        return true; 
       } 
      } 
      return false; 
     } 
    }); 

..Now auf die Aktivitätsklasse zurück, die die zuvor programmierten Fragmente enthält. Wir müssen den search_frag durch das neue Fragment ersetzen, das die Google Places-Informationen für den ausgewählten Marker enthält.

Die Aktivitätsklasse muss die Rückrufdaten für die Übertragung von Daten von der Karte Fragment

ZURÜCK ZUR Aktivitätsklasse

public class ResultsActivity extends AppCompatActivity 
     implements MapFragment.MarkerClickCB 
.... 
    //previous fragment info// 
... 
    public void onMarkerSelected(String near, GoogePlaces googPlace) { 

      FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
      PlaceFragment fragment = PlaceFragment.newInstance(googPlace); 
      ft.replace(R.id.search_frag, fragment); 
      ft.commit(); 
     } 

..Replacement Fragment implementieren, die die Daten hält PLACE FRAGMENT

final static String PLACES_ID = "GoogePlaces"; 

    //Creates fragment object with details 

    public static PlaceFragment newInstance(GoogePlaces place) { 
      PlaceFragment fragment = new PlaceFragment(); 
      Bundle bundle = new Bundle(); 
      bundle.putSerializable(PLACES_ID, place); 
      fragment.setArguments(bundle); 

      return fragment; 
     } 

//this bit got a bit messy for me - welcome to comment with improvements 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     place = (GoogePlaces) getArguments().getSerializable(PLACES_ID); 



View view = inflater.inflate(R.layout.activity_place_detail, container, false); 

    this.context = getActivity().getApplicationContext(); 

    Log.i("PLACE EXAMPLE", "Place Detail Activity"); 


     place = (GoogePlaces) getArguments().getSerializable(PLACES_ID); 
... 

     getActivity().setTitle(place.getName()); 
     String placesKey = getResources().getString(R.string.places_key); 

//connect to google places - to gather eatery details 
     String placesRequest = "https://maps.googleapis.com/maps/api/place/details/json?" + 
       "key=" + placesKey + "&reference=" + place.getReference(); 
     PlacesDetailReadFeed detailTask = new PlacesDetailReadFeed(); 
     detailTask.execute(new String[]{placesRequest}); 

     ...... 

    return view; 
    } 

OK, als Anfänger (ish) Programmierer das war ziemlich schwer für mich gehen muss ich zugeben, alle Hinweise, Kritik für Code aufräumen wird geschätzt