简体   繁体   English

在Fragment.OnCreateView()之外获取片段活动

[英]Get fragment activity outside of Fragment.OnCreateView()

I have a Fragment with a TableLayout . 我有一个TableLayoutFragment The data in the table is from a SQLite db. 表中的数据来自SQLite数据库。 The SQLite db is populated from a RESTful webservice in an AsyncTask in the MainActivity . SQLite数据库是从MainActivity AsyncTask中的RESTful Web服务填充的。 The Fragment must wait for the task to complete before populating the table. Fragment必须等待任务完成才能填充表。 The Fragment listens for the task onPostExecute() method to be called. Fragment侦听要调用的任务onPostExecute()方法。 When it is, the method onLoadAndStoreComplete in the Fragment is called. onLoadAndStoreComplete ,将调用Fragment onLoadAndStoreComplete方法。 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. 什么是行不通的,我需要片段活动才能在onLoadAndStoreComplete创建新的TableRowsTextViewsonLoadAndStoreComplete我无法获取它。

I've tried: 我试过了:
- making a class member fragmentActivity and assigning in onCreateView() , but by the time it gets to onLoadAndStoreComplete() , it is null. -使类成员fragmentActivity并在onCreateView()分配,但是当它到达onLoadAndStoreComplete() ,它为null。
- calling this.getActivity() again in onLoadAndStoreComplete() , but it returns null. -在onLoadAndStoreComplete() this.getActivity()再次调用onLoadAndStoreComplete() ,但它返回null。

How do I get the fragment activity? 我如何获得片段活动?

MyFragment.java: 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) 从MainActivity.java(扩展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 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 . TabsPagerAdapterMyFragment的构造函数添加一个Context参数。

Something like this: 像这样:

TabsPagerAdapter.java: 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: MainActivity.java:

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

MyFragment.java (do this in FirstFragment , SecondFragment , and HelpFragment ): MyFragment.java(在FirstFragmentSecondFragmentHelpFragment执行此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

    }
}

It seems the AsyncTask starts too early. 看来AsyncTask启动得太早了。 suggest loading the db in onActivityCreated() , it's be called after onCreateView 建议在onActivityCreated()加载数据库,在onCreateView之后调用它

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM