2016-08-05 8 views
0

Ich arbeite an einer Android App mit einer Aktivität, die stepper mit 3 Schritten enthält. Ich habe für jeden Schritt ein Layout erstellt und programmatisch in die Scrollview meiner Aktivität eingefügt. Ein Schritt Layout sieht wie folgt aus:Karte innerhalb Fragment in programmatisch erstellte Ansicht

Step layout

Das blaue Rechteck hier begnügt, die in jedem Schritt anders sein wird. Der erste Schritt sollte eine Karte mit den Schaltflächen enthalten. Ich dachte, dass es einfacher ist, ein Fragment zu erstellen, um mit der Karte außerhalb der Aktivität zu arbeiten, und einfach Daten an Aktivitäten zu senden, wenn der Benutzer mit der Map fertig ist.

I einzufügen, jeden Schritt zu der Aktivität mit diesem Code:

View step1, step2, step3; // they are global 

//Inside onCreate: 
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
FrameLayout mainView = (FrameLayout) inflater.inflate(R.layout.activity_main, null); 
LinearLayout parent = (LinearLayout) mainView.findViewById(R.id.stepper_container); 

step1 = inflater.inflate(R.layout.layout_step, null); 
parent.addView(step1); 
step2 = inflater.inflate(R.layout.layout_step, null); 
parent.addView(step2); 
step3 = inflater.inflate(R.layout.layout_step, null); 
parent.addView(step3); 
setContentView(mainView); 

I gelungen Fragment einzufügen mit einer Karte auf die Aktivität von einem <FragmentLayout android:id="@+id/fragment_container" ... />" darin zu schaffen und den folgenden Code:

FragmentManager fragmentManager = getSupportFragmentManager(); 
FragmentTransaction transaction = fragmentManager.beginTransaction(); 
OfficeMapFragment map = OfficeMapFragment.newInstance(); 
transaction.add(R.id.fragment_container, map); 
transaction.commit(); 

Aber ich kann es nicht mit neuen programmgesteuert hinzugefügt Ansichten als ihre Elemente id sind die gleichen und wenn ich id Parameter in Transaktion auf die id des "blauen" Container i n Schritt stürzt die App mit NullPointerException ab.

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.maps.SupportMapFragment.getMapAsync(com.google.android.gms.maps.OnMapReadyCallback)' on a null object reference 

OfficeMapFragment onCreateView Methode:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View v = inflater.inflate(R.layout.fragment_map, container, false); 
    SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager() 
      .findFragmentById(R.id.map); 
    mapFragment.getMapAsync(this); // It crashes here 
    return v; 
} 

Q:

Wie das Fragment in einem der programmatisch erstellt Ansichten hinzufügen?

Antwort

1

gelöst gerade das Problem:

LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    FrameLayout mainView = (FrameLayout) inflater.inflate(R.layout.activity_main, null); 
    LinearLayout parent = (LinearLayout) mainView.findViewById(R.id.stepper_container); 
    step1 = inflater.inflate(R.layout.layout_step, null); 
    parent.addView(step1); 
    // Other steps 
    setContentView(mainView); 
    FrameLayout container = (FrameLayout) step1.findViewById(R.id.step_content_container); 

    fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction transaction = fragmentManager.beginTransaction(); 
    OfficeMapFragment map = OfficeMapFragment.newInstance(); 
    transaction.add(container.getId(), map); 
    transaction.commit(); 

Und es funktioniert gut (mit geringfügigem Layout Bugs).

Working map in the step

Verwandte Themen