@Override public Object instantiateItem(ViewGroup container, int position) { Fragment fragment; // If we already have this item instantiated, there is nothing // to do. This can happen when we are restoring the entire pager // from its saved state, where the fragment manager has already // taken care of restoring the fragments we previously had instantiated. fragment = mFragments.get(position); if (fragment != null) { return fragment; } if (mCurTransaction == null) { mCurTransaction = mFragmentManager.beginTransaction(); } FragmentState fs = mFragmentStates.get(position); if (fs != null) { FragmentManager fragmentManager = getFragmentActivity().getSupportFragmentManager(); if (getParentFragment() != null) { fragmentManager = getParentFragment().getChildFragmentManager(); } // Fix Can't change tag of fragment Error // http://stackoverflow.com/questions/24355838/cant-change-tag-of-fragment-error-trying-to-use-a-pageradapter-for-switching if ((fs.mTag != null && fs.mTag.equals(mFragmentTags.get(position))) || (fs.mTag == null && mFragmentTags.get(position) == null)) { fragment = fs.instantiate( FragmentUtils.getFragmentHostCallback(fragmentManager), getParentFragment(), FragmentUtils.getFragmentManagerNonConfig(fragmentManager)); // Fix bug // http://stackoverflow.com/questions/11381470/classnotfoundexception-when-unmarshalling-android-support-v4-view-viewpagersav if (fragment.mSavedFragmentState != null) { fragment.mSavedFragmentState.setClassLoader(fragment.getClass().getClassLoader()); } } else { Log.e( TAG, String.format( "Fragment tag isn't equal! Origin: %s %s", fs.mTag, mFragmentTags.get(position))); mFragmentStates.set(position, null); } } if (fragment == null) { fragment = Fragment.instantiate( getFragmentActivity(), mFragmentClassNames.get(position), mFragmentArgs.get(position)); } if (DEBUG) { Log.v(TAG, "Adding item #" + position + ": f=" + fragment); } fragment.setMenuVisibility(false); fragment.setUserVisibleHint(false); mFragments.set(position, fragment); mFragmentStates.set(position, null); mCurTransaction.add(container.getId(), fragment, mFragmentTags.get(position)); return fragment; }
@Test public void testTraversal_Chain() { IChemObjectBuilder builder = SilentChemObjectBuilder.getInstance(); IAtom[] atoms = new IAtom[] { builder.newInstance(IAtom.class, "C"), builder.newInstance(IAtom.class, "C"), builder.newInstance(IAtom.class, "C"), builder.newInstance(IAtom.class, "C"), builder.newInstance(IAtom.class, "C"), builder.newInstance(IAtom.class, "C") }; IBond[] bonds = new IBond[] { builder.newInstance(IBond.class, atoms[0], atoms[1]), builder.newInstance(IBond.class, atoms[1], atoms[2]), builder.newInstance(IBond.class, atoms[2], atoms[3]), builder.newInstance(IBond.class, atoms[3], atoms[4]), builder.newInstance(IBond.class, atoms[4], atoms[5]) }; IAtomContainer m = builder.newInstance(IAtomContainer.class, 0, 0, 0, 0); m.setAtoms(atoms); m.setBonds(bonds); List<IBond> accumulator = new ArrayList<IBond>(); // traverse from one end FragmentUtils.traverse(m, atoms[0], accumulator); assertThat(accumulator.size(), is(5)); assertThat(accumulator.get(0), is(bonds[0])); assertThat(accumulator.get(1), is(bonds[1])); assertThat(accumulator.get(2), is(bonds[2])); assertThat(accumulator.get(3), is(bonds[3])); assertThat(accumulator.get(4), is(bonds[4])); // traverse from the middle accumulator.clear(); FragmentUtils.traverse(m, atoms[3], accumulator); assertThat(accumulator.size(), is(5)); assertThat(accumulator.get(0), is(bonds[2])); assertThat(accumulator.get(1), is(bonds[1])); assertThat(accumulator.get(2), is(bonds[0])); assertThat(accumulator.get(3), is(bonds[3])); assertThat(accumulator.get(4), is(bonds[4])); }
@Test public void testMakeAtomContainer() { IChemObjectBuilder builder = SilentChemObjectBuilder.getInstance(); IAtom atom = builder.newInstance(IAtom.class, "C"); IAtom exclude = builder.newInstance(IAtom.class, "C"); IAtom a1 = builder.newInstance(IAtom.class, "C"); IAtom a2 = builder.newInstance(IAtom.class, "C"); IBond[] bonds = new IBond[] { builder.newInstance(IBond.class, atom, exclude), builder.newInstance(IBond.class, a1, a2), builder.newInstance(IBond.class, a1, atom), builder.newInstance(IBond.class, a2, exclude) }; IAtomContainer part = FragmentUtils.makeAtomContainer(atom, Arrays.asList(bonds), exclude); assertThat(part.getAtomCount(), is(3)); assertThat(part.getBondCount(), is(2)); Assert.assertTrue(part.contains(atom)); Assert.assertTrue(part.contains(a1)); Assert.assertTrue(part.contains(a2)); Assert.assertFalse(part.contains(exclude)); Assert.assertTrue(part.contains(bonds[1])); Assert.assertTrue(part.contains(bonds[2])); }
@Override public void finishUpdate(ViewGroup container) { if (mCurTransaction != null) { mCurTransaction.commitAllowingStateLoss(); mCurTransaction = null; mFragmentManager.executePendingTransactions(); for (Fragment fragment : mFragments) { if (fragment != null) { /* if (fragment.isAdded() && !fragment.isResumed()) { // Fix sdk 23.0.1 : Fragment isAdded, but didn't resumed. if (FragmentUtils.isStateLoss(fragment.getFragmentManager())) { continue; } // Test move to fixActiveFragment(mFragmentManager, fragment); // fragment.getFragmentManager().beginTransaction().detach(fragment).attach(fragment).commit(); } */ if (FragmentUtils.isStateLoss(fragment.getFragmentManager())) { continue; } // Fix sdk 22.0.1 : Fragment is added by transaction. BUT didn't add to FragmentManager's // mActive. If you Rotation. fixActiveFragment(mFragmentManager, fragment); } } } }
public static void fixActiveFragment(FragmentManager fragmentManager, Fragment fragment) { FragmentManagerImpl fm = (FragmentManagerImpl) fragmentManager; boolean needMatch = false; Fragment willRemoveFrag = null; if (fm.mActive != null) { int index = fragment.mIndex; if (index < 0) { Log.e(TAG, String.format("Fragment mIndex %s < 0 ! Origin: %s", fragment.mIndex, fragment)); fragment.getFragmentManager().beginTransaction().remove(fragment).commit(); return; } Fragment origin = fm.mActive.get(index); if (origin != null) { if ((origin.mIndex != fragment.mIndex) || !(origin.equals(fragment))) { Log.e( TAG, String.format( "Fragment isn't equal! Origin: %s %s, Fragment: %s %s", origin.toString(), origin.mIndex, fragment.toString(), fragment.mIndex)); ArrayList<Integer> indexArray = new ArrayList<>(); for (Fragment f : fm.mAdded) { if (indexArray.contains(f.mIndex)) { willRemoveFrag = origin; break; } indexArray.add(f.mIndex); } } } fm.mActive.set(index, fragment); if (willRemoveFrag != null) { // 2016.01.26 Fix bug mAdded not match // 瀏覽所有Fragment後,轉至後瀏覽其他Fragment會產生衝突 fm.mAdded.remove(willRemoveFrag); } // 如往回跳的話會發現沒有執行 // 1~5 is Fragment // 1 2 3 4 5 -> 3 // 1 2 3 -> 1 // v25.0.0 Fix fragment didn't run, if through step 1, 2, 3 then go back to 1, step 1 fragment // didn't run if (fragment.getUserVisibleHint() && !fragment.isResumed()) { if (!FragmentUtils.isStateLoss(fragment.getFragmentManager())) { fragment .getFragmentManager() .beginTransaction() .detach(fragment) .attach(fragment) .commit(); } } } }
@Test public void testSplit() throws CDKException { IAtomContainer mol = smilesParser.parseSmiles("C1CC1C2CCC2"); SpanningTree st = new SpanningTree(mol); IRingSet rings = st.getAllRings(); IBond splitBond = null; for (int i = 0; i < mol.getBondCount(); i++) { if (rings.getRings(mol.getBond(i)).getAtomContainerCount() == 0) { splitBond = mol.getBond(i); break; } } List<IAtomContainer> frags = FragmentUtils.splitMolecule(mol, splitBond); SmilesGenerator sg = new SmilesGenerator(); Set<String> uniqueFrags = new HashSet<String>(); for (IAtomContainer frag : frags) { uniqueFrags.add(sg.createSMILES(frag)); } Assert.assertEquals(2, uniqueFrags.size()); // You can put the fragments back together with a ring closure and dot // [CH]12CC1.[CH]12CCC1 Assert.assertThat(uniqueFrags, hasItems("[CH]1CC1", "[CH]1CCC1")); }
@Override public void onAttach(Activity activity) { super.onAttach(activity); mListener = FragmentUtils.tryActivityCast(getActivity(), SettingsFragmentListener.class, false); }