Android 获取fragment.OnCreateView()之外的片段活动

Android 获取fragment.OnCreateView()之外的片段活动,android,android-fragments,Android,Android Fragments,我有一个片段和一个表格布局。表中的数据来自SQLite数据库。SQLite db是从MainActivity中的异步任务中的RESTful Web服务填充的。片段必须等待任务完成后才能填充表。片段侦听要调用的任务onPostExecute()方法。如果是,则调用片段中的方法onload和storecomplete。这一切都有效 不起作用的是,我需要片段活动,以便在onLoadAndStoreComplete中创建新的TableRows和TextView,但我无法获得它 我试过: -创建类成员fr

我有一个
片段
和一个
表格布局
。表中的数据来自SQLite数据库。SQLite db是从
MainActivity
中的异步任务中的RESTful Web服务填充的。
片段必须等待任务完成后才能填充表。
片段
侦听要调用的任务
onPostExecute()
方法。如果是,则调用
片段
中的方法
onload和storecomplete
。这一切都有效

不起作用的是,我需要片段活动,以便在
onLoadAndStoreComplete
中创建新的
TableRows
TextView
,但我无法获得它

我试过:
-创建类成员
fragmentActivity
并在
onCreateView()
中赋值,但当它到达
onLoadAndStoreComplete()
时,它是空的。
-在
onLoadAndStoreComplete()
中再次调用
this.getActivity()
,但返回null

如何获取片段活动

MyFragment.java:

public View onCreateView(LayoutInflater inflater, ViewGroup container,  Bundle savedInstanceState) {
        fragmentActivity = this.getActivity(); // return value is valid
        ...
}

@Override                               
public void onLoadAndStoreComplete() {  

        fragmentActivity = this.getActivity(); // returns null
    ...
}
来自MainActivity.java(扩展ActionBarActivity)

TabsPagerAdapter.java

public class TabsPagerAdapter extends FragmentPagerAdapter {

    public TabsPagerAdapter(FragmentManager fragmentManager) {
        super(fragmentManager);
    }

    @Override
    public Fragment getItem(int index) {
        switch (index) {
        case 0:
            return new FirstFragment();
        case 1:
            return new SecondFragment();
        case 2:
            return new HelpFragment();
        }

        return null;
    }

    @Override
    public int getCount() {
        return 3; // get item count - equal to number of tabs
    }

    public static void setTabColor(TabHost tabhost) {
        for(int i=0;i<tabhost.getTabWidget().getChildCount();i++) {
            tabhost.getTabWidget().getChildAt(i).setBackgroundColor(Color.parseColor("#FF0000")); //unselected
        }
        tabhost.getTabWidget().getChildAt(tabhost.getCurrentTab()).setBackgroundColor(Color.parseColor("#0000FF")); // selected
    }

}
公共类选项卡SpagerAdapter扩展了FragmentPagerAdapter{
公共选项卡SpagerAdapter(碎片管理器碎片管理器){
超级(碎片管理器);
}
@凌驾
公共片段getItem(int索引){
开关(索引){
案例0:
返回新的FirstFragment();
案例1:
返回新的SecondFragment();
案例2:
返回新的HelpFragment();
}
返回null;
}
@凌驾
public int getCount(){
返回3;//获取项目计数-等于选项卡数
}
公共静态无效setTabColor(TabHost TabHost){

对于(int i=0;i异步任务似乎启动得太早。建议在activitycreated()上加载数据库,在
onCreateView之后调用它

@Override
public void onActivityCreated (Bundle savedInstanceState) {
    //load your db here
}

我还没有测试过这个,但在我看来它会起作用

TabsPagerAdapter
MyFragment
的构造函数添加
Context
参数

大概是这样的:

TabsPagerAdapter.java:

public class TabsPagerAdapter extends FragmentPagerAdapter {

    private Context mCtx;

    public TabsPagerAdapter(FragmentManager fragmentManager, Context context) {
        super(fragmentManager);
        mCtx = context;
    }

    @Override
    public Fragment getItem(int index) {
        switch (index) {
        case 0:
            return new FirstFragment(mCtx);
        case 1:
            return new SecondFragment(mCtx);
        case 2:
            return new HelpFragment(mCtx);
        }

        return null;
    }

    @Override
    public int getCount() {
        return 3; // get item count - equal to number of tabs
    }

    public static void setTabColor(TabHost tabhost) {
        for(int i=0;i<tabhost.getTabWidget().getChildCount();i++) {
            tabhost.getTabWidget().getChildAt(i).setBackgroundColor(Color.parseColor("#FF0000")); //unselected
        }
        tabhost.getTabWidget().getChildAt(tabhost.getCurrentTab()).setBackgroundColor(Color.parseColor("#0000FF")); // selected
    }

}
MyFragment.java(在
FirstFragment
SecondFragment
HelpFragment
中执行此操作):


请显示您开始加载数据库的位置您可以显示您的
TabsPagerAdapter
code吗?将TabsPagerAdapter添加到origin异步任务确实是
OnCreateView()
中完成的最后一件事(请参阅添加到OP中的代码)。因此,您建议将该代码从MainActivity移动到片段。我不喜欢这样做,因为如果我需要另一个片段中的数据,我该怎么办。虽然AsyncTask位于onCreate中的最后一行,但即使AsyncTask完成,该片段也可能不会附加到该活动。如果您希望与其他片段共享数据,则我认为最好使用“全局缓存”,我认为这是正确的方向。但是,如果我理解正确,MainActivty中mAdapter assignment中的“this”是MainActivity,我需要第二个片段活动。@AlLelopath实际上,当您调用
fragmentActivity=this.getActivity()时
在片段中,您将获得
MainActivity
活动上下文。因此,将
this
传递给构造函数将引用与以前完全相同的
Context
。实际上没有片段上下文,每个片段都使用其父活动的上下文。当您说“我需要第二个片段活动",这正是您在这里得到的。@AlLelopath第二个片段活动是main活动。但是请记住,您真正需要的是
上下文
,并且由于
活动
扩展了
上下文
,您可以在活动中使用
来引用活动上下文。这个答案解释了这一点retty directly:没错。谢谢。我想我不明白为什么在
OnCreateView
中设置rootView不起作用,也就是说,为什么在
OnCreateView
中正确设置了类成员rootView,但在
onLoadAndStoreComplete()
中,它是空的。你能解释一下吗?
public class TabsPagerAdapter extends FragmentPagerAdapter {

    private Context mCtx;

    public TabsPagerAdapter(FragmentManager fragmentManager, Context context) {
        super(fragmentManager);
        mCtx = context;
    }

    @Override
    public Fragment getItem(int index) {
        switch (index) {
        case 0:
            return new FirstFragment(mCtx);
        case 1:
            return new SecondFragment(mCtx);
        case 2:
            return new HelpFragment(mCtx);
        }

        return null;
    }

    @Override
    public int getCount() {
        return 3; // get item count - equal to number of tabs
    }

    public static void setTabColor(TabHost tabhost) {
        for(int i=0;i<tabhost.getTabWidget().getChildCount();i++) {
            tabhost.getTabWidget().getChildAt(i).setBackgroundColor(Color.parseColor("#FF0000")); //unselected
        }
        tabhost.getTabWidget().getChildAt(tabhost.getCurrentTab()).setBackgroundColor(Color.parseColor("#0000FF")); // selected
    }

}
  mAdapter = new TabsPagerAdapter(this.getSupportFragmentManager(), this);
public static class MyFragment extends Fragment {

    private Context fragmentActivity ;

    public MyFragment(Context context){
        fragmentActivity  = context;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        //.........            
        return rootView;
    }

    @Override
    public void onLoadAndStoreComplete() {

        //do something with fragmentActivity

    }
}