2012-05-19 2 views
14

AsyncTasks에서 Fragements로 앱을 포팅합니다.ListFragment listView를 얻는 방법?

그러나 내 조각 내에서 listView (id : list) 요소에 액세스하려면 어떻게해야합니까?

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> 

예 :

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 –

답변

26

onCreateView 문서가 유지로 :이 방법은 반환하지 않기 때문에 그렇게

creates and returns the view hierarchy associated with the fragment 

, 당신은하지 않습니다에 액세스 할 수 있음~ getListView(). onActivityCreated 콜백에서 유효한 참조를 얻을 수 있습니다. 또는 당신이 ListView이보기에서 list_fragment.xml

+1

나는 onActivityCreate를 사용하고 내용 없음을 얻을 100 밀리 초 대기 후 지연된 방법을 사용하여도 크래시가 생성되지 않음 – CQM

6

가져 오기 목록보기 내에서 선언 된 경우 v.findViewById(android.R.id.list)를 사용하여 시도 할 수 있습니다, 당신은 이전지고있다.

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

대신에 OnViewCreated 메서드를 사용하여 ListView에 액세스 할 수있었습니다.

+3

이것은 나에게 가장 적합한 해결책 인 것 같습니다. the docs에 따르면 onCreateView (LayoutInflater, ViewGroup, Bundle)가 반환되었지만 저장된 상태가보기로 복원되기 전에'onViewCreated'가 바로 호출됩니다. 이것에 의해, 서브 클래스는 뷰 계층이 완전하게 작성된 것을 알게되면 (자) 스스로 초기화 할 수 있습니다. 그러나 프래그먼트의 뷰 계층 구조는이 시점에서 상위에 연결되지 않습니다. –

4

이 문제에 대한 가장 쉽고 안정적인 해결 방법은 onActivityCreated()를 재정의하는 것입니다. 목록 조작을 거기에서하십시오.

@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 
     } 
    }; 
관련 문제