我有一个Fragment
和一个TableLayout
。表中的数据来自sqlite数据库。sqlite db是从AsyncTask
中MainActivity
中的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/