2011-10-22 13 views
16

pierwsze, używam android Zgodność Biblioteka V4 rev.3 dla mojego 1.6 (Donut)tym list_content w układzie listy, aby zachować funkcjonalność ListFragment

Kiedy najpierw utworzyć ListFragment to wyświetla indeterminant wskaźnik postępu bez tytułu używasz setListAdabpter(). Według dokumentacji ListFragment.onCreateView, jeśli chcę użyć niestandardowego rozłożyć:

Jeśli nadrzędnymi tej metody z własnej zawartości niestandardowej pod tym standardowym układzie {@link android.R .layout # list_content} w twoim pliku układu, dzięki czemu możesz zachować wszystkie standardowe zachowanie ListFragment. W szczególności w jest to obecnie jedyny sposób na pokazanie stanu nieokreślonego postępu w postaci .

Problemem jest to, że kiedy idę do mojego pliku layoutu i spróbuj: <include layout="@android:layout/list_content" ...> to (eclipse) mówi mi, że

zasób nie jest publiczna. (w "układzie" z wartością "@android: layout/list_content").

Przyjmuję, że oznacza to list_content.xml nie istnieje w moim kodzie źródłowym V4. co jest poprawne, ponieważ zgodnie z dokumentami pojawił się w API v11.

prostu założyć, że to istnieją w źródle biblioteki kompatybilność, nie wiem czy to robi ...

Jedynym rozwiązaniem widzę byłoby wykopać API kodu źródłowego V11 Android oraz kopiowanie i wklejanie list_content.xml. Na razie jednak chciałbym uniknąć tego hackery. czy to jedyne rozwiązanie?

+0

znalazłeś rozwiązanie tego problemu? Mam ten sam problem. – Yuyo

+0

@Yuyo skończyłem, nie używając niestandardowego układu (lenistwo naprawdę), ale jak ja i antonyte powiedziałem, że możesz po prostu skopiować "list_content.xml" do swojego projektu. To nie jest hackery, ale jest to najlepszy sposób, aby to zrobić, jeśli nie chcesz zacząć pisać linii kodu, aby osiągnąć ten sam efekt. –

Odpowiedz

8

Wydaje się, że biblioteka ListFragment zawarta w bibliotece zgodności nie używa tego układu (list_content) tak jak prawdziwy. Może to być spowodowane tym, że jest oferowany jako słoik i nie można pakować zasobów. Oto treść jego onCreateView:

ListFragment z biblioteki Kompatybilność:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    final Context context = getActivity(); 

    FrameLayout root = new FrameLayout(context); 

    // ------------------------------------------------------------------ 

    LinearLayout pframe = new LinearLayout(context); 
    pframe.setId(INTERNAL_PROGRESS_CONTAINER_ID); 
    pframe.setOrientation(LinearLayout.VERTICAL); 
    pframe.setVisibility(View.GONE); 
    pframe.setGravity(Gravity.CENTER); 

    ProgressBar progress = new ProgressBar(context, null, 
      android.R.attr.progressBarStyleLarge); 
    pframe.addView(progress, new FrameLayout.LayoutParams(
      ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 

    root.addView(pframe, new FrameLayout.LayoutParams(
      ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); 

    // ------------------------------------------------------------------ 

    FrameLayout lframe = new FrameLayout(context); 
    lframe.setId(INTERNAL_LIST_CONTAINER_ID); 

    TextView tv = new TextView(getActivity()); 
    tv.setId(INTERNAL_EMPTY_ID); 
    tv.setGravity(Gravity.CENTER); 
    lframe.addView(tv, new FrameLayout.LayoutParams(
      ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); 

    ListView lv = new ListView(getActivity()); 
    lv.setId(android.R.id.list); 
    lv.setDrawSelectorOnTop(false); 
    lframe.addView(lv, new FrameLayout.LayoutParams(
      ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); 

    root.addView(lframe, new FrameLayout.LayoutParams(
      ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); 

    // ------------------------------------------------------------------ 

    root.setLayoutParams(new FrameLayout.LayoutParams(
      ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); 

    return root; 
} 

ListFragment z Androidem 4.0:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return inflater.inflate(com.android.internal.R.layout.list_content, container, false); 
} 

Mając wybór między kopiując plik układu ze źródła APIv11 włącznie ten zobacz kod inicjalizacyjny, myślę, że jest jasne, który z nich zostanie uznany za "hackery";)

1

One possible le obejście włączyć domyślne @ android.R.layout/list_content do niestandardowy układ przy użyciu biblioteki kompatybilność jest stworzenie obojętne ListFragment:

package com.example.app; 

import android.support.v4.app.ListFragment; 

public class ListContentFragment extends ListFragment { 
    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     //Supress default list and empty text behavior 
     //super.onViewCreated(view, savedInstanceState); 
    } 
} 

Następnie w tym tym fragmentu (zamiast zalecanej układ list_content) do niestandardowy układ:

... 
<fragment class="com.example.app.ListContentFragment" 
    android:layout_weight ="1" 
    android:layout_width ="fill_parent" 
    android:layout_height ="0dip" /> 
... 

ten sposób otrzymasz w pełni funkcjonalny domyślne zachowanie ListFragment nadal mając niestandardowy układ dla niego.

2

Byłem sfrustrowany widząc, że layout list_content nie był dostępny przy użyciu biblioteki pomocy technicznej. Moje podejście było po prostu do ponownego użycia domyślnego onCreateView sposobu ListFragment i dodać go jako część mojego niestandardowy układ:

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

    View listContent = super.onCreateView(inflater, container, 
      savedInstanceState); 

    View v = inflater.inflate(R.layout.my_custom_layout, container, 
      false); 

    FrameLayout listContainer = (FrameLayout) v.findViewById(R.id.my_list_container); 

    listContainer.addView(listContent); 

    return v; 
} 

dodałem FrameLayout gdzie ListView używany będzie w moim niestandardowy układ.

+1

Ja przegłosowałem, ponieważ wydawało się, że to jedyny sposób, aby zachować domyślny widok "Ładowanie/Nieokreślony postęp" z setListShown (fałsz). Niestety okazuje się, że ListFragment z biblioteki wsparcia po prostu nie obsługuje tego widoku postępu w połączeniu z widokiem dla pustej listy (@ id/android: pusty). Implementacja [here] (https://android.googlesource.com/platform/frameworks/support/+/master/v4/java/android/support/v4/app/ListFragment.java#335) tylko próbuje znaleźć niestandardowy pusty widok, jeśli domyślny nie jest utworzony. – tangobravo

+0

Nie możemy po prostu użyć kontenera zamiast wywoływać findViewById. Właśnie tam mówimy Androidowi, żeby już zainstalował ListView. – wheredidthatnamecomefrom

Powiązane problemy