Android 如何获取OnCreateView()之外的片段视图
我有一个Android 如何获取OnCreateView()之外的片段视图,android,android-fragments,Android,Android Fragments,我有一个片段和一个表格布局。表中的数据来自SQLite数据库。SQLite db是从MainActivity中的AsyncTask中的RESTful Web服务填充的。片段必须等待任务完成后才能填充表。片段侦听要调用的任务onPostExecute()方法。如果是,则调用片段中的方法onLoadAndStoreComplete()。这一切都有效 我需要在片段的OnCreateView()方法之外获取TableLayout的视图。如果我能在onload和storecomplete中获得片段的视图,
片段
和一个表格布局
。表中的数据来自SQLite数据库。SQLite db是从MainActivity
中的AsyncTask
中的RESTful Web服务填充的。片段必须等待任务完成后才能填充表。片段
侦听要调用的任务onPostExecute()
方法。如果是,则调用片段
中的方法onLoadAndStoreComplete()
。这一切都有效
我需要在片段的OnCreateView()
方法之外获取TableLayout
的视图。如果我能在onload和storecomplete
中获得片段的视图,我就可以到达那里了
我从main活动中获得了mContext
,但没有与之关联的getView()
方法
我试过:
-生成类成员rootView并在onCreateView()中赋值,但在onLoadAndStoreComplete()
中,它是空的。
-在onCreateView()中创建类成员tableLayout并赋值,但在onLoadAndStoreComplete()
中为空。
-在onLoadAndStoreComplete()
中再次调用此.getView(),但它返回null。
-在onload和storecomplete()中调用充气机,这是可行的,但是在调用中我不知道容器使用什么
我不明白为什么在onLoadAndStoreComplete()
getView()
提供从onCreatedView()返回的片段的根视图。因此,如果在onLoadAndStoreComplete()
完成之前调用了onCreatedView()
(它无法返回您的根视图),您将得到null
,因为还没有创建视图
我已尝试在onViewCreated()
内部调用getView()
,该函数不为空:
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
View viewer=getView();
if(viewer==null){
Itu.showToast("null",getActivity(), Toast.LENGTH_LONG);
}else{
Itu.showToast(viewer.toString(),getActivity(), Toast.LENGTH_LONG);//This is called
}
}
我需要获取OnCreateView()外部的TableLayout视图
片段的方法。如果我能在照片中看到碎片
完成了这项工作,我就可以到达那里了
尝试更改onLoadAndStoreComplete的定义以获取视图,然后传入片段的视图。是否确实在onCreateView()之后调用onLoadAndStoreComplete()?实例变量为null的唯一原因是没有调用初始化它们的方法
我建议您在onAttach、onDetach、onCreate、onCreateView、onStart、onStop、onload和storecomplete中调用Log.d,以查看调用顺序。之后,用日志输出更新您的问题,看看哪个可能是问题所在,也许我可以给您一个更简洁的答案。如果在调用onCreateView(…)
后初始化了rootView
和tableLayout
,则从代码片段中选择,如果在此之后两个字段都未设置为null,则在调用onLoadAndStoreComplete(..)
时,它们必须不为null
我想您是在片段的另一个实例中调用该方法。查看您的活动代码,并检查您是否一直在使用片段中的相同实例。您可以进行多个修复:
如果在启动片段之前调用了异步任务,那么onLoadAndStoreComplete回调可能会在onCreateView之前调用(并且所有视图都不会膨胀)
您可以从onCreateView执行asyncTask,但必须显示加载程序来告诉用户应用程序正在同步
您还可以使用listview而不是tableLayout:
public class MyFragment extends Fragment implements OnLoadAndStoreCompleteListener {
private ListView listView;
private View rootView;
private MyAdapter adapter;
private List<T> mDatas; /// This one is populated like you want, from onLoadAndStoreComplete
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mContext = this.getActivity();
rootView = inflater.inflate(R.layout.fragment_permits, container, false); // this works
listView = (ListView) rootView.findViewById(R.id.main_table); // and this
mDatas = new List<>();
adapter = new MyAdapter();
tableLayout.setAdapter(adapter);
}
@Override
public void onLoadAndStoreComplete() {
adapter.notifyDataSetChanged();
}
private class MyAdapter extends BaseAdapter{
@Override
public int getCount() {
// TODO Auto-generated method stub
return mDatas.size() == 0 ? 1 : mDatas.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return mDatas.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (mDatas.size()==0){
// inflate new view with only a progressbar indefinite
LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.row_loading, parent, false);
return convertView;
}
else{
// list is populated
LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.row_datas, parent, false);
// do inflating view stuff
return convertView;
}
}
}
公共类MyFragment扩展片段实现OnLoadAndStoreCompleteListener{
私有列表视图列表视图;
私有视图rootView;
专用MyAdapter适配器;
private List mDatas;///此列表按照您的需要从onload和storecomplete中填充
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
mContext=this.getActivity();
rootView=inflater.inflate(R.layout.fragment_,container,false);//这很有效
listView=(listView)rootView.findViewById(R.id.main_table);//以及
mDatas=新列表();
适配器=新的MyAdapter();
tableLayout.setAdapter(适配器);
}
@凌驾
public void onload和storecomplete(){
adapter.notifyDataSetChanged();
}
私有类MyAdapter扩展了BaseAdapter{
@凌驾
public int getCount(){
//TODO自动生成的方法存根
返回mDatas.size()==0?1:mDatas.size();
}
@凌驾
公共对象getItem(int位置){
//TODO自动生成的方法存根
返回mDatas.get(位置);
}
@凌驾
公共长getItemId(int位置){
//TODO自动生成的方法存根
返回0;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
如果(mDatas.size()==0){
//仅使用progressbar扩展新视图
LayoutFlater充气器=(LayoutFlater)getActivity().getSystemService(Context.LAYOUT\u充气器\u服务);
convertView=充气机。充气(R.layout.row_加载,父级,错误);
返回视图;
}
否则{
//列表已填充
LayoutFlater充气器=(LayoutFlater)getActivity().getSystemService(Context.LAYOUT\u充气器\u服务);
convertView=充气机。充气(R.layout.row_数据,父项,false);
//做膨胀视图的事情
返回视图;
}
}
}
您需要将tableLayout修改为ListView(在RelativeLayout内部?如果我正确理解了您的代码,那么您的代码可能不符合片段生命周期,或者是不同的片段实例fai
public class MyFragment extends Fragment implements OnLoadAndStoreCompleteListener {
private ListView listView;
private View rootView;
private MyAdapter adapter;
private List<T> mDatas; /// This one is populated like you want, from onLoadAndStoreComplete
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mContext = this.getActivity();
rootView = inflater.inflate(R.layout.fragment_permits, container, false); // this works
listView = (ListView) rootView.findViewById(R.id.main_table); // and this
mDatas = new List<>();
adapter = new MyAdapter();
tableLayout.setAdapter(adapter);
}
@Override
public void onLoadAndStoreComplete() {
adapter.notifyDataSetChanged();
}
private class MyAdapter extends BaseAdapter{
@Override
public int getCount() {
// TODO Auto-generated method stub
return mDatas.size() == 0 ? 1 : mDatas.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return mDatas.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (mDatas.size()==0){
// inflate new view with only a progressbar indefinite
LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.row_loading, parent, false);
return convertView;
}
else{
// list is populated
LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.row_datas, parent, false);
// do inflating view stuff
return convertView;
}
}
}