2012-05-19 17 views
14

Sto trasferendo la mia app da AsyncTasks a Fragements.ListFragment come ottenere la listaView?

Ma come posso accedere all'elemento listView (id: list) all'interno del mio frammento?

class MyFragment extends ListFragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.list_fragment, container, false); 
     ListView listView = getListView(); //EX: 
     listView.setTextFilterEnabled(true); 
     registerForContextMenu(listView); 
     return v; 
    } 
} 

xml:

 <ListView 
     android:id="@android:id/list" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" > 
    </ListView> 

Es:

Caused by: java.lang.IllegalStateException: Content view not yet created 
+0

http://stackoverflow.com/questions/9286391/android-why-is-this-telling-me-content-view-not-yet-created –

risposta

26

come il doc onCreateView rimane:

creates and returns the view hierarchy associated with the fragment 

così dal momento che il metodo non restituisce, si non sono in grado di accedere allo ListView a getListView(). È possibile ottenere un riferimento valido nel callback onActivityCreated. Oppure si può provare a utilizzare v.findViewById(android.R.id.list) se il ListView è dichiarata all'interno list_fragment.xml

+1

Io uso onActivityCreate e ottengo il contentView non creato crash, anche con l'utilizzo di un metodo postdelay con 100 millisecondi di attesa – CQM

6

lista get Vista dal punto di vista, si stanno ottenendo in precedenza.

View view = inflater.inflate(android.R.layout.list_content, null); 
    ListView ls = (ListView) view.findViewById(android.R.id.list); 
    // do whatever you want to with list. 
3

È stato possibile accedere a ListView tramite il metodo OnViewCreated.

+3

Questa mi sembra la soluzione più appropriata per me. Secondo the docs ... 'onViewCreated' viene chiamato immediatamente dopo che onCreateView (LayoutInflater, ViewGroup, Bundle) è tornato, ma prima che qualsiasi stato salvato sia stato ripristinato nella vista. Questo dà alle sottoclassi la possibilità di inizializzarsi una volta che sanno che la loro gerarchia delle viste è stata completamente creata. La gerarchia delle viste del frammento non è tuttavia collegata al suo genitore a questo punto. –

4

La soluzione più semplice e più affidabile a questo problema sarà l'override di onActivityCreated(); e fai le tue manipolazioni di lista lì.

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    ListView listView = getListView(); //EX: 
    listView.setTextFilterEnabled(true); 
    registerForContextMenu(listView); 
    super.onActivityCreated(savedInstanceState); 
} 
1
ListFragment listFrag = new ListFragment(){ 
     @Override 
     public void onViewCreated(View view, Bundle savedInstanceState) { 
      super.onViewCreated(view, savedInstanceState); 
      ListView list = getListView(); 
      // DO THINGS WITH LIST 
     } 
    }; 
Problemi correlati