【问题标题】:android fragment backpressandroid片段回压
【发布时间】:2015-02-05 07:02:19
【问题描述】:

我有 4 个片段,即 A B C D。 现在,当我从 A 到 B 时,我将 A 添加到后堆栈。 比我从 B 移动到 C 而不添加回堆栈。 比我从 C 移动到 D 而不添加到后台堆栈。 现在在后台我被重定向到 A。

我再次重复直到 D,现在当我回按时,它显示片段 A 并再次将我重定向到片段 D,再次按回按时,它退出应用程序。

我希望它像 D 的背压它应该总是让我到 A

谁能帮忙?

这里是代码 https://drive.google.com/folderview?id=0Bwt5u0ivqfvPSmxNN0V4YkNKa1U&usp=sharing

我在 logcat 中得到这个

02-06 13:31:19.395 26930-26930/com.example.user.fragmentbackstackexample I/dalvikvm﹕找不到方法 android.view.ViewGroup.isTransitionGroup,引用自方法 android.support.v4.app.FragmentTransitionCompat21.captureTransitioningViews

02-06 13:31:19.395 26930-26930/com.example.user.fragmentbackstackexample W/dalvikvm: VFY: 无法解析虚拟方法 11340: Landroid/view/ViewGroup;.isTransitionGroup ()Z

02-06 13:31:19.395 26930-26930/com.example.user.fragmentbackstackexample I/dalvikvm﹕找不到方法 android.view.View.getTransitionName,引用自方法 android.support.v4.app.FragmentTransitionCompat21 .findNamedViews

02-06 13:31:19.395 26930-26930/com.example.user.fragmentbackstackexample W/dalvikvm: VFY: 无法解析虚拟方法 11182: Landroid/view/View;.getTransitionName ()Ljava/lang/String ;

02-06 13:31:19.405 26930-26930/com.example.user.fragmentbackstackexample I/dalvikvm﹕找不到方法 android.view.View.getTransitionName,引用自方法 android.support.v4.app.FragmentTransitionCompat21 .getTransitionName

02-06 13:31:19.405 26930-26930/com.example.user.fragmentbackstackexample W/dalvikvm: VFY: 无法解析虚拟方法 11182: Landroid/view/View;.getTransitionName ()Ljava/lang/String ;

02-06 13:31:19.415 26930-26930/com.example.user.fragmentbackstackexample W/dalvikvm:无法解析 Landroid/support/v4/app/FragmentTransitionCompat21$1 的超类; (1303)

02-06 13:31:19.415 26930-26930/com.example.user.fragmentbackstackexample W/dalvikvm:链接的类 'Landroid/support/v4/app/FragmentTransitionCompat21$1;'失败

02-06 13:31:19.415 26930-26930/com.example.user.fragmentbackstackexample E/dalvikvm﹕找不到类'android.support.v4.app.FragmentTransitionCompat21$1',从方法中引用 android.support.v4.app.FragmentTransitionCompat21.setEpicenter

02-06 13:31:19.425 26930-26930/com.example.user.fragmentbackstackexample W/dalvikvm: VFY: 无法解析新实例 294 (Landroid/support/v4/app/FragmentTransitionCompat21$1;) 在 Landroid/support/v4/app/FragmentTransitionCompat21;

02-06 13:31:19.425 26930-26930/com.example.user.fragmentbackstackexample W/dalvikvm:无法解析 Landroid/support/v4/app/FragmentTransitionCompat21$3 的超类; (1303)

02-06 13:31:19.425 26930-26930/com.example.user.fragmentbackstackexample W/dalvikvm:链接类 'Landroid/support/v4/app/FragmentTransitionCompat21$3;'失败

02-06 13:31:19.435 26930-26930/com.example.user.fragmentbackstackexample E/dalvikvm﹕找不到类 'android.support.v4.app.FragmentTransitionCompat21$3',从方法 android.support 引用。 v4.app.FragmentTransitionCompat21.setSharedElementEpicenter

02-06 13:31:19.435 26930-26930/com.example.user.fragmentbackstackexample W/dalvikvm: VFY: 无法在 Landroid 中解析新实例 296 (Landroid/support/v4/app/FragmentTransitionCompat21$3;) /support/v4/app/FragmentTransitionCompat21;

02-06 13:31:19.435 26930-26930/com.example.user.fragmentbackstackexample W/dalvikvm:无法解析 Landroid/support/v4/app/FragmentTransitionCompat21$1 的超类; (1303)

02-06 13:31:19.435 26930-26930/com.example.user.fragmentbackstackexample W/dalvikvm:链接类 'Landroid/support/v4/app/FragmentTransitionCompat21$1;'失败

02-06 13:31:19.445 26930-26930/com.example.user.fragmentbackstackexample W/dalvikvm:无法解析 Landroid/support/v4/app/FragmentTransitionCompat21$3 的超类; (1303)

02-06 13:31:19.445 26930-26930/com.example.user.fragmentbackstackexample W/dalvikvm:链接类 'Landroid/support/v4/app/FragmentTransitionCompat21$3;'失败

【问题讨论】:

  • 不看代码很难说...
  • @KirillVolkov 请查看代码
  • 这只是提供您的整个源代码。请在此处粘贴相关位,

标签: android android-fragments


【解决方案1】:

这样做.. 对于片段 A 执行此操作..

getSupportFragmentManager().beginTransaction()
                .add(R.id.containerMain, new FragmentA()).addToBackStack("BACKSTACK_FRAGMENT_A")
                .commit();

对于其他 Fragment,请不要使用 addToBackStack(..)

现在,当您从其他片段返回时,您将始终返回片段 A。

更新:

在您的 MainActivity.java 中执行此操作..

getSupportFragmentManager().beginTransaction().add(android.R.id.content,new FragmentA()).addToBackStack("BACKSTACK_FRAGMENT_A").commit();

并在您的 FragmentA.java 中执行此操作..

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    ((Button) mView.findViewById(R.id.buttonA)).setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            setFragment(new FragmentB());
        }
    });
}

最终更新:

实现愿望的最简单方法..

在您的 MainActivity.java 中执行此操作..

public String TAG = "";

@Override
public void onBackPressed() {
    if (TAG.equals("FragmentD")) {
        getSupportFragmentManager().beginTransaction().add(R.id.container, new FragmentA()).commit();
    }else{
        super.onBackPressed();
    }
}

并且在每个片段中都这样做..

MainActivity mainActivity;

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    mainActivity = (MainActivity) activity;
    mainActivity.TAG = getClass().getSimpleName();
}

希望对您有所帮助。谢谢!! ;D

【讨论】:

  • 我只是这样做了...查看代码 drive.google.com/…>
  • 如果只将Fragment A添加到backstack,则只能恢复到Fragment A。
  • 这毕竟是你想要的! “我希望它就像在 D 的背压上它应该总是让我到达 A”
【解决方案2】:

只需从您的代码中删除 super.onBackPressed();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 2012-10-31
    • 2012-09-13
    相关资源
    最近更新 更多