0

正如問題所示,我試圖從其父Activity上的onCreate中調用Fragment的方法。但是,被調用的方法會在Fragment處產生空指針異常。違規行是:加載碎片視圖後,如何調用碎片方法?

getListView().setAdapter(aAdapter); 

我懷疑是getListView()還不存在。也許這是我對片段/活動生命週期知識的一個空白,但是我可以使用一個活動中的「AfterCreate」嗎?

//Views 
private RelativeLayout vClassSettings; 
private LinearLayout vPeople; 
private LinearLayout vLinks; 
private RelativeLayout vAttendanceSettings; 

private static final String sTag = "ActivityClassEdit"; 



private Boolean insertMode; 
//==============On Create================ 
    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_classedit); 
     vClassSettings=(RelativeLayout) findViewById(R.id.ace_container_settings); 
     vPeople = (LinearLayout) findViewById(R.id.ace_container_people); 
     vLinks = (LinearLayout) findViewById(R.id.ace_container_links); 
     vAttendanceSettings = (RelativeLayout)  findViewById(R.id.ace_container_attendanceDetails); 
     insertMode=true; 
     startupFragments(); 
    } 

    /* 
     Sets modes for children fragments so that we do not get null adapters, be it Object or SQL related 
    */ 
    private void startupFragments(){ 
     instantiateFragments(); 
     if(insertMode){ 
      if(fLinkList==null){Log.d(sTag,"null fragment for LinkList");} 
      fLinkList.setArrayMode(); 
      fCrList.setArrayMode(); 
      fPersonList.setArrayMode(); 
     } else { 
      //TODO set CursorMode with parent class argument 
     } 

    } 

和碎片的違規方法:

public void setArrayMode(){ 
    aAdapter = new LinkArrayListAdapter(getActivity(), links); 
    getListView().setAdapter(aAdapter); 
    getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, 
       long id) { 
      final LinkTable.Link selectedLink = (Link) parent.getItemAtPosition(position); 
      selectedLink.setIndex(aAdapter.getPosition(selectedLink)); 
      App.getInstance().getEventBus().post(new FragmentEvent.LinkObjectLoad(selectedLink)); 
      //App.getInstance().getEventBus().post(arg0); 
     }});} 
+0

發佈您的活動代碼。 – 2014-10-03 16:26:21

+1

「在我可以使用的活動中是否有」AfterCreate「?」。 是的,Activity.onPostCreate() – 2014-10-03 16:50:52

+0

@Gil +1。還'onResumeFragments()'。 – kcoppock 2014-10-03 17:05:53

回答

3

我建議你永遠不會從片段本身之外的觸摸片段的視圖。該片段應在onCreateView()中創建它的視圖,抓取視圖參考並初始化onViewCreated()中的視圖,然後將其發佈到onDestroyView()。如果您需要在創建後向其提供數據,您可以:

  1. 在Fragment中提供一個方法來設置適配器的數據。如果尚未創建視圖,則應在分段設置適配器時拾取數據。否則,片段可以使用新數據更新其適配器。

  2. 提供數據作爲片段參數(Fragment.setArguments(Bundle)),並讓片段將onViewCreated()中的列表適配器設置爲getArguments().get{someDataType}()

編輯:所以提供論據的片段:

public static MyListFragment newInstance(int type, ArrayList<? extends Parcelable> items) { 
    MyListFragment fragment = new MyListFragment(); 
    Bundle args = new Bundle(); 
    args.putInt(TYPE_ARG, type); 
    args.putParcelableArrayList(ITEMS_ARG, items); 
    fragment.setArguments(args); 
    return fragment; 
} 

public void onViewCreated(View view, Bundle savedInstanceState) { 
    final int type = getArguments().getInt(TYPE_ARG); 

    if (type == FIRST_TYPE) { 
     // Set first type adapter 
    } else /* Some other type of argument */ { 
     // Set another adapter type 
    } 
} 

雖然如果兩種類型有很大的不同,我建議,也許有共同行爲的一個鹼基的片段,併爲每個子類適配器類型,並根據您用來決定的參數實例化Activity中的不同片段。

+0

我很感謝您的及時答覆。這並不是說視圖正在從Activity中被取消,而是取決於Activity的參數,ListFragment需要設置正確的適配器。 – 2014-10-03 16:42:22

+0

查看更新的答案。 – kcoppock 2014-10-03 16:47:55

+1

您指向不要與活動中的片段視圖混淆是正確的。不幸的是,我的片段被嵌入到活動的XML佈局中,所以我將不得不使用事件總線。然而,你的邏輯仍然會被使用,只是沒有捆綁。感謝您在Android – 2014-10-03 17:08:28