2012-04-12 4 views
10

Das folgende läuft auf einem Android 1.6, also verwende ich das Kompatibilitätspaket für Fragmente. Im folgenden TestFragment ist eine statische verschachtelte Klasse:Fragment.onCreateView hat null container

public class FragmentTestActivity extends FragmentActivity { 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
} 

public static class TestFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     TextView result = new TextView(getActivity()); 
     result.setText("Hello TestFragment"); 
     return result; 
    } 
} 

}

Die main.xml Datei:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" android:layout_height="fill_parent"> 
<fragment class="com.test.FragmentTestActivity$TestFragment" 
     android:id="@+id/test" 
     android:layout_width="fill_parent" android:layout_height="fill_parent" /> 
</FrameLayout> 

Das Merkwürdige ist, dass der Behälter Parameter in onCreateViewnull ist.

Nun, wenn ich das Fragment programmatisch wie folgt hinzufügen (ändern Sie einfach die onCreate Methode der Aktivität) der Container ist nicht mehr null. Warum?

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Fragment frag = new TestFragment(); 
    getSupportFragmentManager().beginTransaction().add(android.R.id.content, frag).commit(); 
} 
+1

Ich habe ein ähnliches Problem. Ich dachte, dass der Container Teil des Aktivitätslayouts ist, in dem das Fragment eingebettet ist. Wie kann das null sein? –

Antwort

0

Die Dokumentation erwähnt, dass es kann null sein:

Öffentlichkeit onCreateView (LayoutInflater inflater, Viewgroup Behälter, Gebündelt savedInstanceState)

[...]

Behälter: Wenn nicht Null, dies ist die übergeordnete Ansicht, der die UI des Fragments beigefügt werden sollte. Das Fragment sollte nicht die Ansicht selbst hinzufügen, aber das kann verwendet werden, um die LayoutParams der Ansicht zu generieren.

Um es klar zu sagen: Sie sollten nichts tun wie container.addView(...).

+4

Das tut er aber nicht. Er sagt, wenn der Container aus einem Layout-XML aufbläht, ist er leer, obwohl es eine Elternansicht gibt, in der das Fragment enthalten ist. Ich glaube nicht, dass das passieren soll. – DeeV

+0

Sorry, ich war nicht klar. Ich weiß, dass er momentan 'container.addView (...) nicht macht, aber ich vermutete, dass er es wollte, und deshalb hat er bemerkt, dass' container' manchmal 'null' ist. Die Dokumentation sagt "If non-null", was bedeutet, dass es vollkommen in Ordnung ist, dass es "null" ist, und es spielt keine Rolle, ob es "null" ist, weil Sie nie Ansichten hinzufügen müssen. – Timmmm

+0

Ich möchte zum Beispiel einen BroadcastReceiver haben, der das Fragment in bestimmten Fällen aktualisiert. Das Speichern des Containers für zukünftige Updates wäre eine großartige Lösung gewesen, aber wenn ich einen Null-Container habe, muss ich einen anderen Weg finden, es zu tun – Shushu