@@@@@@@@@@@@@@@@@@@@@@@@@@@
แก้ไข: ฉันลงเอยด้วยการยกเลิกการใช้โซลูชันนี้เนื่องจากมีปัญหาอื่น ๆ ที่เกิดขึ้น Square เพิ่งออกมาพร้อมกับ 2 ไลบรารีที่มาแทนที่แฟรกเมนต์ ฉันจะบอกว่านี่อาจเป็นทางเลือกที่ดีกว่าการพยายามแฮ็กชิ้นส่วนเพื่อทำบางสิ่งที่ Google ไม่ต้องการให้ทำ
http://corner.squareup.com/2014/01/mortar-and-flow.html
@@@@@@@@@@@@@@@@@@@@@@@@@@@
ฉันคิดว่าฉันจะวางแนวทางแก้ปัญหานี้เพื่อช่วยเหลือผู้ที่มีปัญหานี้ในอนาคต หากคุณติดตามการสนทนาของผู้โพสต์ต้นฉบับกับผู้อื่นและดูรหัสที่เขาโพสต์คุณจะเห็นว่าในที่สุดผู้โพสต์ต้นฉบับก็ได้ข้อสรุปของการใช้แอนิเมชั่นที่ไม่ต้องใช้กับชิ้นส่วนย่อยในขณะที่ทำให้ชิ้นส่วนหลักเคลื่อนไหว โซลูชันนี้ไม่เหมาะอย่างยิ่งเนื่องจากบังคับให้คุณติดตามชิ้นส่วนย่อยทั้งหมดซึ่งอาจเป็นเรื่องยุ่งยากเมื่อใช้ ViewPager กับ FragmentPagerAdapter
เนื่องจากฉันใช้ Child Fragments ทั่วทุกที่ฉันจึงได้พบกับโซลูชันนี้ที่มีประสิทธิภาพและเป็นโมดูลาร์ (ดังนั้นจึงสามารถลบออกได้อย่างง่ายดาย) ในกรณีที่พวกเขาเคยแก้ไขมันและไม่จำเป็นต้องใช้แอนิเมชั่นที่ไม่ต้องใช้อีกต่อไป
มีหลายวิธีที่คุณสามารถนำไปใช้ได้ ฉันเลือกที่จะใช้ซิงเกิลตันและฉันเรียกมันว่า ChildFragmentAnimationManager โดยพื้นฐานแล้วมันจะติดตามชิ้นส่วนเด็กสำหรับฉันโดยอิงจากผู้ปกครองและจะใช้แอนิเมชั่นที่ไม่ต้องใช้กับเด็กเมื่อถูกถาม
public class ChildFragmentAnimationManager {
private static ChildFragmentAnimationManager instance = null;
private Map<Fragment, List<Fragment>> fragmentMap;
private ChildFragmentAnimationManager() {
fragmentMap = new HashMap<Fragment, List<Fragment>>();
}
public static ChildFragmentAnimationManager instance() {
if (instance == null) {
instance = new ChildFragmentAnimationManager();
}
return instance;
}
public FragmentTransaction animate(FragmentTransaction ft, Fragment parent) {
List<Fragment> children = getChildren(parent);
ft.setCustomAnimations(R.anim.no_anim, R.anim.no_anim, R.anim.no_anim, R.anim.no_anim);
for (Fragment child : children) {
ft.remove(child);
}
return ft;
}
public void putChild(Fragment parent, Fragment child) {
List<Fragment> children = getChildren(parent);
children.add(child);
}
public void removeChild(Fragment parent, Fragment child) {
List<Fragment> children = getChildren(parent);
children.remove(child);
}
private List<Fragment> getChildren(Fragment parent) {
List<Fragment> children;
if ( fragmentMap.containsKey(parent) ) {
children = fragmentMap.get(parent);
} else {
children = new ArrayList<Fragment>(3);
fragmentMap.put(parent, children);
}
return children;
}
}
ถัดไปคุณต้องมีคลาสที่ขยาย Fragment ซึ่ง Fragment ทั้งหมดของคุณจะขยายออกไป (อย่างน้อย Child Fragments ของคุณ) ฉันมีคลาสนี้อยู่แล้วและฉันเรียกมันว่า BaseFragment เมื่อสร้างมุมมองแฟรกเมนต์เราจะเพิ่มเข้าใน ChildFragmentAnimationManager และลบออกเมื่อถูกทำลาย คุณสามารถทำได้ onAttach / Detach หรือวิธีการจับคู่อื่น ๆ ในลำดับ เหตุผลของฉันในการเลือก Create / Destroy View เป็นเพราะถ้า Fragment ไม่มี View ฉันไม่สนใจที่จะสร้างภาพเคลื่อนไหวเพื่อให้เห็นต่อไป วิธีนี้ควรทำงานได้ดีขึ้นกับ ViewPagers ที่ใช้ Fragments เนื่องจากคุณจะไม่ติดตามทุก Fragment ที่ FragmentPagerAdapter ถืออยู่ แต่จะมีเพียง 3 เท่านั้น
public abstract class BaseFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Fragment parent = getParentFragment();
if (parent != null) {
ChildFragmentAnimationManager.instance().putChild(parent, this);
}
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public void onDestroyView() {
Fragment parent = getParentFragment();
if (parent != null) {
ChildFragmentAnimationManager.instance().removeChild(parent, this);
}
super.onDestroyView();
}
}
ตอนนี้ Fragment ทั้งหมดของคุณถูกเก็บไว้ในหน่วยความจำโดยแฟรกเมนต์พาเรนต์คุณสามารถเรียกใช้แอนิเมชั่นได้แบบนี้และแฟรกเมนต์ลูกของคุณจะไม่หายไป
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ChildFragmentAnimationManager.instance().animate(ft, ReaderFragment.this)
.setCustomAnimations(R.anim.up_in, R.anim.up_out, R.anim.down_in, R.anim.down_out)
.replace(R.id.container, f)
.addToBackStack(null)
.commit();
นอกจากนี้คุณก็มีแล้วนี่คือไฟล์ no_anim.xml ที่อยู่ในโฟลเดอร์ res / anim ของคุณ:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/linear_interpolator">
<translate android:fromXDelta="0" android:toXDelta="0"
android:duration="1000" />
</set>
อีกครั้งฉันไม่คิดว่าโซลูชันนี้จะสมบูรณ์แบบ แต่มันดีกว่าทุกอินสแตนซ์ที่คุณมี Child Fragment โดยใช้โค้ดที่กำหนดเองในส่วนหลักเพื่อติดตามเด็กแต่ละคน ฉันเคยไปที่นั่นแล้วมันไม่สนุกเลย
R.id.fragmentHolder
ที่เกี่ยวกับ A, A1, A2, etc?