@@@@@@@@@@@@@@@@@@@@@@@@@@@@
編集:これには他にも問題があったため、このソリューションを実装しないことになりました。Squareは最近、フラグメントを置き換える2つのライブラリを発表しました。これは実際にはフラグメントをハックしてグーグルが望まないことをするよりも良い代替手段かもしれないと思います。
http://corner.squareup.com/2014/01/mortar-and-flow.html
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
私は、この問題を将来抱える人々を助けるためにこの解決策を立てると思いました。他の人とのオリジナルのポスターの会話をたどって、彼が投稿したコードを見ると、最終的に、オリジナルのポスターが親フラグメントをアニメーション化しながら子フラグメントで何もしないアニメーションを使用するという結論に達していることがわかります。このソリューションは、すべての子フラグメントを追跡する必要があるため、理想的ではありません。これは、ViewPagerをFragmentPagerAdapterと共に使用する場合に面倒になる可能性があります。
私は至る所で子フラグメントを使用しているので、効率的でモジュール式(簡単に削除できる)のこのソリューションを思いついたので、彼らがそれを修正してこのノーオペレーションアニメーションが不要になった場合に備えます。
これを実装する方法はたくさんあります。シングルトンの使用を選択し、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;
}
}
次に、すべてのフラグメントが拡張するフラグメント(少なくとも子フラグメント)を拡張するクラスが必要です。私はすでにこのクラスを持っていて、それをBaseFragmentと呼んでいます。フラグメントビューが作成されたら、ChildFragmentAnimationManagerに追加し、破棄されたら削除します。これは、onAttach / Detach、またはシーケンス内の他のマッチング方法で行うことができます。Create / Destroy Viewを選択するための私のロジックは、フラグメントにビューがない場合、表示され続けるためにアニメーション化する必要がないためです。このアプローチは、FragmentPagerAdapterが保持しているすべてのFragmentを追跡するのではなく、3のみを追跡するため、Fragmentsを使用するViewPagersでより適切に機能するはずです。
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();
}
}
すべてのフラグメントが親フラグメントによってメモリに保存されたので、このようにそれらのアニメーションを呼び出すことができ、子フラグメントは消えません。
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();
また、あなたがそれを持っているので、これがres / animフォルダーに入るno_anim.xmlファイルです:
<?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>
繰り返しますが、このソリューションは完璧だとは思いませんが、子フラグメントがあるすべてのインスタンスよりもはるかに優れており、親フラグメントにカスタムコードを実装して各子を追跡できます。私はそこに行ったことがあり、それは面白くない。
R.id.fragmentHolder
A、A1、A2などに関しては何ですか?