按返回键时Fragment显示空白屏幕

9
我在我的应用程序中使用了Fragments。因此,在主页上,我有一个包含5个项的网格视图,在选择其中一个后,我又打开了一个新的Fragment。
问题是,当我按下返回键时,屏幕会显示一个空白页面,然后应用程序会关闭。
请建议我在哪里出错了。 我的代码
gridView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> arg0, View v, int arg2,
                    long arg3) {
                if (DASHBOARD_LINKS[arg2].equals("A")) {
                    fragTran.replace(R.id.content_frame,
                                firstFrag);
                        fragTran.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                        fragTran.addToBackStack(null);
                        fragTran.commit();

                }
                if (DASHBOARD_LINKS[arg2].equals("B")) {
                    fragTran.replace(R.id.content_frame, secondFrag);
                    fragTran.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                    fragTran.addToBackStack(null);
                    fragTran.commit();
                }
                if (DASHBOARD_LINKS[arg2].equals("C")) {
                    fragTran.replace(R.id.content_frame, thirdFarg);
                    fragTran.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                    fragTran.addToBackStack(null);
                    fragTran.commit();
                }
            }
        });

请帮助我,出现了这个问题。


这是因为您在fragTran.addToBackStack(null);方法中添加的仅仅是null - Spring Breaker
那么我该怎么做呢?你能给我一些建议吗? - Pooja Dubey
我对这个不是很清楚,但是 fragTran.addToBackStack("Tag"); 对我有用。 - Spring Breaker
只是一个用于标识“Fragment”的字符串。我对此还不是完全清楚,请阅读文档以获得明确的理解。 - Spring Breaker
查看此链接:http://stackoverflow.com/questions/32132623/onback-pressed-data-not-showing-in-fragments - Aditya Vyas-Lakhan
7个回答

17

我的建议是,在片段调用中添加 addToBackStack(null)

但是,从主页中删除此行 addToBackStack(null),在 onbackpress 后你会看到一个空白屏幕,希望这对你有所帮助。


9
尽管这是首选答案,但我不理解你试图表达什么意思。 - Virtu
1
谢谢,我知道这个问题已经被问了一年。但是对于第一个转换删除addToBackStack(null)解决了我的问题。 - miqe
@开发者,你的回答太令人困惑了。我也想使用onBackstackchangedlistener,但如果我删除addToBackStack,那么onBackstackchangedlistener就不起作用了。 - Gaurav Arora
这不是正确的答案。请点击此链接查看正确答案:https://stackoverflow.com/a/53813425/1298105 - Calyfs0
解决方案很令人困惑。 - Bilal Shahid

5

显示空白解决方案的片段。

  1. 确保首先添加 Base Fragment,并且不使用 addToBackStack() 方法。因为它负责导航返回。我们不想从第一页返回,所以不要将它添加到 backStack。
  2. Fragment A 到 Fragment B时,如果您调用了fragmentTransacation.add,则从 B 返回 A 时,onViewCreatedonResume 方法将不会被调用,因为您已经向其添加了一个片段。 因此,为了在返回到 Fragment A 时触发onResumeonViewCreated,您应该调用 fragmentTransaction.replace

2
@Override
public void onBackPressed() {
    int fragments = getSupportFragmentManager().getBackStackEntryCount();
    if (fragments == 1) {
        finish();
    } else {
        if (getFragmentManager().getBackStackEntryCount() > 1) {
            getFragmentManager().popBackStack();
        } else {
            super.onBackPressed();
        }
    }
}

1

addToBackStack() <-- 在第一个片段中不要包含此内容。-->


if(getSupportFragmentManager().getBackStackEntryCount() !=1){
                fragmentTransaction.addToBackStack("placeholder");
            }

0
我假设您想要处理返回按钮的按下事件。您可以执行以下操作:
在转换 Fragment 之前,像下面这样调用 addToBackStack():
 fragTran.replace(R.id.content_frame, secondFrag);
                    fragTran.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                    fragTran.addToBackStack("TAG");
                    fragTran.commit();

如需更清晰的信息,请查看此帖子https://dev59.com/cmsz5IYBdhLWcg3wTl4T#7992472


同样的问题,它显示一个空白屏幕,然后关闭应用程序。 - Pooja Dubey
@PoojaDubey:嗯,我猜你的代码里可能还有其他问题,因为上述方法是有效的。你可以从这里检查样例 https://www.dropbox.com/s/iup67qfwkx5uzqo/FragmentsTest.rar - Spring Breaker

0
如果您从一个活动导航到第二个活动的片段,则会发生这种情况。在替换片段时,将它们添加到后退堆栈中,因此不要将各自活动的第一个片段添加到后退堆栈中。

0

更新你的OncreateView()方法:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
    if (view != null) {
    if (view.getParent() != null) {
        ((ViewGroup)view.getParent()).removeView(view);
    }
    return view;
}

View v=inflater.inflate(R.layout.tests, container, false);

希望这能有所帮助!

忘记加了。在顶部声明 View view; - Calyfs0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接