获取片段活动Fragment.OnCreateView之外() [英] Get fragment activity outside of Fragment.OnCreateView()

查看:392
本文介绍了获取片段活动Fragment.OnCreateView之外()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个片段 TableLayout 。在表中的数据是从一个SQLite分贝。 sqlite的DB是从RESTful Web服务在 MainActivity 填充在AsyncTask的。在片段必须等待任务填充表之前完成。在片段侦听任务被称为 onPostExecute()方法。当是时,该方法 onLoadAndStoreComplete 片段被调用。这一切工作。

什么不工作是我需要,以创建片段活动新的 TableRows TextViews onLoadAndStoreComplete ,我不能得到它。

我试过:结果
- 制造类成员 fragmentActivity onCreateView分配(),但它得到<$ C $时间C> onLoadAndStoreComplete(),它为空。结果
- 调用 this.getActivity() onLoadAndStoreComplete试(),但它返回null

我如何获得该片段活动?

MyFragment.java:

 公开查看onCreateView(LayoutInflater充气器,容器的ViewGroup,捆绑savedInstanceState){
        fragmentActivity = this.getActivity(); //返回值是有效
        ...
}@覆盖
公共无效onLoadAndStoreComplete(){        fragmentActivity = this.getActivity(); //返回null
    ...
}

从MainActivity.java(扩展ActionBarActivity)

  @覆盖
保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        mainActivity =这一点;
        的setContentView(R.layout.activity_main);        资源资源= getResources();
        的String [] = tabTitleArray {resources.getString(R.string.first_fragment)
                                   resources.getString(R.string.second_fragment)
                                   resources.getString(R.string.help_fragment)};        viewPager =(ViewPager)findViewById(R.id.pager);
        动作条= getSupportActionBar();
        mAdapter =新TabsPagerAdapter(this.getSupportFragmentManager());        viewPager.setAdapter(mAdapter);
        actionBar.setHomeButtonEnabled(假);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);        对于(字符串TAB_NAME:tabTitleArray){
            actionBar.addTab(actionBar.newTab()的setText(TAB_NAME).setTabListener(本));
        }        //在刷卡ViewPager,选择相应的选项卡
        viewPager.setOnPageChangeListener(新ViewPager.OnPageChangeListener(){            @覆盖
            公共无效使用onPageSelected(INT位置){
                actionBar.setSelectedNavigationItem(位置); //上改变页面,使选定的推崇标签
            }
            @覆盖
            公共无效onPageScrolled(INT为arg0,ARG1浮球,诠释ARG2){
            }
            @覆盖
            公共无效onPageScrollStateChanged(INT为arg0){
            }
        });        字符串URL =HTTP:// myrestfulwebservice
        片段secondFragment = mAdapter.getItem(SECOND_TAB);
            新LoadAndStoreDataTask((OnLoadAndStoreCompleteListener)secondFragment).execute(URL);
    }} //结束的OnCreate

TabsPagerAdapter.java

 公共类TabsPagerAdapter扩展FragmentPagerAdapter {    公共TabsPagerAdapter(FragmentManager fragmentManager){
        超(fragmentManager);
    }    @覆盖
    公共片段的getItem(INT指数){
        开关(指数){
        情况下0:
            返回新FirstFragment();
        情况1:
            返回新SecondFragment();
        案例2:
            返回新HelpFragment();
        }        返回null;
    }    @覆盖
    公众诠释的getCount(){
        返回3; //获取项目计数 - 等于标签数
    }    公共静态无效setTabColor(TabHost tabhost){
        的for(int i = 0; I&LT; tabhost.getTabWidget()getChildCount();我++){
            。tabhost.getTabWidget()getChildAt(ⅰ).setBackgroundColor(Color.parseColor(#FF0000)); //未选中
        }
        tabhost.getTabWidget().getChildAt(tabhost.getCurrentTab()).setBackgroundColor(Color.parseColor(\"#0000FF\")); //选择
    }}


解决方案

我没有测试过这一点,但在我看来,这是可行的。

添加上下文参数的构造函数对于 TabsPagerAdapter MyFragment

事情是这样的:

TabsPagerAdapter.java:

 公共类TabsPagerAdapter扩展FragmentPagerAdapter {    私人语境mCtx;    公共TabsPagerAdapter(FragmentManager fragmentManager,上下文的背景下){
        超(fragmentManager);
        mCtx =背景;
    }    @覆盖
    公共片段的getItem(INT指数){
        开关(指数){
        情况下0:
            返回新FirstFragment(mCtx);
        情况1:
            返回新SecondFragment(mCtx);
        案例2:
            返回新HelpFragment(mCtx);
        }        返回null;
    }    @覆盖
    公众诠释的getCount(){
        返回3; //获取项目计数 - 等于标签数
    }    公共静态无效setTabColor(TabHost tabhost){
        的for(int i = 0; I&LT; tabhost.getTabWidget()getChildCount();我++){
            。tabhost.getTabWidget()getChildAt(ⅰ).setBackgroundColor(Color.parseColor(#FF0000)); //未选中
        }
        tabhost.getTabWidget().getChildAt(tabhost.getCurrentTab()).setBackgroundColor(Color.parseColor(\"#0000FF\")); //选择
    }}

MainActivity.java:

  mAdapter =新TabsPagerAdapter(this.getSupportFragmentManager(),这一点);

MyFragment.java(为此在 FirstFragment SecondFragment HelpFragment

 公共静态类MyFragment扩展片段{    私人语境fragmentActivity;    公共MyFragment(上下文的背景下){
        fragmentActivity =背景;
    }    @覆盖
    公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
                             捆绑savedInstanceState){
        // .........
        返回rootView;
    }    @覆盖
    公共无效onLoadAndStoreComplete(){        //做一些fragmentActivity    }
}

I have a Fragment with a TableLayout. The data in the table is from a SQLite db. The SQLite db is populated from a RESTful webservice in an AsyncTask in the MainActivity. The Fragment must wait for the task to complete before populating the table. The Fragment listens for the task onPostExecute() method to be called. When it is, the method onLoadAndStoreComplete in the Fragment is called. This all works.

What doesn't work is that I need the fragment activity in order to create new TableRows and TextViews in onLoadAndStoreComplete and I can't get it.

I've tried:
- making a class member fragmentActivity and assigning in onCreateView(), but by the time it gets to onLoadAndStoreComplete(), it is null.
- calling this.getActivity() again in onLoadAndStoreComplete(), but it returns null.

How do I get the fragment activity?

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

from MainActivity.java (extends ActionBarActivity)

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mainActivity = this;
        setContentView(R.layout.activity_main);

        Resources resources = getResources();
        String[] tabTitleArray = { resources.getString(R.string.first_fragment),  
                                   resources.getString(R.string.second_fragment),  
                                   resources.getString(R.string.help_fragment) };

        viewPager = (ViewPager) findViewById(R.id.pager);
        actionBar = getSupportActionBar();
        mAdapter = new TabsPagerAdapter(this.getSupportFragmentManager());

        viewPager.setAdapter(mAdapter);
        actionBar.setHomeButtonEnabled(false);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);        

        for (String tab_name : tabTitleArray) {
            actionBar.addTab(actionBar.newTab().setText(tab_name).setTabListener(this));
        }

        // On swiping the ViewPager, select the respective tab 
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override
            public void onPageSelected(int position) {
                actionBar.setSelectedNavigationItem(position) ;// on changing the page, make respected tab selected
            }
            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
            }
            @Override
            public void onPageScrollStateChanged(int arg0) {
            }
        });

        String url = "http://myrestfulwebservice";
        Fragment secondFragment = mAdapter.getItem(SECOND_TAB);
            new LoadAndStoreDataTask((OnLoadAndStoreCompleteListener)secondFragment).execute(url);    
    }

} // end OnCreate

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
    }

}

解决方案

I haven't tested this, but it seems to me that it would work.

Add a Context parameter to the constructor for both TabsPagerAdapter and MyFragment.

Something like this:

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
    }

}

MainActivity.java:

  mAdapter = new TabsPagerAdapter(this.getSupportFragmentManager(), this);

MyFragment.java (do this in FirstFragment, SecondFragment, and HelpFragment):

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

    }
}

这篇关于获取片段活动Fragment.OnCreateView之外()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆