如何从片段返回主要活动

Posted

技术标签:

【中文标题】如何从片段返回主要活动【英文标题】:How can I go back to main activity from a Fragment 【发布时间】:2021-03-04 15:33:09 【问题描述】:

我成功实现了底部导航抽屉并使用了片段。现在我可以从抽屉菜单中切换片段。 我的问题是,当我从抽屉菜单中打开一个项目(例如;关于开发人员)时,当用户单击后退按钮时,它会关闭应用程序。相反,我希望用户从任何片段返回到主活动。帮帮我吧,我没有太多经验。

这是我的代码;

我如何使用抽屉适配器和自定义库(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;

    


【问题讨论】:

【参考方案1】:

使用add 代替replace 进行交易

【讨论】:

【参考方案2】:

我认为这是因为您在方法 addToBackStack 中有 null

 transaction.addToBackStack(null)

因此,当您单击后退按钮时,您不会获得主要活动。

如果您想了解有关 addToBackStack 工作原理的更多信息,我建议您阅读此What is the meaning of addToBackStack with null parameter?

【讨论】:

在我的 addToBackStack 方法中传递 null 参数不是问题。事实上它是解决方案的一部分,因为我需要它来保持活动片段的计数。感谢您的回复:)【参考方案3】:

在做了一些挖掘之后,我终于找到了解决方法。我所要做的就是从主要活动(在我的例子中为 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 类中的顶部导航,我所做的只是添加一个 Intent,当单击工具栏导航图标时调用 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;

    



感谢提出建议的人。

【讨论】:

以上是关于如何从片段返回主要活动的主要内容,如果未能解决你的问题,请参考以下文章

从其他活动返回到同一片段时,如何保存和恢复片段中 RecyclerView 的滚动位置?

从片段返回到上一个活动 onclick back button

将字符串从对话框片段返回到活动 [重复]

启动对话框以获取结果以将值返回给主要活动

如何使用接口将活动回调返回到片段

从活动创建片段时getView返回null