2015-05-29 118 views
-2

我有一個菜單HOME,SETTING,關於US等導航抽屜的片段。只有HOME有一個滑動選項卡。在應用程序的開始,家庭被打開,但在那之後,每當我再次點擊家時,它顯示錯誤說Home Home Fragment沒有附加到活動。片段不會第二次打開android

我的代碼如下

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(姓名, 「可拉伸」,getActivity()getPackageName())。。

+0

我避免的getResource解決了這個問題()。則getIdentifier()線。我不知道它爲什麼會造成問題。你能提供一些關於這方面的信息嗎? – umuieme

回答

0

不是很清楚,看不到您的完整活動代碼,但可能您的活動仍在執行一些(後臺)過程或某些代碼片段運行時。嘗試將代碼移動到片段生命週期中的onActivityCreated(),然後將片段附加到該活動。檢查代碼中是否已經添加了片段也很好。

if(!isAdded()) { 
    return; 
} 
+0

我在OnActivityCreated中編寫了代碼,但仍然是同樣的問題。但在同一行仍然顯示相同的錯誤。我想知道爲什麼它在myActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS)中顯示錯誤; – umuieme

+0

而我應該在哪裏使用isAdded代碼? 我在Drawer.java中使用它,但是很長時間的工作 – umuieme

0

通過這種方法刪除當前片段可以解決您的問題

public void removeFragment(Fragment fragment) { 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
    transaction.remove(fragment); 
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 
    transaction.commit(); 
} 
+0

試過。還是一樣的錯誤。 – umuieme