片段内的传呼机

时间:2014-07-07 12:30:06

标签: android android-fragments android-viewpager

正如我previous question中提到的那样,我在Fragments r中显示ViewPage后,在Fragment内的Fragments之一中显示ViewPager时遇到了一些问题。 add()

我设法通过在FragmentTransaction中使用ActionBar来解决问题。不幸的是,这会产生另一个问题:

我在我的应用中使用Fragments。当我选择相同的菜单项两次时遇到与以前相同的问题,它在ViewPager内没有显示任何public class HomePageActivity extends SherlockFragmentActivity implements ICallback { private DrawerLayout mDrawerLayout; private ListView mDrawerList; private SherlockActionBarDrawerToggle mDrawerToggle; private CharSequence mDrawerTitle; private CharSequence mTitle; private String[] mChampionsMenuItems; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTheme(R.style.Theme_Sherlock); setContentView(R.layout.activity_home_page); mTitle = mDrawerTitle = getTitle(); mChampionsMenuItems = getResources().getStringArray(R.array.champions_array); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); mDrawerList = (ListView) findViewById(R.id.left_drawer); mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); mDrawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, mChampionsMenuItems)); mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); getSupportActionBar().setBackgroundDrawable(getResources().getDrawable(R.color.navy_blue)); getSupportActionBar().setDisplayShowTitleEnabled(false); mDrawerToggle = new SherlockActionBarDrawerToggle(this, mDrawerLayout, R.drawable.menu_icon, R.string.drawer_open, R.string.drawer_close) { public void onDrawerClosed(View view) { getSupportActionBar().setTitle(mTitle); supportInvalidateOptionsMenu(); } public void onDrawerOpened(View drawerView) { getSupportActionBar().setTitle(mDrawerTitle); supportInvalidateOptionsMenu(); } }; mDrawerLayout.setDrawerListener(mDrawerToggle); if (savedInstanceState == null) { onFragmentChange(new HomeActivityFragment(), true); } } @Override public boolean onOptionsItemSelected(MenuItem item) { if (mDrawerToggle.onOptionsItemSelected(item)) { return true; } switch (item.getItemId()) { default: return super.onOptionsItemSelected(item); } } private class DrawerItemClickListener implements ListView.OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { selectItem(position); } } private void selectItem(int position) { switch (position) { case 0: onFragmentChange(new Fragment1(), false); break; case 1: onFragmentChange(new Fragment2(), false); break; case 2: onFragmentChange(new MyPointFragment3(), false); break; case 3: // onFragmentChange(new HomeActivityFragment(), true); break; case 4: onFragmentChange(new QueriesFragment(), false); break; case 5: onFragmentChange(new GalleryFragment(), false); break; default: break; } mDrawerList.setItemChecked(position, true); mDrawerLayout.closeDrawer(mDrawerList); } @Override public void setTitle(CharSequence title) { mTitle = title; getSupportActionBar().setTitle(mTitle); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); mDrawerToggle.syncState(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mDrawerToggle.onConfigurationChanged(newConfig); } @Override public void onFragmentChange(Fragment fragment, boolean flag) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.add(R.id.content_frame, fragment, fragment.getClass().getName()); transaction.commit(); } }

家庭活动代码(点击活动的操作栏被调用)

Fragment

这是ViewPager,其中包含public class Fragment1 extends Fragment implements OnClickListener { ICallback callback; private LinearLayout headerContainer; private ImageView headerLogo; private TextView headerName; private Button menuBarButton; MyAdapter adapter; ViewPager pager; ActionBar actionBar; private Button progOverview, progStr, bonusPoint; @Override public void onAttach(Activity activity) { super.onAttach(activity); if (activity instanceof ICallback) { this.callback = (ICallback) activity; } actionBar = activity.getActionBar(); actionBar.show(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = setUpView(inflater, container); return rootView; } private View setUpView(LayoutInflater inflater, ViewGroup container) { View rootView = inflater.inflate(R.layout.fragment_about_champions_club, container, false); headerContainer = (LinearLayout) rootView.findViewById(R.id.second_top_header); headerContainer.setBackgroundColor(getResources().getColor(R.color.prog_str_blue)); headerLogo = (ImageView) rootView.findViewById(R.id.header_logo); headerLogo.setBackgroundResource(R.drawable.about_champions_ticon); headerName = (TextView) rootView.findViewById(R.id.header_name); headerName.setText(R.string.about_champ_title); adapter = new MyAdapter(getFragmentManager()); pager = (ViewPager) rootView.findViewById(R.id.pager); pager.setAdapter(adapter); return rootView; } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (savedInstanceState != null) { // Restore last state for checked position. } } } }

Fragments

这是ViewPager中的public class ProgramOverViewFragment extends Fragment { ICallback callback; @Override public void onAttach(Activity activity) { super.onAttach(activity); if (activity instanceof ICallback) { this.callback = (ICallback) activity; } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_program_overview, container, false); TextView termsAndCond = (TextView) rootView.findViewById(R.id.terms_and_condition_button); termsAndCond.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.replace(R.id.content_frame, fragment); fragment.setRetainInstance(true); transaction.addToBackStack(null); transaction.commit(); } }); return rootView; } } 之一:

FragmentStatePagerAdapter

我的public class MyAdapter extends FragmentStatePagerAdapter { public MyAdapter(FragmentManager fm) { super(fm); } @Override public android.support.v4.app.Fragment getItem(int index) { switch (index) { case 0: return new ProgramOverViewFragment(); case 1: return new ProgramStructureFragment(); case 2: return new BonusPointFragment(); } return null; } @Override public int getCount() { return 3; } }

{{1}}

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

你想做什么?您是否尝试在ViewPager中替换Fragment?或者您是否尝试在ViewPager中的片段内替换片段?或者你想要做一些完全不同的事情?如果你详细解释你想要做什么,我只能给你一个准确的解决方案。无论如何,这是我猜测可能是错误的:


我认为您的问题是您使用了错误的FragmentManager。有多种不同的FragmentManagers,但基本上有两种情况:

  1. 您想要从Fragment
  2. 添加/替换/删除Activity
  3. 您想要从其他Fragment
  4. 添加/替换/删除Fragment

    只要我看不到您的布局文件,我就无法确定这两个选项中哪一个适合您的情况。


    解决方案,如果要替换另一个片段

    内的片段

    如果您想在另一个FragmentTransaction内的Fragment内执行Fragment,则需要使用该子FragmentManager!您可以像FragmentManager一样使用Fragment内的孩子:

    FragmentManager fragmentManager = getChildFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    transaction.replace(R.id.content_frame, fragment);
    fragment.setRetainInstance(true);
    transaction.addToBackStack(null);
    transaction.commit();
    

    如您所见,您只需使用getChildFragmentManager()代替getSupportFragmentManager()


    正如我已经说过的,如果没有关于你情况的任何进一步信息,我无法给你一个更准确的答案。所以请尽量向我解释你想做什么,我相信我们可以解决这个问题。

答案 1 :(得分:0)

最后,我发现我的代码中出错了:

我使用下面的代码为片段内的视图寻呼机设置适配器:

  adapter = new MyAdapter(getFragmentManager());
            pager = (ViewPager) rootView.findViewById(R.id.pager);
            pager.setAdapter(adapter);

并将getFragmentManager()替换为getChildFragmentManager()即可解决此问题。根据我的理解,我在片段中使用了view pager,这就是为什么我必须使用getChildFragment管理器来存储我的viewPager的转换。 可能这有助于某人和这个问题仍然是开放的更好的解决方案。