在可见但未重新创建时执行片段

时间:2017-12-29 14:55:10

标签: android android-fragments bottomnavigationview

我有这个问题:

目前我使用BottomNavigationView浏览碎片......

代码:

bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {

               //Fragment fragment = null;
               Fragment currentFragment = fragmentManager.findFragmentById(R.id.fragment_container_home);
                switch (item.getItemId()){

                    case R.id.ic_home:

                        if (currentFragment instanceof MainFragment){

                            //execute code
                        }

                        if(fragmentManager.findFragmentByTag("mainMenu") != null) {
                            //if the fragment exists, show it.
                            fragmentManager.beginTransaction().show(fragmentManager.findFragmentByTag("mainMenu")).commit();
                            toolbar.setTitle("Flip");
                            item = menu.getItem(0);
                            item.setChecked(true);
                        } else {
                            //if the fragment does not exist, add it to fragment manager.
                            fragmentManager.beginTransaction().add(R.id.fragment_container_home, new MainFragment(), "mainMenu").commit();
                            toolbar.setTitle("Flip");
                            item = menu.getItem(0);
                            item.setChecked(true);
                        }

                        //Hide Others Fragments
                        if(fragmentManager.findFragmentByTag("categories") != null){
                            fragmentManager.beginTransaction().hide(fragmentManager.findFragmentByTag("categories")).commit();
                        }
                        if(fragmentManager.findFragmentByTag("feedUsers") != null){
                            fragmentManager.beginTransaction().hide(fragmentManager.findFragmentByTag("feedUsers")).commit();
                        }
                        if(fragmentManager.findFragmentByTag("explore") != null){
                            fragmentManager.beginTransaction().hide(fragmentManager.findFragmentByTag("explore")).commit();
                        }
                        if(fragmentManager.findFragmentByTag("opcoes") != null){
                            fragmentManager.beginTransaction().hide(fragmentManager.findFragmentByTag("opcoes")).commit();
                        }

                        break;


                }

                return false;

            }
        });

我需要什么:

单击时运行一些代码,可见片段就是菜单片段本身。

在这里:

if (currentFragment instanceof MainFragment){

                            //execute code
                        }

只有当片段重新出现而没有重新创建时,我才能执行一些代码吗?

另一种方法是访问recyclerview或发送命令以在片段

中执行

我需要访问RecyclerView Fragment,以便在BottomNavigationView中点击两次时将其发送到屏幕顶部。

2 个答案:

答案 0 :(得分:0)

我想你的方法不止一种

第一种方式,在显示片段后调用所需的代码,非常简单

if(fragmentManager.findFragmentByTag("mainMenu") != null) {
                            //if the fragment exists, show it.
                            fragmentManager.beginTransaction().show(fragmentManager.findFragmentByTag("mainMenu")).commit();
                            toolbar.setTitle("Flip");
                            item = menu.getItem(0);
                            item.setChecked(true);


                            ////////////////////////////////////
                            // execute the code you want here //
                            ////////////////////////////////////
                        }

第二种方式在显示/隐藏visibility后,您无法设置fragment并提前检查visibility

fragment展示后添加setVisibility VISIBLE

fragmentManager.beginTransaction().show(fragmentManager.findFragmentByTag("mainMenu")).commit();
currentFragment.getView().setVisibility(View.VISIBLE);

并在fragment隐藏后添加setVisibility GONE

    fragmentManager.beginTransaction().hide(fragmentManager.findFragmentByTag("categories")).commit();
currentFragment.getView().setVisibility(View.GONE);

并通过

检查Visibility的{​​{1}}所需的位置
fragment

如果您无法检查并且无法检查if(currentFragment != null){ if(currentFragment().getView().getVisibility() == View.VISIBLE){ // fragment is shown, do some action }else { // fragment is hiden, do some action } } ,您可以{1}}每1秒检查一次visibility或您想要的任何内容...... 。

第三种方式,效率很高。使用RunnableVisibility仅在onResume未运行时调用,除非您手动调用它。

onResume

然后

fragment

第三种方式的一些费用;

只有当您的片段在运行时未包含值并且您希望保留此值时才使用这种方式,并且不要在运行时使用这些值,除非它们是if(fragmentManager.findFragmentByTag("mainMenu") != null) { //if the fragment exists, show it. fragmentManager.beginTransaction().show(fragmentManager.findFragmentByTag("mainMenu")).commit(); toolbar.setTitle("Flip"); item = menu.getItem(0); item.setChecked(true); currentFragment().onResume(); } //Hide Others Fragments if(fragmentManager.findFragmentByTag("categories") != null){ fragmentManager.beginTransaction().hide(fragmentManager.findFragmentByTag("categories")).commit(); currentFragment().onStop(); }
EXP;如果您在运行时从@Override public void onResume() { super.onResume(); // your code } 加载static到某个imageView并隐藏bitmap(就像您在代码中所做的那样),并在您显示某些{{ 1}}再次,您会找到fragment,因为fragment正在fragment中运行, 另一方面,如果您调用终止imageView并再次启动它,则无法找到位图或fragment。所以这是使用background方法。它会停止fragmentImageViewonStop)中的所有内容并保存,直到fragment恢复无法启动。

答案 1 :(得分:0)

您可以为此覆盖let currentElement; // Element being edited let listActions = { editItem: function() { currentElement.innerHTML = currentElement.innerHTML.replace(currentElement.innerText, editInput.value); editInput.value = ''; } } let modalControls = { editModal: function(i) { // *i* is *this* in *modalControls.editModal(this)* modalContainer.style.display = 'block'; currentElement = i.parentElement; modalContainer.getElementsByTagName('input')[0].value = currentElement.innerText; } }

onHiddenChanged(boolean)