我正在使用android给出的兼容性库android.cupport-v4.jar,我发现了一个问题,我开始构建一个TabActivity,其中包含几个片段。
我有一个带有GridView的起始标签,来自适配器中项目的监听器我调用以下代码:
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
ft.add(R.id.relativeLayoutContent, newFragment);
// ft.replace(R.id.relativeLayoutContent, newFragment);
ft.addToBackStack(null);
ft.commit();
问题是当我打开新片段并返回第一个片段时,它不会用于onAttach,因为它从未被取消,并且因为新片段是,所以活动现在持有最后一个,但不是第一个,如果我再次尝试点击一个元素,它会崩溃告诉我,Fragment中的getActivity方法是null。
有关此问题的任何解决方法吗?
答案 0 :(得分:0)
我不确定你想要完成什么,但无论如何我都会采取措施。
您应该使用fragmentmanager来保存不同的片段,但是当您在FragmentTransaction中使用add方法时,请为片段分配一个标记,以便您可以轻松地在片段之间来回切换。
TabActivity也已被弃用。 你有没有想过在ActionBar中使用Tabs? http://developer.android.com/guide/topics/ui/actionbar.html#Tabs
以下是我从目前正在处理的事情中删除的片段:
public void changeFragment(String tag){
Fragment tmpFragment;
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
//look to see if we have already added the fragment
tmpFragment = getFragmentManager().findFragmentByTag(tag);
//we currently have a fragment, hide it
if (currentFragment != null){
fragmentTransaction.detach(currentFragment);
}
//did not find the fragment
if (tmpFragment == null){
if (tag.equals("map")){
currentFragment = CustomMapFragment.newInstance();
} else if (tag.equals("list")){
currentFragment = ListFragment.newInstance();
}else {
//TODO
}
//add fragment for 1st time
fragmentTransaction.add(R.id.content_frame, currentFragment, tag);
} else {
//we found the fragment
currentFragment = tmpFragment;
fragmentTransaction.attach(currentFragment); //show the fragment we found
}
fragmentTransaction.commit();
}
您可以使用此方法根据标记切换片段。