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