关于分片交易
Regarding fragment transactions
我将三个片段合二为一 activity 并在 activity 中处理了背压。在 上按 在一个片段中加载 (CallingFragment)
DialerFragment
,因为我在加载 CallingFragement
时将其添加到后台堆栈并提供 logs。请告诉我为什么会这样?
正在加载调用片段:
void launchCallingFrag(String number, String name ,long time , boolean isongoing,String price )
{
String calleename= name;
if(calleename==null)
calleename=CommonUtility.getContactDisplayNameByNumber(number, context);
callingScreenFragment.setNumber( number,calleename ,time,isongoing , price);
ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.dial_fragment, callingScreenFragment, CALLING_FRAGMENT_TAG);
dialerFragment = (DialerFragment)getSupportFragmentManager().findFragmentByTag(DIALER_FRAGMENT_TAG);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.addToBackStack(DIALER_FRAGMENT_TAG);
ft.commit();
overridePendingTransition(R.anim.animation1, R.anim.animation2);
}
后压:
@Override
public void onBackPressed() {
Log.e("back press called ",""+getSupportFragmentManager().getBackStackEntryCount());
dialerFragment = (DialerFragment)getSupportFragmentManager().findFragmentByTag(DIALER_FRAGMENT_TAG);
if (dialerFragment!=null&&dialerFragment.isVisible()) {
// add your code here
Log.e("dialer fragment","dialer fragment ");
dialerFragment.onBackPress();
}
else {
callingScreenFragment = (CallingScreenFragment) getSupportFragmentManager().findFragmentByTag(CALLING_FRAGMENT_TAG);
if (callingScreenFragment!=null&&callingScreenFragment.isVisible()) {
Log.e("calling fragment", "calling fragment ");
callingScreenFragment.onBackPress(fromNotification);
}
else {
recentDetailFragment = (RecentDetailFragment) getSupportFragmentManager().findFragmentByTag(LOG_DETAILS_FRAGMENT_TAG);
if (recentDetailFragment!=null&&recentDetailFragment.isVisible()) {
Log.e("recent fragment","recent fragment ");
recentDetailFragment.onBackPress();
}
else {
super.onBackPressed();
}
}
}
日志:
02-05 17:17:04.967 10280-10280/com.myapp E/dalvikvm﹕ Could not find class 'android.transition.Transition', referenced from method android.support.v4.app.FragmentTransitionCompat21.addTargets
02-05 17:17:04.967 10280-10280/com.myapp W/dalvikvm﹕ VFY: unable to resolve check-cast 1450 (Landroid/transition/Transition;) in Landroid/support/v4/app/FragmentTransitionCompat21;
02-05 17:17:04.967 10280-10280/com.myapp E/dalvikvm﹕ Could not find class 'android.transition.Transition', referenced from method android.support.v4.app.FragmentTransitionCompat21.addTransitionTargets
02-05 17:17:04.967 10280-10280/com.myapp W/dalvikvm﹕ VFY: unable to resolve check-cast 1450 (Landroid/transition/Transition;) in Landroid/support/v4/app/FragmentTransitionCompat21;
02-05 17:17:04.967 10280-10280/com.myapp E/dalvikvm﹕ Could not find class 'android.transition.Transition', referenced from method android.support.v4.app.FragmentTransitionCompat21.beginDelayedTransition
02-05 17:17:04.967 10280-10280/com.myapp W/dalvikvm﹕ VFY: unable to resolve check-cast 1450 (Landroid/transition/Transition;) in Landroid/support/v4/app/FragmentTransitionCompat21;
02-05 17:17:04.967 10280-10280/com.myapp E/dalvikvm﹕ Could not find class 'android.transition.Transition', referenced from method android.support.v4.app.FragmentTransitionCompat21.captureExitingViews
02-05 17:17:04.967 10280-10280/com.myapp W/dalvikvm﹕ VFY: unable to resolve check-cast 1450 (Landroid/transition/Transition;) in Landroid/support/v4/app/FragmentTransitionCompat21;
02-05 17:17:04.967 10280-10280/com.myapp W/dalvikvm﹕ VFY: unable to resolve virtual method 12194: Landroid/view/ViewGroup;.isTransitionGroup ()Z
02-05 17:17:04.967 10280-10280/com.myapp E/dalvikvm﹕ Could not find class 'android.transition.Transition', referenced from method android.support.v4.app.FragmentTransitionCompat21.cleanupTransitions
02-05 17:17:04.967 10280-10280/com.myapp W/dalvikvm﹕ VFY: unable to resolve check-cast 1450 (Landroid/transition/Transition;) in Landroid/support/v4/app/FragmentTransitionCompat21;
02-05 17:17:04.967 10280-10280/com.myapp E/dalvikvm﹕ Could not find class 'android.transition.Transition', referenced from method android.support.v4.app.FragmentTransitionCompat21.cloneTransition
02-05 17:17:04.967 10280-10280/com.myapp W/dalvikvm﹕ VFY: unable to resolve check-cast 1450 (Landroid/transition/Transition;) in Landroid/support/v4/app/FragmentTransitionCompat21;
02-05 17:17:04.977 10280-10280/com.myapp E/dalvikvm﹕ Could not find class 'android.transition.Transition', referenced from method android.support.v4.app.FragmentTransitionCompat21.excludeTarget
02-05 17:17:04.977 10280-10280/com.myapp W/dalvikvm﹕ VFY: unable to resolve check-cast 1450 (Landroid/transition/Transition;) in Landroid/support/v4/app/FragmentTransitionCompat21;
02-05 17:17:04.977 10280-10280/com.myapp W/dalvikvm﹕ VFY: unable to resolve virtual method 12022: Landroid/view/View;.getTransitionName ()Ljava/lang/String;
02-05 17:17:04.977 10280-10280/com.myapp W/dalvikvm﹕ VFY: unable to resolve virtual method 12022: Landroid/view/View;.getTransitionName ()Ljava/lang/String;
02-05 17:17:04.977 10280-10280/com.myapp E/dalvikvm﹕ Could not find class 'android.transition.Transition', referenced from method android.support.v4.app.FragmentTransitionCompat21.mergeTransitions
02-05 17:17:04.977 10280-10280/com.myapp W/dalvikvm﹕ VFY: unable to resolve check-cast 1450 (Landroid/transition/Transition;) in Landroid/support/v4/app/FragmentTransitionCompat21;
02-05 17:17:04.977 10280-10280/com.myapp E/dalvikvm﹕ Could not find class 'android.transition.Transition', referenced from method android.support.v4.app.FragmentTransitionCompat21.removeTargets
02-05 17:17:04.977 10280-10280/com.myapp W/dalvikvm﹕ VFY: unable to resolve check-cast 1450 (Landroid/transition/Transition;) in Landroid/support/v4/app/FragmentTransitionCompat21;
02-05 17:17:04.977 10280-10280/com.myapp E/dalvikvm﹕ Could not find class 'android.transition.Transition', referenced from method android.support.v4.app.FragmentTransitionCompat21.setEpicenter
02-05 17:17:04.977 10280-10280/com.myapp W/dalvikvm﹕ VFY: unable to resolve check-cast 1450 (Landroid/transition/Transition;) in Landroid/support/v4/app/FragmentTransitionCompat21;
02-05 17:17:04.977 10280-10280/com.myapp W/dalvikvm﹕ VFY: unable to find class referenced in signature (Landroid/transition/Transition;)
02-05 17:17:04.977 10280-10280/com.myapp W/dalvikvm﹕ Unable to resolve superclass of Landroid/support/v4/app/FragmentTransitionCompat21; (1449)
02-05 17:17:04.977 10280-10280/com.myapp W/dalvikvm﹕ Link of class 'Landroid/support/v4/app/FragmentTransitionCompat21;' failed
02-05 17:17:04.977 10280-10280/com.myapp E/dalvikvm﹕ Could not find class 'android.support.v4.app.FragmentTransitionCompat21', referenced from method android.support.v4.app.FragmentTransitionCompat21.setSharedElementEpicenter
02-05 17:17:04.977 10280-10280/com.myapp W/dalvikvm﹕ VFY: unable to resolve new-instance 422 (Landroid/support/v4/app/FragmentTransitionCompat21;) in Landroid/support/v4/app/FragmentTransitionCompat21;
02-05 17:17:04.987 10280-10280/com.myapp W/dalvikvm﹕ Unable to resolve superclass of Landroid/support/v4/app/FragmentTransitionCompat21; (1449)
02-05 17:17:04.987 10280-10280/com.myapp W/dalvikvm﹕ Link of class 'Landroid/support/v4/app/FragmentTransitionCompat21;' failed
02-05 17:17:04.987 10280-10280/com.myapp W/dalvikvm﹕ Unable to resolve superclass of Landroid/support/v4/app/FragmentTransitionCompat21; (1449)
02-05 17:17:04.987 10280-10280/com.myapp W/dalvikvm﹕ Link of class 'Landroid/support/v4/app/FragmentTransitionCompat21;' failed
不幸的是,这是由于 android.support.v4
库中的错误尚未解决(截至本回答之日)。
本质上,支持库使用 API 级别 19 和 21 APIs,即使 运行 在 API 级别不够高的设备上也是如此。这是一个非常严重(甚至令人震惊)的错误,因为 Android 支持库的全部目的是使应用程序免受 API 级别差异的影响!
在你的情况下,你显然 运行 在 API 级别低于 19 的设备上,这是引入整个 android.transition 包的时间。
相关的 Android 问题是:77670 and 89244。您可能想访问这些问题并给它们加注星标,and/or 添加一个新问题。
我将三个片段合二为一 activity 并在 activity 中处理了背压。在 上按 在一个片段中加载 (CallingFragment)
DialerFragment
,因为我在加载 CallingFragement
时将其添加到后台堆栈并提供 logs。请告诉我为什么会这样?
正在加载调用片段:
void launchCallingFrag(String number, String name ,long time , boolean isongoing,String price )
{
String calleename= name;
if(calleename==null)
calleename=CommonUtility.getContactDisplayNameByNumber(number, context);
callingScreenFragment.setNumber( number,calleename ,time,isongoing , price);
ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.dial_fragment, callingScreenFragment, CALLING_FRAGMENT_TAG);
dialerFragment = (DialerFragment)getSupportFragmentManager().findFragmentByTag(DIALER_FRAGMENT_TAG);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.addToBackStack(DIALER_FRAGMENT_TAG);
ft.commit();
overridePendingTransition(R.anim.animation1, R.anim.animation2);
}
后压:
@Override
public void onBackPressed() {
Log.e("back press called ",""+getSupportFragmentManager().getBackStackEntryCount());
dialerFragment = (DialerFragment)getSupportFragmentManager().findFragmentByTag(DIALER_FRAGMENT_TAG);
if (dialerFragment!=null&&dialerFragment.isVisible()) {
// add your code here
Log.e("dialer fragment","dialer fragment ");
dialerFragment.onBackPress();
}
else {
callingScreenFragment = (CallingScreenFragment) getSupportFragmentManager().findFragmentByTag(CALLING_FRAGMENT_TAG);
if (callingScreenFragment!=null&&callingScreenFragment.isVisible()) {
Log.e("calling fragment", "calling fragment ");
callingScreenFragment.onBackPress(fromNotification);
}
else {
recentDetailFragment = (RecentDetailFragment) getSupportFragmentManager().findFragmentByTag(LOG_DETAILS_FRAGMENT_TAG);
if (recentDetailFragment!=null&&recentDetailFragment.isVisible()) {
Log.e("recent fragment","recent fragment ");
recentDetailFragment.onBackPress();
}
else {
super.onBackPressed();
}
}
}
日志:
02-05 17:17:04.967 10280-10280/com.myapp E/dalvikvm﹕ Could not find class 'android.transition.Transition', referenced from method android.support.v4.app.FragmentTransitionCompat21.addTargets
02-05 17:17:04.967 10280-10280/com.myapp W/dalvikvm﹕ VFY: unable to resolve check-cast 1450 (Landroid/transition/Transition;) in Landroid/support/v4/app/FragmentTransitionCompat21;
02-05 17:17:04.967 10280-10280/com.myapp E/dalvikvm﹕ Could not find class 'android.transition.Transition', referenced from method android.support.v4.app.FragmentTransitionCompat21.addTransitionTargets
02-05 17:17:04.967 10280-10280/com.myapp W/dalvikvm﹕ VFY: unable to resolve check-cast 1450 (Landroid/transition/Transition;) in Landroid/support/v4/app/FragmentTransitionCompat21;
02-05 17:17:04.967 10280-10280/com.myapp E/dalvikvm﹕ Could not find class 'android.transition.Transition', referenced from method android.support.v4.app.FragmentTransitionCompat21.beginDelayedTransition
02-05 17:17:04.967 10280-10280/com.myapp W/dalvikvm﹕ VFY: unable to resolve check-cast 1450 (Landroid/transition/Transition;) in Landroid/support/v4/app/FragmentTransitionCompat21;
02-05 17:17:04.967 10280-10280/com.myapp E/dalvikvm﹕ Could not find class 'android.transition.Transition', referenced from method android.support.v4.app.FragmentTransitionCompat21.captureExitingViews
02-05 17:17:04.967 10280-10280/com.myapp W/dalvikvm﹕ VFY: unable to resolve check-cast 1450 (Landroid/transition/Transition;) in Landroid/support/v4/app/FragmentTransitionCompat21;
02-05 17:17:04.967 10280-10280/com.myapp W/dalvikvm﹕ VFY: unable to resolve virtual method 12194: Landroid/view/ViewGroup;.isTransitionGroup ()Z
02-05 17:17:04.967 10280-10280/com.myapp E/dalvikvm﹕ Could not find class 'android.transition.Transition', referenced from method android.support.v4.app.FragmentTransitionCompat21.cleanupTransitions
02-05 17:17:04.967 10280-10280/com.myapp W/dalvikvm﹕ VFY: unable to resolve check-cast 1450 (Landroid/transition/Transition;) in Landroid/support/v4/app/FragmentTransitionCompat21;
02-05 17:17:04.967 10280-10280/com.myapp E/dalvikvm﹕ Could not find class 'android.transition.Transition', referenced from method android.support.v4.app.FragmentTransitionCompat21.cloneTransition
02-05 17:17:04.967 10280-10280/com.myapp W/dalvikvm﹕ VFY: unable to resolve check-cast 1450 (Landroid/transition/Transition;) in Landroid/support/v4/app/FragmentTransitionCompat21;
02-05 17:17:04.977 10280-10280/com.myapp E/dalvikvm﹕ Could not find class 'android.transition.Transition', referenced from method android.support.v4.app.FragmentTransitionCompat21.excludeTarget
02-05 17:17:04.977 10280-10280/com.myapp W/dalvikvm﹕ VFY: unable to resolve check-cast 1450 (Landroid/transition/Transition;) in Landroid/support/v4/app/FragmentTransitionCompat21;
02-05 17:17:04.977 10280-10280/com.myapp W/dalvikvm﹕ VFY: unable to resolve virtual method 12022: Landroid/view/View;.getTransitionName ()Ljava/lang/String;
02-05 17:17:04.977 10280-10280/com.myapp W/dalvikvm﹕ VFY: unable to resolve virtual method 12022: Landroid/view/View;.getTransitionName ()Ljava/lang/String;
02-05 17:17:04.977 10280-10280/com.myapp E/dalvikvm﹕ Could not find class 'android.transition.Transition', referenced from method android.support.v4.app.FragmentTransitionCompat21.mergeTransitions
02-05 17:17:04.977 10280-10280/com.myapp W/dalvikvm﹕ VFY: unable to resolve check-cast 1450 (Landroid/transition/Transition;) in Landroid/support/v4/app/FragmentTransitionCompat21;
02-05 17:17:04.977 10280-10280/com.myapp E/dalvikvm﹕ Could not find class 'android.transition.Transition', referenced from method android.support.v4.app.FragmentTransitionCompat21.removeTargets
02-05 17:17:04.977 10280-10280/com.myapp W/dalvikvm﹕ VFY: unable to resolve check-cast 1450 (Landroid/transition/Transition;) in Landroid/support/v4/app/FragmentTransitionCompat21;
02-05 17:17:04.977 10280-10280/com.myapp E/dalvikvm﹕ Could not find class 'android.transition.Transition', referenced from method android.support.v4.app.FragmentTransitionCompat21.setEpicenter
02-05 17:17:04.977 10280-10280/com.myapp W/dalvikvm﹕ VFY: unable to resolve check-cast 1450 (Landroid/transition/Transition;) in Landroid/support/v4/app/FragmentTransitionCompat21;
02-05 17:17:04.977 10280-10280/com.myapp W/dalvikvm﹕ VFY: unable to find class referenced in signature (Landroid/transition/Transition;)
02-05 17:17:04.977 10280-10280/com.myapp W/dalvikvm﹕ Unable to resolve superclass of Landroid/support/v4/app/FragmentTransitionCompat21; (1449)
02-05 17:17:04.977 10280-10280/com.myapp W/dalvikvm﹕ Link of class 'Landroid/support/v4/app/FragmentTransitionCompat21;' failed
02-05 17:17:04.977 10280-10280/com.myapp E/dalvikvm﹕ Could not find class 'android.support.v4.app.FragmentTransitionCompat21', referenced from method android.support.v4.app.FragmentTransitionCompat21.setSharedElementEpicenter
02-05 17:17:04.977 10280-10280/com.myapp W/dalvikvm﹕ VFY: unable to resolve new-instance 422 (Landroid/support/v4/app/FragmentTransitionCompat21;) in Landroid/support/v4/app/FragmentTransitionCompat21;
02-05 17:17:04.987 10280-10280/com.myapp W/dalvikvm﹕ Unable to resolve superclass of Landroid/support/v4/app/FragmentTransitionCompat21; (1449)
02-05 17:17:04.987 10280-10280/com.myapp W/dalvikvm﹕ Link of class 'Landroid/support/v4/app/FragmentTransitionCompat21;' failed
02-05 17:17:04.987 10280-10280/com.myapp W/dalvikvm﹕ Unable to resolve superclass of Landroid/support/v4/app/FragmentTransitionCompat21; (1449)
02-05 17:17:04.987 10280-10280/com.myapp W/dalvikvm﹕ Link of class 'Landroid/support/v4/app/FragmentTransitionCompat21;' failed
不幸的是,这是由于 android.support.v4
库中的错误尚未解决(截至本回答之日)。
本质上,支持库使用 API 级别 19 和 21 APIs,即使 运行 在 API 级别不够高的设备上也是如此。这是一个非常严重(甚至令人震惊)的错误,因为 Android 支持库的全部目的是使应用程序免受 API 级别差异的影响!
在你的情况下,你显然 运行 在 API 级别低于 19 的设备上,这是引入整个 android.transition 包的时间。
相关的 Android 问题是:77670 and 89244。您可能想访问这些问题并给它们加注星标,and/or 添加一个新问题。