我在一个片段上有一个带有菜单HOME,SETTING,ABOUT US等的导航抽屉。只有HOME有一个滑动选项卡。在应用程序启动时,Home已打开,但在此之后,每当我再次单击home时,它会显示错误,说Home Fragment未附加到Activity。
我的代码如下
Drawer.java 这是mainAciticity
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
myDrawerLayout.closeDrawer(drawerBody);
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment fragment;
switch (position){
case 0:
fragment = new Home();
fragmentTransaction.replace(R.id.main_content, fragment);
break;
case 1:
fragment = new Settings();
fragmentTransaction.replace(R.id.main_content, fragment);
break;
case 2:
fragment = new Aboutus();
fragmentTransaction.replace(R.id.main_content, fragment);
break;
case 3:
fragment = new Help_and_Feedback();
fragmentTransaction.replace(R.id.main_content, fragment);
break;
case 4:
fragment = new Fill_up_form();
fragmentTransaction.replace(R.id.main_content, fragment);
break;
}
setTitle(position);
fragmentTransaction.commit();
}
Home.java
public class Home extends Fragment implements ActionBar.TabListener {
ViewPager myViewPager;
ActionBar myActionBar;
MyFragmentPagerAdapter myFragmentPagerAdapter;
String[] selectedTabImage;
String[] unselectedTabImage;
String[] BloodGroups;
public Home() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.home, container, false);
//Initialization
myViewPager = (ViewPager) v.findViewById(R.id.viewpager);
myFragmentPagerAdapter = new MyFragmentPagerAdapter(getActivity().getSupportFragmentManager());
//viewpager work
myViewPager.setAdapter(myFragmentPagerAdapter);
myViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int i, float v, int i2) {
}
@Override
public void onPageSelected(int i) {
myActionBar.setSelectedNavigationItem(i);
}
@Override
public void onPageScrollStateChanged(int i) {
}
});
myActionBar =((ActionBarActivity)getActivity()).getSupportActionBar();
myActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
//get the array of images for tab
selectedTabImage = getResources().getStringArray(R.array.tab_selected);
unselectedTabImage = getResources().getStringArray(R.array.tab_unselected);
BloodGroups = getResources().getStringArray(R.array.blood_groups);
//Add Tabs
for (int i = 0; i < myFragmentPagerAdapter.getCount(); i++) {
String name = selectedTabImage[i];
int tabId = getResources().getIdentifier(name,"drawable", getActivity().getPackageName());
myActionBar.addTab(myActionBar.newTab().setIcon(tabId).setTabListener(this));
}
return v;
}
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
int pos = tab.getPosition();
myViewPager.setCurrentItem(pos);
String name = selectedTabImage[pos];
int tabId = getResources().getIdentifier(name,"drawable", getActivity().getPackageName());
tab.setIcon(tabId);
}
@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
String name = selectedTabImage[tab.getPosition()];
int tabId = getResources().getIdentifier(name,"drawable", getActivity().getPackageName());
tab.setIcon(tabId);
}
@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
}
public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
Fragment fragment = new DonarList();
Bundle args = new Bundle();
args.putInt("bloodGroupPosition", position);
fragment.setArguments(args);
return fragment;
}
@Override
public int getCount() {
return 8;
}
}
@Override
public void onStop() {
super.onStop();
myActionBar.setNavigationMode(0);
}
}
错误堆栈跟踪
05-29 14:44:31.961 12034-12034/com.example.p6.bloodies E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.IllegalStateException: Fragment Home{4120fd50} not attached to Activity
at android.support.v4.app.Fragment.getResources(Fragment.java:619)
at com.example.p6.bloodies.Home.onTabSelected(Home.java:114)
at android.support.v7.internal.app.WindowDecorActionBar.selectTab(WindowDecorActionBar.java:634)
at android.support.v7.internal.app.WindowDecorActionBar.setSelectedNavigationItem(WindowDecorActionBar.java:414)
at android.support.v7.internal.app.WindowDecorActionBar.setNavigationMode(WindowDecorActionBar.java:1297)
at com.example.p6.bloodies.Home.onCreateView(Home.java:72)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1786)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:947)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:454)
at android.os.Handler.handleCallback(Handler.java:605)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:817)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
at dalvik.system.NativeStart.main(Native Method)
第72行的代码
myActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
第114行的代码
int tabId = getActivity()。getResources()。getIdentifier(name,“drawable”,getActivity()。getPackageName());
答案 0 :(得分:0)
不是很清楚,也看不到您的完整活动代码,但是当片段的代码运行时,您的活动可能仍在执行某些(后台)过程。尝试将代码移动到片段生命周期中的onActivityCreated()
,然后将片段附加到活动。还可以检查代码中是否已添加片段,例如。
if(!isAdded()) {
return;
}
答案 1 :(得分:0)
通过此方法删除当前片段可能会解决您的问题
public void removeFragment(Fragment fragment) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.remove(fragment);
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
transaction.commit();
}