java—如何从片段返回到主活动

ryhaxcpt  于 2021-07-11  发布在  Java
关注(0)|答案(3)|浏览(352)

我成功地实现了底部导航抽屉,并使用了片段。现在我可以从抽屉菜单切换片段。我这里的问题是,当我从抽屉菜单打开一个项目时(例如;关于开发者),当用户单击后退按钮时,它会关闭应用程序。相反,我希望用户从任何片段返回到主活动。帮我个忙,我没有多少经验。
这是我的密码;
如何使用带有自定义库的抽屉适配器(slidingrootnav-https://github.com/yarolegovich/slidingrootnav);

@Override
    public void onItemSelected(int position) {
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

        if (position == POS_DASHBOARD){

            slidingRootNav.closeMenu();
            transaction.addToBackStack(null);
            transaction.commit();

        }

        else if (position == POS_ABOUT_APP){
            ((CoordinatorLayout)findViewById(R.id.root_view)).removeAllViews();

            AboutAppFragment aboutApp = new AboutAppFragment();
            transaction.replace(R.id.container, aboutApp);

            slidingRootNav.closeMenu();
            transaction.addToBackStack(null);
            transaction.commit();

        }
        else if (position == POS_ABOUT_DEVELOPERS){
            ((CoordinatorLayout)findViewById(R.id.root_view)).removeAllViews();

            AboutDeveloper aboutDeveloper = new AboutDeveloper();
            transaction.replace(R.id.container, aboutDeveloper);

            slidingRootNav.closeMenu();
            transaction.addToBackStack(null);
            transaction.commit();

        }

    }

片段类

import android.os.Bundle;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class AboutDeveloper extends Fragment  {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_about_developer,container, false);

        // Here I implemented a toolbar at the top for navigation purpose
        // but on clicking on the nav icon, the app closes, instead i want to return to the main activity

        Toolbar toolbar = root.findViewById(R.id.return_home);
        toolbar.setNavigationIcon(R.drawable.ic_baseline_arrow_back_24);
        toolbar.setTitle("About Developer");

        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getActivity().onBackPressed();
            }
        });
        return root;

    }

}

kknvjkwl

kknvjkwl1#

而不是 replace 使用 add 为您的交易

bz4sfanl

bz4sfanl2#

我认为这是因为addtobackstack方法中有null

transaction.addToBackStack(null)

因此,当您单击back按钮时,不会得到主活动。
如果您想了解更多关于addtobackstack的工作原理,我建议您阅读以下内容:带null参数的addtobackstack的含义是什么?

uqjltbpv

uqjltbpv3#

在做了一些挖掘之后,我终于找到了绕过它的方法。我所要做的就是从主活动(在我的例子中是homeactivity.class)向onbackpressed方法添加一个调整。

@Override
    public void onBackPressed() {

        //Return to home activity from any active fragment
        if (getSupportFragmentManager().getBackStackEntryCount() > 1) {
            Intent intent = new Intent(this, HomeActivity.class);
            startActivity(intent);
        }

        //To close nav drawer
        else if(slidingRootNav.isMenuOpened()){
            slidingRootNav.closeMenu();

        }
        else {
            moveTaskToBack(true);
        }

    }

nb addtobackstack必须在片段事务期间使用,以便在片段处于活动状态时保持计数。说 transaction.addToBackStack(null) 至于fragment类中的顶部导航,我所做的只是添加一个意图,当单击工具栏nav图标时调用home活动。

public class AboutDeveloper extends Fragment  {

    Intent intent;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_about_developer,container, false);

        intent = new Intent(getActivity(), HomeActivity.class);

        Toolbar toolbar = root.findViewById(R.id.return_home);
        toolbar.setNavigationIcon(R.drawable.ic_baseline_arrow_back_ios_24);
        toolbar.setTitle("About Developer");
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(intent);
                getActivity().finish();
            }
        });
        return root;

    }

}

感谢那些提出建议的人。

相关问题