我有一个项目需要有两个vIEwpager,每个都在活动的不同片段中.
这样的架构是这样的
问题是当寻呼机视图膨胀时,另一个不是.
例如,可以通过单击访问片段1,2和3.当我点击第一个片段时,它会完美地展开视图寻呼机及其两个片段,但是如果我点击片段3,则视图寻呼机不会使片段膨胀,而且标签也会变慢.
再次打开应用程序进程,首先单击片段3,它可以正常工作,但点击后面的第一个,这个问题再次发生.
已经调试过程并没有什么不同.
我的活动
public class HomeActivity extends AppCompatActivity implements NavigationFragment.OnNavigationListener{public NavigationFragment mNavigation;private String mTagFragmentShowing = "";private int currentNavigation = 0;@OverrIDeprotected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_home); ButterKnife.bind(this); mNavigation = (NavigationFragment) getFragmentManager().findFragmentByID(R.ID.manager_navigation); onNavigationSelected(currentNavigation);}@OverrIDepublic voID onNavigationSelected(int position) { if (mTagFragmentShowing.equals(String.valueOf(position))) return; currentNavigation = position; mNavigation.setNavigationSelected(position); FragmentManager fragmentManager = getSupportFragmentManager(); Fragment fragment = fragmentManager.findFragmentByTag(mTagFragmentShowing); // HIDe last fragment if (fragment != null && fragment.isVisible()) { fragmentManager.beginTransaction().hIDe(fragment).commit(); } // Show new fragment mTagFragmentShowing = String.valueOf(position); fragment = fragmentManager.findFragmentByTag(mTagFragmentShowing); if (fragment != null && fragment.isHIDden()) { fragmentManager.beginTransaction().show(fragment).commit(); } else if (fragment == null) { fragmentManager.beginTransaction().add(R.ID.manager_content, getFragmentByposition(position), mTagFragmentShowing) .setTransition(FragmentTransaction.TRANSIT_NONE).commit(); }}private Fragment getFragmentByposition(int position) { switch (position) { case 0: return new discoverFragment(); case 1: return new UpcomingFragment(); case 2: return new FeaturesFragment(); case 3: return new VIDeosFragment(); case 4: return new MySongsFragment(); } return null;}
我的导航片段.它控制其他片段
public class NavigationFragment extends Fragment implements VIEw.OnClickListener {public VIEwHolder mHolder;public VIEw mbuttonSelected;public OnNavigationListener mCallback;@OverrIDepublic VIEw onCreateVIEw(LayoutInflater inflater, VIEwGroup container, Bundle savedInstanceState) { VIEw vIEw = inflater.inflate(R.layout.component_navigation, container, false); ButterKnife.bind(this, vIEw); initVIEw(vIEw); return vIEw;}public voID initVIEw(VIEw vIEw) { mHolder = new VIEwHolder(); mHolder.discover = vIEw.findVIEwByID(R.ID.component_navigation_discover); mHolder.upcoming = vIEw.findVIEwByID(R.ID.component_navigation_upcoming); mHolder.features = vIEw.findVIEwByID(R.ID.component_navigation_features); mHolder.vIDeos = vIEw.findVIEwByID(R.ID.component_navigation_vIDeos); mHolder.mymusic = vIEw.findVIEwByID(R.ID.component_navigation_mymusic); mHolder.discover.setTag(0); mHolder.upcoming.setTag(1); mHolder.features.setTag(2); mHolder.vIDeos.setTag(3); mHolder.mymusic.setTag(4); mHolder.discover.setonClickListener(this); mHolder.upcoming.setonClickListener(this); mHolder.features.setonClickListener(this); mHolder.vIDeos.setonClickListener(this); mHolder.mymusic.setonClickListener(this); mbuttonSelected = mHolder.features;}public voID setNavigationSelected(int position) { setNavigationbuttonSelected(false); switch (position) { case 0: mbuttonSelected = mHolder.discover; break; case 1: mbuttonSelected = mHolder.upcoming; break; case 2: mbuttonSelected = mHolder.features; break; case 3: mbuttonSelected = mHolder.vIDeos; break; case 4: mbuttonSelected = mHolder.mymusic; break; } setNavigationbuttonSelected(true);}public voID setNavigationbuttonSelected(boolean enabled) { mbuttonSelected.setBackgroundcolor(enabled ? getResources().getcolor(R.color.color_red) : color.transparent);}@OverrIDepublic voID onClick(VIEw vIEw) { if (vIEw != mbuttonSelected) { mCallback.onNavigationSelected((Integer) vIEw.getTag()); }}@OverrIDepublic voID onAttach(Activity activity) { super.onAttach(activity); try { mCallback = (OnNavigationListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnNavigationSelectedListener"); }}@OverrIDepublic voID onDetach() { super.onDetach(); mCallback = null;}static class VIEwHolder { VIEw discover; VIEw upcoming; VIEw features; VIEw vIDeos; VIEw mymusic;}public interface OnNavigationListener { public voID onNavigationSelected(int position);}
我的片段与视图寻呼机
public class MySongsFragment extends Fragment {private OnFragmentInteractionListener mListener;@OverrIDepublic VIEw onCreateVIEw(LayoutInflater inflater, VIEwGroup container, Bundle savedInstanceState) { getActivity().getSupportFragmentManager().beginTransaction().add(R.ID.mysongs_fragment_container, MySongsVIEwPagerFragment.newInstance(0)).commit(); return inflater.inflate(R.layout.fragment_my_songs, container, false);}@OverrIDepublic voID onDetach() { super.onDetach(); mListener = null;}/** * This interface must be implemented by activitIEs that contain this * fragment to allow an interaction in this fragment to be communicated * to the activity and potentially other fragments contained in that * activity. * <p/> * See the AndroID Training lesson <a href= * "http://developer.androID.com/training/basics/fragments/communicating.HTML" * >Communicating with Other Fragments</a> for more information. */public interface OnFragmentInteractionListener { // Todo: Update argument type and name public voID onFragmentInteraction(Uri uri);}
我的观点寻呼机
public class MySongsVIEwPagerFragment extends Fragment {private static final int NUM_PAGES = 4;private String[] tab_names;private List<String> mTabnames;private PagerAdapter mPagerAdapter;public @Bind(R.ID.pager)VIEwPager mPager;public static MySongsVIEwPagerFragment newInstance(int index) { MySongsVIEwPagerFragment fragment = new MySongsVIEwPagerFragment(); Bundle args = new Bundle(); args.putInt("index", index); fragment.setArguments(args); return fragment;}@OverrIDe public VIEw onCreateVIEw(LayoutInflater inflater, VIEwGroup container, Bundle savedInstanceState) { VIEw vIEw = initVIEw(inflater, container); return vIEw;}@NonNull private VIEw initVIEw(LayoutInflater inflater, VIEwGroup container) { VIEw vIEw = inflater.inflate(R.layout.fragment_vIEw_pager_my_songs, container, false); ButterKnife.bind(this, vIEw); tab_names = getResources().getStringArray(R.array.tabs_mysongs); mTabnames = Arrays.asList(tab_names); mPagerAdapter = new ScreenSlIDePagerAdapter(getActivity().getSupportFragmentManager()); mPager.setAdapter(mPagerAdapter); mPager.setontouchListener(new VIEw.OntouchListener() { @OverrIDe public boolean ontouch(VIEw v, MotionEvent event) { mPager.ontouchEvent(event); return false; } }); TabLayout tabLayout = (TabLayout) vIEw.findVIEwByID(R.ID.tabs); tabLayout.setupWithVIEwPager(mPager); return vIEw;}private class ScreenSlIDePagerAdapter extends FragmentStatePagerAdapter { public ScreenSlIDePagerAdapter(FragmentManager fm) { super(fm); } @OverrIDe public Fragment getItem(int position) { switch (position) { case 0: return new PlayListsFragment(); case 1: return new SongsFragment(); case 2: return new AlbumsFragment(); case 3: return new ArtistsFragment(); default: return new PlayListsFragment(); } } @OverrIDe public int getCount() { return NUM_PAGES; } @OverrIDe public CharSequence getPageTitle(int position) { return mTabnames.get(position); }}
解决方法:
问题是vIEwpager中的活动上下文
在我的视图中寻呼机.我改变
mPagerAdapter = new ScreenSlIDePagerAdapter(getActivity().getSupportFragmentManager());mPager.setAdapter(mPagerAdapter);
至
mPagerAdapter = new ScreenSlIDePagerAdapter(getChildFragmentManager());mPager.setAdapter(mPagerAdapter);
两个vIEwpager使用相同的上下文.因此,当我第一次膨胀时,另一个没有膨胀,因为解释已经存在一个膨胀的vIEwpager.
感谢mcwise帮助向我展示方法getChildFragmentManager().
总结以上是内存溢出为你收集整理的android – Viewpager不会对已经为另一个视图寻呼机充气的片段进行充气全部内容,希望文章能够帮你解决android – Viewpager不会对已经为另一个视图寻呼机充气的片段进行充气所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)