2014-07-04 44 views
1

我将说明我的应用程序的结构:片段表示contet两次

活动 - >片段A(即片段(A)我有3个片段内(B,C,d)(viewpager )) - >在第一个片段(B)内部,它包含一个列表视图。该列表中的每一项都会启动一个片段E.

所以我在这里面临一个问题。

当我第一次启动我的应用程序一切看起来不错。

enter image description here

但是,当片段Ë获取的可视屏幕的选项卡获取所有怪异,如:

enter image description here

叶氏!他们得到了重复。 当我的列表视图中单击,我承诺从活动的回调2个片段之间的过渡:

transaction = getSupportFragmentManager().beginTransaction(); 
    transaction.replace(R.id.content_frame, PF); 
    transaction.addToBackStack(null); 
    transaction.commit(); 

当我想回到以前的片段:

 getFragmentManager().popBackStack(); 

是的以前的片段正在重新创建?我能做些什么来解决它?

UPDATE --CODES: 活动:

public class MainActivity extends FragmentActivity implements 
     IslamToolsFragment.OnToolsSelectedListener { 
    FragmentTransaction transaction; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     if (findViewById(R.id.content_frame) != null) { 
      if (savedInstanceState != null) { 
       return; 
      } 

      PagerActivity firstFragment = new PagerActivity(); 

      getSupportFragmentManager().beginTransaction() 
        .add(R.id.content_frame, firstFragment).commit(); 
     } 
    } 

    @Override 
    public void OnToolSelected(int position) { 
     // TODO Auto-generated method stub 
     switch (position) { 
     case 0: 
      PrayerFragment PF = new PrayerFragment(); 
      transaction = getSupportFragmentManager().beginTransaction(); 
      transaction.replace(R.id.content_frame, PF); 
      transaction.addToBackStack(null); 
      transaction.commit(); 
      break; 
     case 1: 
      QiblaFragment QF = new QiblaFragment(); 
      transaction = getSupportFragmentManager().beginTransaction(); 
      transaction.replace(R.id.content_frame, QF); 
      transaction.addToBackStack(null); 
      transaction.commit(); 
      break; 
     } 
    } 

片段A(其包含3个片段):

public class PagerActivity extends Fragment implements ActionBar.TabListener { 
    int NUM_PAGES = 5; 
    ActionBar actionBar; 
    private ViewPager mPager; 
    AppSectionsPagerAdapter mAppSectionsPagerAdapter; 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     mPager.setAdapter(null); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onActivityCreated(savedInstanceState); 
     if (savedInstanceState != null) { 
      return; 
     } else { 

      actionBar = this.getActivity().getActionBar(); 
      actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
      actionBar.setDisplayShowHomeEnabled(false); 
      actionBar.setDisplayShowTitleEnabled(false); 
      mAppSectionsPagerAdapter = new AppSectionsPagerAdapter(
        getChildFragmentManager()); 
      mPager.setAdapter(mAppSectionsPagerAdapter); 
      int icons[] = { R.drawable.ic_action_storage, 
        R.drawable.ic_action_overflow, R.drawable.ic_action_person }; 
      mPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
       @Override 
       public void onPageSelected(int position) { 

        actionBar.setSelectedNavigationItem(position); 
       } 
      }); 

      for (int i = 0; i < mAppSectionsPagerAdapter.getCount(); i++) { 

       actionBar.addTab(actionBar.newTab().setIcon(icons[i]) 
         .setTabListener(this)); 

      } 
     } 
    } 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     View tabsview = inflater.inflate(R.layout.pager_activity, container, 
       false); 
     mPager = (ViewPager) tabsview.findViewById(R.id.pager); 

     return tabsview; 

    } 

Fragnent B:

public class IslamToolsFragment extends Fragment { 
    OnToolsSelectedListener mCallback; 

    ListView islamtools; 
    Fragment PF = new PrayerFragment(); 

    public interface OnToolsSelectedListener { 
     public void OnToolSelected(int position); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View islamtoolsview = inflater.inflate(R.layout.lvislamtools, 
       container, false); 
     if (savedInstanceState != null) { 
      return islamtoolsview; 
     } 
     islamtools = (ListView) islamtoolsview.findViewById(R.id.lvislamtools); 
     String[] title = { "Prayer Times", "Qibla", "Ahadith", "Quran", 
       "Hijri Calendar", "99 Names" }; 
     IslamToolsAdapter ITA = new IslamToolsAdapter(this.getActivity(), title); 
     islamtools.setAdapter(ITA); 
     islamtools.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
        long arg3) { 
       // TODO Auto-generated method stub 
       mCallback.OnToolSelected(arg2); 
      } 

     }); 
     return islamtoolsview; 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
      mCallback = (OnToolsSelectedListener) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() 
        + " must implement OnHeadlineSelectedListener"); 
     } 

    } 

谢谢!它是否与savedinstancestate有关?

+0

后全班 –

+0

@Rod_Algonquin完成 – Fringo

回答

1

您的代码设计有点不对,片段实际上是一些活动,在这种情况下创建一个包含更多片段的片段是没有意义的,您应该做的是为viewpager创建一个活动并将这3个片段放入该活动中。

我有一个类似的应用程序,这是我如何处理接片之间的导航:

pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

     } 

     @Override 
     public void onPageSelected(int position) { 
      actionBar.setSelectedNavigationItem(position); 
     } 

     @Override 
     public void onPageScrollStateChanged(int state) { 

     } 

上面的代码改变选择的操作杆的项目,但不改变下面的视图寻呼机接片的视图,您需要实现以下要做到这一点:

 @Override 
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
    pager.setCurrentItem(tab.getPosition()); 
} 

@Override 
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 

} 

@Override 
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 

} 
+0

我需要让我的应用程序有一个活动和大量的碎片......这并不能帮助我在这种情况下 – Fringo

+0

但是您可以完全做到这一点,而不是拥有另一个3片段的父亲的活动,在您的主要活动中实施viewpager并从那里添加其他片段。 除非你的应用程序更大......这段代码根本没用? –

+0

有时候我用片段B替换片段E ...所以他们需要片段。找到了我? – Fringo