onLoadAndStoreComplete

onLoadAndStoreComplete

我有一个Fragment和一个TableLayout。表中的数据来自sqlite数据库。sqlite db是从AsyncTaskMainActivity中的restful webservice填充的。在填充表之前,Fragment必须等待任务完成。Fragment监听要调用的taskonPostExecute()方法。如果是,则调用onLoadAndStoreComplete()中的方法Fragment。这都管用。
我需要一个片段的TableLayout方法之外的OnCreateView()视图。如果我能在onLoadAndStoreComplete中看到碎片,那我就到了那里。
Same code as here.
我从main activity得到了mContext,但是没有与之相关的getView()方法。
我试过:
-在oncreateview()中创建类成员rootview并赋值,但在onLoadAndStoreComplete()中为空。
-在onCreateView()中创建类成员tableLayout并赋值,但在onLoadAndStoreComplete()中为空。
-在onLoadAndStoreComplete()中再次调用this.getview(),但它返回null。
-调用onLoadAndStoreComplete()内部的充气器,这很有效,但是我不知道在.inflate()调用中容器使用什么
我不明白为什么rootview和tablelayout的类成员值在onLoadAndStoreComplete()

public class MyFragment extends Fragment implements OnLoadAndStoreCompleteListener {

private TableLayout tableLayout;
private View rootView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,  Bundle savedInstanceState) {
        mContext = this.getActivity();
        rootView = inflater.inflate(R.layout.fragment_permits, container, false); // this works
        tableLayout = (TableLayout) rootView.findViewById(R.id.main_table); // and this
        ...
    }

    @Override
    public void onLoadAndStoreComplete() {

       // rootView is null, ie not remembered from OnCreateView

        View view =  getView(); // null

        LayoutInflater inflater = LayoutInflater.from(getActivity());
      rootView = inflater.inflate(R.layout.fragment_permits, container, false); // container? don't know what it should be

        // tableLayout is null
        tableLayout.addView(tableRow, new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
    }
    ...
}

最佳答案

如果我正确地理解了您的代码,那么您的代码要么不遵守片段生命周期,要么出现不同的片段实例故障。
A.生命周期问题
android框架希望您的片段在onCreateView()方法中创建其视图。视图在框架调用此方法后变为可用。
您的代码可能在onLoadAndStoreComplete()之前调用了onCreateView(),这导致了问题。
您需要提取用数据填充实际视图的方法,因为它可以有两个入口点。请参见下面的代码:

public class MyFragment extends Fragment implements OnLoadAndStoreCompleteListener {
    private TableLayout tableLayout;
    private View rootView;
    private SomeDataClass loadedData;

    @Override
    public View onCreateView(LayoutInflater inflater,
                             ViewGroup container,
                             Bundle savedInstanceState) {
        mContext = this.getActivity();
        rootView = inflater.inflate(R.layout.fragment_permits, container, false);
        tableLayout = (TableLayout) rootView.findViewById(R.id.main_table);

        updateUi(); // If onLoadAndStoreComplete() was already called
                    // this will plug newly created view to returned data
    }

    @Override
    public void onLoadAndStoreComplete() {
        loadedData = ...; // Save loaded data here
        updateUi(); // If onCreateView() was already called
                    // this will plug loaded data to the view
    }


    private void updateUi() {
        if (rootView == null) { // Check if view is already inflated
            return;
        }

        if (loadedData != null) {
            // View is already inflated and data is ready - update the view!
            ...
        }
    }
}

b.不同实例故障
当您在前面提到的片段的两个不同实例上操作时,可能会发生这种情况。
一开始一切都会井然有序:onCreateView()onLoadAndStoreComplete()之前调用。因此,请检查这些:
记录/调试片段的默认构造函数调用。在创建/加载流期间,您希望获得对片段的一个调用。
检查调用onCreateView()的对象是否与调用onLoadAndStoreComplete()的对象完全相同,您可以使用System.identityHashCode(this),在这两种方法中获取不同的值是一个坏迹象
如果是这样的话,原因可能隐藏得更深一些,如果没有代码,我就不能给你准确的建议。如何创建片段?是通过XML还是通过FragmentManager或ViewPager手动添加?

关于android - 如何获取OnCreateView()之外的 fragment View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29607864/

10-12 02:01