Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何获取OnCreateView()之外的片段视图_Android_Android Fragments - Fatal编程技术网

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;
        }
    }

}