Jestem trochę nowy w Androidzie i bardzo nowy w Fragments. Próbuję przenieść aplikację z działań do fragmentów (dobrze, działania + fragmenty) dla Honeycomb. Zanim przejdziemy do ekranów tabletów, chcemy, aby nasza aplikacja działała z Biblioteką zgodności fragmentów dla urządzeń 1.6+. Przeczytałem dokumentację i przykłady od Google i nic wyraźnie nie mówi, że mogę lub nie mogę wykonać następujących czynności, ale to nie działa dla mnie.

Pierwszym przeniesionym ekranem jest ekran uruchamiania, który zawiera plik układu o nazwie fragment_splash.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/splash_background">
    <fragment class="...StartupFragmentLayout$StartupFragment"
        android:id="@+id/fragStartup" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" >

        <TextView
            android:id="@+id/debugText"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:visibility="gone"
            android:text="DEBUG ON"
            android:gravity="center"
            android:textSize="35sp"
            android:textColor="@color/blue_text"
            android:textStyle="bold"
            android:shadowColor="#FFFFFF"
            android:shadowRadius="2"/>
        <LinearLayout
            android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0.4"
            android:gravity="bottom">
           ...
    </fragment>
</LinearLayout>

To jednak nie działa. Otrzymuję błąd informujący, że StartupFragmentLayout$StartupFragment nie utworzył widoku. Zaczynam podejrzewać, że nie mogę zagnieździć niczego wewnątrz <fragment>, ponieważ nie widziałem tego w żadnej dokumentacji ani przykładach. Czy to prawda, czy mój problem jest czymś innym?

0
CACuzcatlan 21 czerwiec 2011, 05:20
Ponieważ wspominasz, że korzystasz z biblioteki zgodności fragmentów, pierwszą rzeczą do sprawdzenia jest to, że aktywność, której próbujesz użyć na ekranie powitalnym, jest rozszerzona z FragmentActivity. Jeśli tak jest, a nadal pojawia się błąd, czy możesz opublikować dokładny komunikat o błędzie i/lub ślad stosu?
 – 
Mark
21 czerwiec 2011, 08:37
Tak, używam Biblioteki zgodności fragmentów. Błąd mówi „StartupFragmentLayout$StartupFragment nie utworzył widoku” i występuje w setContentView(R.layout.fragment_splash); w OnCreate
 – 
CACuzcatlan
21 czerwiec 2011, 21:20
W takim przypadku zapoznałbym się z odpowiedzią PJL poniżej – wydaje się bardziej zgodna ze sposobem, w jaki mają działać fragmenty.
 – 
Mark
21 czerwiec 2011, 21:28

2 odpowiedzi

Najlepsza odpowiedź

Z dokumentacji nie wynika jasno, czy możesz mieć widoki podrzędne w <fragment>. Biorąc pod uwagę, że żadna z próbek fragmentów tego nie robi, podejrzewam, że nie jest to sposób, w jaki mają być używane. Możesz spróbować zmienić <fragment> na <FrameLayout> i dodać do niego fragment w czasie wykonywania, jeśli naprawdę chcesz, aby sprawdzić, czy to działa.

Myślę jednak, że najlepszym rozwiązaniem jest umieszczenie widoków podrzędnych w osobnym pliku układu, a następnie w onCreateView nadmuchanie do kontenera fragmentu poprzez powiedzenie:

final View iv = inflater.inflate(R.layout.favourites, container, false);

Nie sądzę, że w ten sposób cokolwiek stracisz.

2
PJL 22 czerwiec 2011, 11:21
Myślę, że przypadkowo słowo. Co miałeś na myśli w zdaniu „Możesz spróbować zmienić na a i dodać do niego fragment w czasie wykonywania, jeśli naprawdę chcesz, aby sprawdzić, czy to działa”.
 – 
CACuzcatlan
22 czerwiec 2011, 01:37
Powinien powiedzieć ...zmieniając w ”, który widzę na moim ekranie.
 – 
PJL
22 czerwiec 2011, 11:23
Widzę to teraz, nie jestem pewien, czy to edytowałeś, czy moja przeglądarka działała wczoraj
 – 
CACuzcatlan
23 czerwiec 2011, 01:53

Żeby to związać, fragmenty nie mogą mieć dzieci w układach. PJL sugeruje właściwe podejście. Układ wewnątrz fragmentu należy określić w osobnym pliku XML. Możesz następnie wstrzyknąć ten układ do drzewa widoku, zwracając go z metody fragments onCreateView.

1
cyngus 22 czerwiec 2011, 04:33