[英]Get fragment activity outside of Fragment.OnCreateView()
I have a Fragment
with a TableLayout
. 我有一个
TableLayout
的Fragment
。 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
创建新的TableRows
和TextViews
, onLoadAndStoreComplete
我无法获取它。
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
. 为
TabsPagerAdapter
和MyFragment
的构造函数添加一个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(在
FirstFragment
, SecondFragment
和HelpFragment
执行此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.