从活动向上导航到片段打开相同的片段 - Android 导航组件

Posted

技术标签:

【中文标题】从活动向上导航到片段打开相同的片段 - Android 导航组件【英文标题】:Navigate up from activity to fragment open the same fragment - Android Navigation Component 【发布时间】:2021-11-24 06:41:40 【问题描述】:

在这个应用程序上,当我尝试从 "HomeFragment" 导航到 "DetailsActivity" 然后按下它返回到同一个片段并且点击时的汉堡图标不起作用

导航图

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/mobile_navigation"
    app:startDestination="@id/nav_home">

    <fragment
        android:id="@+id/nav_home"
        android:name="com.blogspot.abtallaldigital.ui.home.HomeFragment"
        android:label="@string/home"
        tools:layout="@layout/fragment_home"/>

    <fragment
        android:id="@+id/nav_Accessory"
        android:name="com.blogspot.abtallaldigital.ui.accessory.AccessoryFragment"
        android:label="@string/accessory"
        tools:layout="@layout/fragment_accessory" />

    <fragment
        android:id="@+id/nav_Arcade"
        android:name="com.blogspot.abtallaldigital.ui.arcade.ArcadeFragment"
        android:label="@string/arcade"
        tools:layout="@layout/fragment_arcade" />

    <fragment
        android:id="@+id/nav_Fashion"
        android:name="com.blogspot.abtallaldigital.ui.fashion.FashionFragment"
        android:label="@string/fashion"
        tools:layout="@layout/fashion_fragment" />
    <fragment
        android:id="@+id/nav_Food"
        android:name="com.blogspot.abtallaldigital.ui.food.FoodFragment"
        android:label="@string/food"
        tools:layout="@layout/food_fragment" />
    <fragment
        android:id="@+id/nav_Heath"
        android:name="com.blogspot.abtallaldigital.ui.heath.HeathFragment"
        android:label="@string/heath"
        tools:layout="@layout/heath_fragment" />
    <fragment
        android:id="@+id/nav_Lifestyle"
        android:name="com.blogspot.abtallaldigital.ui.lifestyle.LifestyleFragment"
        android:label="@string/lifestyle"
        tools:layout="@layout/lifestyle_fragment" />
    <fragment
        android:id="@+id/nav_Sports"
        android:name="com.blogspot.abtallaldigital.ui.sports.SportsFragment"
        android:label="@string/sports"
        tools:layout="@layout/sports_fragment" />
    <dialog
        android:id="@+id/about"
        android:name="com.blogspot.abtallaldigital.ui.about.AboutFragment"
        android:label="about"
        tools:layout="@layout/about" />
    <activity
        android:id="@+id/detailsActivity"
        android:name="com.blogspot.abtallaldigital.ui.DetailsActivity"
        android:label="activity_details"
        tools:layout="@layout/activity_details" />
</navigation>

HomeFragment导航代码

@Override
    public void onViewCreated(@NonNull @NotNull View view, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) 
        super.onViewCreated(view, savedInstanceState);

        binding.homeRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(requireContext(),
                binding.homeRecyclerView, new RecyclerItemClickListener.OnItemClickListener() 
            @Override
            public void onItemClick(View view, int position) 

                Item item = itemArrayList.get(position);
                bundle.putParcelable("item",item);

                Navigation.findNavController(requireView())
                        .navigate(R.id.detailsActivity, bundle,
                                new NavOptions.Builder()
                                        .setPopUpTo(R.id.nav_home, true).build()
                        );

            

            @Override
            public void onLongItemClick(View view, int position) 

            
        
        ));
    

DetailsActivity

@AndroidEntryPoint
public class DetailsActivity extends AppCompatActivity 

    private static final String TAG = "DetailsActivity";
    private ActivityDetailsBinding binding;

    String url, title, content, youtubeThumbnailImageSrc, youTubeLink;
    int youtubeThumbnailImageSetVisibility;
    private PostViewModel postViewModel;
    private Item postItem;


    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        binding = ActivityDetailsBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        postViewModel = new ViewModelProvider(this).get(PostViewModel.class);


        postItem = getIntent().getParcelableExtra("item");


        if (postItem != null) 

            Log.d(TAG, "onItemClick: item" + postItem.getTitle());

            final Document document = Jsoup.parse(postItem.getContent());
//                    final Elements elements = document.select("img");


            Element element = document.body();

            for (Element e : element.getElementsByClass
                    ("YOUTUBE-iframe-video")) 
                youtubeThumbnailImageSrc = e.attr("data-thumbnail-src");
                youTubeLink = e.attr("src");
                Log.e("YouTube thumbnail", youtubeThumbnailImageSrc);
                Log.e("Youtube link", youTubeLink);
            

            if (youtubeThumbnailImageSrc == null) 
                youtubeThumbnailImageSetVisibility = 8;
            

            url = postItem.getUrl();
            title = postItem.getTitle();
            content = postItem.getContent();


        


//        blogImage = (ImageView) findViewById(R.id.blogImage);

        setSupportActionBar(binding.toolbar);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);

        binding.progressBar.setVisibility(View.VISIBLE);

        binding.titleTextView.setText(title);
        binding.blogContent.setMovementMethod(LinkMovementMethod.getInstance());


        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) 
            binding.fab.bringToFront();
        

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
            binding.scrollView.setOnScrollChangeListener((v, scrollX, scrollY, oldScrollX, oldScrollY) -> 
                //   Log.d("ScrollView","scrollX_"+scrollX+"_scrollY_"+scrollY+"_oldScrollX_"+oldScrollX+"_oldScrollY_"+oldScrollY);
                if (scrollY > 0 && binding.fab.isShown()) 
                    binding.fab.hide();
                 else if (scrollY < 22) 
                    binding.fab.show();

                
            );
         else 
            binding.scrollView.getViewTreeObserver().addOnScrollChangedListener(() -> 
                int mScrollY = binding.scrollView.getScrollY();
                if (mScrollY > 0 && binding.fab.isShown()) 
                    binding.fab.hide();
                 else if (mScrollY < 22) 
                    binding.fab.show();
                
            );
        


        binding.fab.setOnClickListener(view -> 
            String shareContent = title + "\n" + url;
            Intent shareIntent = new Intent(Intent.ACTION_SEND);
            shareIntent.setType("text/plain");
            shareIntent.putExtra(Intent.EXTRA_TEXT, shareContent);
            shareIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

            try 
                startActivity(Intent.createChooser(shareIntent, title));
             catch (Exception exception) 
                Log.e(TAG, "onCreate: " + exception);
            
        );


        //       String imageSrc = getIntent().getStringExtra("blogImage");
        //       Glide.with(getApplicationContext()).load(imageSrc).into(blogImage);


        binding.youtubeThumbnailImage.setVisibility(youtubeThumbnailImageSetVisibility);
        binding.youtubeThumbnailImage.setAdjustViewBounds(true);
        Picasso.get().load(youtubeThumbnailImageSrc).into(binding.youtubeThumbnailImage);

        binding.youtubeThumbnailImage.setOnClickListener(view -> 
            Intent youTube = new Intent
                    (Intent.ACTION_VIEW, Uri.parse(youTubeLink));
            startActivity(youTube);
        );


        PicassoImageGetter imageGetter = new PicassoImageGetter(binding.blogContent, this);
        Spannable html;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) 
            html = (Spannable) Html.fromHtml(content, Html.FROM_HTML_MODE_LEGACY, imageGetter, null);
         else 
            html = (Spannable) Html.fromHtml(content, imageGetter, null);
        

        binding.blogContent.setText(html);


        binding.visitSite.setOnClickListener(view -> openCustomTab(this, Uri.parse(url)));
        binding.progressBar.setVisibility(View.GONE);
    

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
        getMenuInflater().inflate(R.menu.activity_details_menu, menu);
        return true;
    

    @Override
    public boolean onOptionsItemSelected(MenuItem item) 

        if (item.getItemId() == R.id.action_add_to_favorites) 
            saveTogFavorites(item);
         else if (item.getItemId() == R.id.action_share) 
            ShareActionProvider shareActionProvider =
                    (ShareActionProvider) MenuItemCompat.getActionProvider(item);
            shareActionProvider.setShareIntent(createShareIntent());
            return true;
         else if (item.getItemId() == R.id.copyTheLink) 
            ClipboardManager clipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
            ClipData clipData = ClipData.newPlainText("link", url);
            clipboardManager.setPrimaryClip(clipData);
            Toast.makeText(this, getString(R.string.linkCopied), Toast.LENGTH_LONG).show();
            return true;
        

        return super.onOptionsItemSelected(item);
    

    private void saveTogFavorites(MenuItem menuItem) 

//        Bundle bundle = getIntent().getParcelableExtra("postList");


        FavoritesEntity favoritesEntity = new FavoritesEntity(0,
                postItem);

        postViewModel.insertFavorites(favoritesEntity);
        menuItem.setIcon(R.drawable.ic_favorite);

        Snackbar.make(binding.getRoot(), "Saved", Snackbar.LENGTH_LONG).show();


    

    @Override
    public boolean onSupportNavigateUp() 
        onBackPressed();
        return true;
    

MainActivity


@AndroidEntryPoint
public class MainActivity extends AppCompatActivity 

    @SuppressWarnings("unused")
    private AppBarConfiguration mAppBarConfiguration;
    public static Utils.DataStoreRepository DATA_STORE_REPOSITORY;


    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        DATA_STORE_REPOSITORY = new Utils.DataStoreRepository(this);

        setSupportActionBar(binding.appBarMain.toolbar);
        mAppBarConfiguration = new AppBarConfiguration.Builder(R.id.nav_home, R.id.nav_Accessory,
                R.id.nav_Arcade, R.id.nav_Fashion,
                R.id.nav_Food, R.id.nav_Heath,
                R.id.nav_Lifestyle, R.id.nav_Sports, R.id.about)
                .setOpenableLayout(binding.drawerLayout)
                .build();


        NavHostFragment navHostFragment = (NavHostFragment)
                getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment);

        assert navHostFragment != null;
        NavController navController = navHostFragment.getNavController();

        NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
        NavigationUI.setupWithNavController(binding.navView, navController);


    


    @Override
    public boolean onSupportNavigateUp() 
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        return NavigationUI.navigateUp(navController, mAppBarConfiguration)
                || super.onSupportNavigateUp();
    


在寻找此问题的解决方案时,我看到了类似的 question,我将 viewModel 与 MutableLiveData 一起使用,但不处理事件

【问题讨论】:

在 HomeFragment 中,如果在 .setPopUpTo(R.id.nav_home, true).build() 中将 isPopUpToInclusive 设置为 false 会怎样。我认为将其设置为 true 会从后台堆栈中删除主片段 @zain 我尝试了错误选项但没有改变 【参考方案1】:

试试这个解决方案

    创建新片段DetailsFragment 并将您的代码从DetailsActivity 移动到它,不要覆盖onSupportNavigateUp
public class DetailsFragment extends Fragment 

    private static final String TAG = "DetailsFragment";

    private FragmentDetailsBinding binding;

    String url, title, content, youtubeThumbnailImageSrc, youTubeLink;
    int youtubeThumbnailImageSetVisibility;
    private PostViewModel postViewModel;

    @Override
    public void onViewCreated(@NonNull @NotNull View view, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) 
        super.onViewCreated(view, savedInstanceState);

        postViewModel = new ViewModelProvider(this).get(PostViewModel.class);
        Log.d(TAG, "onCreate checkSavedFavoritesItems: " + postFavoritesSavedId);


        postItem = DetailsFragmentArgs.fromBundle(getArguments()).getPostItem();


        final Document document = Jsoup.parse(postItem.getContent());
//                    final Elements elements = document.select("img");

        Element element = document.body();

        for (Element e : element.getElementsByClass
                ("YOUTUBE-iframe-video")) 
            youtubeThumbnailImageSrc = e.attr("data-thumbnail-src");
            youTubeLink = e.attr("src");
            Log.e("YouTube thumbnail", youtubeThumbnailImageSrc);
            Log.e("Youtube link", youTubeLink);
        

        if (youtubeThumbnailImageSrc == null) 
            youtubeThumbnailImageSetVisibility = 8;
        

        url = postItem.getUrl();
        title = postItem.getTitle();
        content = postItem.getContent();


        //        blogImage = (ImageView) findViewById(R.id.blogImage);

        setHasOptionsMenu(true);
//        Objects.requireNonNull(getSupportActionBar()).setDisplayShowTitleEnabled(false);
        Objects.requireNonNull( ((MainActivity) requireActivity())
                .getSupportActionBar()).setDisplayHomeAsUpEnabled(true);
//        getSupportActionBar().setDisplayShowHomeEnabled(true);

        binding.progressBar.setVisibility(View.VISIBLE);

        binding.titleTextView.setText(title);
        binding.blogContent.setMovementMethod(LinkMovementMethod.getInstance());


        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) 
            binding.fab.bringToFront();
        

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
            binding.scrollView.setOnScrollChangeListener((v, scrollX, scrollY, oldScrollX, oldScrollY) -> 
                //   Log.d("ScrollView","scrollX_"+scrollX+"_scrollY_"+scrollY+"_oldScrollX_"+oldScrollX+"_oldScrollY_"+oldScrollY);
                if (scrollY > 0 && binding.fab.isShown()) 
                    binding.fab.hide();
                 else if (scrollY < 22) 
                    binding.fab.show();

                
            );
         else 
            binding.scrollView.getViewTreeObserver().addOnScrollChangedListener(() -> 
                int mScrollY = binding.scrollView.getScrollY();
                if (mScrollY > 0 && binding.fab.isShown()) 
                    binding.fab.hide();
                 else if (mScrollY < 22) 
                    binding.fab.show();
                
            );
        


        binding.fab.setOnClickListener(view2 -> 
            String shareContent = title + "\n" + url;
            Intent shareIntent = new Intent(Intent.ACTION_SEND);
            shareIntent.setType("text/plain");
            shareIntent.putExtra(Intent.EXTRA_TEXT, shareContent);
            shareIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

            try 
                startActivity(Intent.createChooser(shareIntent, title));
             catch (Exception exception) 
                Log.e(TAG, "onCreate: " + exception);
            
        );


        //       String imageSrc = getIntent().getStringExtra("blogImage");
        //       Glide.with(getApplicationContext()).load(imageSrc).into(blogImage);


        binding.youtubeThumbnailImage.setVisibility(youtubeThumbnailImageSetVisibility);
        binding.youtubeThumbnailImage.setAdjustViewBounds(true);
        Picasso.get().load(youtubeThumbnailImageSrc).into(binding.youtubeThumbnailImage);

        binding.youtubeThumbnailImage.setOnClickListener(view1 -> 
            Intent youTube = new Intent
                    (Intent.ACTION_VIEW, Uri.parse(youTubeLink));
            startActivity(youTube);
        );


        PicassoImageGetter imageGetter = new PicassoImageGetter(binding.blogContent, requireContext());
        Spannable html;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) 
            html = (Spannable) Html.fromHtml(content, Html.FROM_HTML_MODE_LEGACY, imageGetter, null);
         else 
            html = (Spannable) Html.fromHtml(content, imageGetter, null);
        

        binding.blogContent.setText(html);


        binding.visitSite.setOnClickListener(view3 -> openCustomTab(requireContext(), Uri.parse(url)));
        binding.progressBar.setVisibility(View.GONE);
    

    private Item postItem;
    private boolean postFavoritesSaved = false;
    private int postFavoritesSavedId = 0;
    private MenuItem menuItem;

    @Override
    public View onCreateView(@NotNull LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) 
        // Inflate the layout for this fragment
        binding =  FragmentDetailsBinding.inflate(inflater, container, false);
        return binding.getRoot();
    


    @Override
    public void onCreateOptionsMenu(@NonNull Menu menu,
                                    @NonNull MenuInflater inflater) 
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.activity_details_menu, menu);
        menuItem = menu.findItem(R.id.action_add_to_favorites);
        checkSavedFavoritesItems(menuItem);
    

    @Override
    public void onDestroyView() 
        super.onDestroyView();
        menuItem.setIcon(R.drawable.ic_favorite_border);
    

    private void checkSavedFavoritesItems(MenuItem menuItem) 
        postViewModel.getAllFavorites().observe(this, favoritesEntity -> 
            try 
                for (FavoritesEntity savedPost: favoritesEntity) 
                    if (savedPost.getItem().getId().equals(postItem.getId())) 
                        menuItem.setIcon(R.drawable.ic_favorite);
                        postFavoritesSavedId = savedPost.getId();
                        Log.d(TAG, "checkSavedFavoritesItems: " + postFavoritesSavedId);
                        postFavoritesSaved = true;
                    
                
             catch (Exception exception) 
                Log.e(TAG, "checkSavedFavoritesItems: " + exception.getMessage());
            
        );
    

    @Override
    public boolean onOptionsItemSelected(MenuItem menuItem) 

        if (menuItem.getItemId() == R.id.action_add_to_favorites && !postFavoritesSaved) 
            saveTogFavorites(menuItem);
         else if (menuItem.getItemId() == R.id.action_add_to_favorites && postFavoritesSaved) 
            removePostFromFavorites(menuItem);
         else if (menuItem.getItemId() == R.id.action_share) 
            ShareActionProvider shareActionProvider =
                    (ShareActionProvider) MenuItemCompat.getActionProvider(menuItem);
            shareActionProvider.setShareIntent(createShareIntent());
            return true;
         else if (menuItem.getItemId() == R.id.copyTheLink) 
            ClipboardManager clipboardManager = (ClipboardManager)
                    requireActivity().getSystemService(Context.CLIPBOARD_SERVICE);
            ClipData clipData = ClipData.newPlainText("link", url);
            assert clipboardManager != null;
            clipboardManager.setPrimaryClip(clipData);
            Toast.makeText(requireContext(), getString(R.string.linkCopied), Toast.LENGTH_LONG).show();
            return true;
        

        return super.onOptionsItemSelected(menuItem);
    

    private void saveTogFavorites(MenuItem menuItem) 
        FavoritesEntity favoritesEntity = new FavoritesEntity(0,
                postItem);

        postViewModel.insertFavorites(favoritesEntity);
        menuItem.setIcon(R.drawable.ic_favorite);
        Snackbar.make(binding.getRoot(), "Saved", Snackbar.LENGTH_LONG).show();
        postFavoritesSaved = true;
    


    private void removePostFromFavorites(MenuItem menuItem) 
        FavoritesEntity favoritesEntity = new FavoritesEntity(postFavoritesSavedId,
                postItem);

        Log.d(TAG, "checkSavedFavoritesItems: " + postFavoritesSavedId);
        postViewModel.deleteFavoritePost(favoritesEntity);
        menuItem.setIcon(R.drawable.ic_favorite_border);
        Snackbar.make(binding.getRoot(),
                "Post deleted from favorites", Snackbar.LENGTH_LONG).show();
        postFavoritesSaved = false;
    
    DetailsFragment 添加到 nav_graph 并将参数添加到 postItem 作为 Parcelable
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/mobile_navigation"
    app:startDestination="@id/nav_home">

    <fragment
        android:id="@+id/nav_home"
        android:name="com.blogspot.abtallaldigital.ui.home.HomeFragment"
        android:label="@string/home"
        tools:layout="@layout/fragment_home">
        <action
            android:id="@+id/action_nav_home_to_detailsFragment"
            app:destination="@id/detailsFragment"
            app:popUpTo="@id/nav_home" />
    </fragment>

    <fragment
        android:id="@+id/nav_Accessory"
        android:name="com.blogspot.abtallaldigital.ui.accessory.AccessoryFragment"
        android:label="@string/accessory"
        tools:layout="@layout/fragment_accessory" >
        <action
            android:id="@+id/action_nav_Accessory_to_detailsFragment"
            app:destination="@id/detailsFragment" />
    </fragment>

    <fragment
        android:id="@+id/nav_Arcade"
        android:name="com.blogspot.abtallaldigital.ui.arcade.ArcadeFragment"
        android:label="@string/arcade"
        tools:layout="@layout/fragment_arcade" >
        <action
            android:id="@+id/action_nav_Arcade_to_detailsFragment"
            app:destination="@id/detailsFragment" />
    </fragment>

    <fragment
        android:id="@+id/nav_Fashion"
        android:name="com.blogspot.abtallaldigital.ui.fashion.FashionFragment"
        android:label="@string/fashion"
        tools:layout="@layout/fashion_fragment" >
        <action
            android:id="@+id/action_nav_Fashion_to_detailsFragment"
            app:destination="@id/detailsFragment" />
    </fragment>
    <fragment
        android:id="@+id/nav_Food"
        android:name="com.blogspot.abtallaldigital.ui.food.FoodFragment"
        android:label="@string/food"
        tools:layout="@layout/food_fragment" >
        <action
            android:id="@+id/action_nav_Food_to_detailsFragment"
            app:destination="@id/detailsFragment" />
    </fragment>
    <fragment
        android:id="@+id/nav_Heath"
        android:name="com.blogspot.abtallaldigital.ui.heath.HeathFragment"
        android:label="@string/heath"
        tools:layout="@layout/heath_fragment" >
        <action
            android:id="@+id/action_nav_Heath_to_detailsFragment"
            app:destination="@id/detailsFragment" />
    </fragment>
    <fragment
        android:id="@+id/nav_Lifestyle"
        android:name="com.blogspot.abtallaldigital.ui.lifestyle.LifestyleFragment"
        android:label="@string/lifestyle"
        tools:layout="@layout/lifestyle_fragment" >
        <action
            android:id="@+id/action_nav_Lifestyle_to_detailsFragment"
            app:destination="@id/detailsFragment" />
    </fragment>
    <fragment
        android:id="@+id/nav_Sports"
        android:name="com.blogspot.abtallaldigital.ui.sports.SportsFragment"
        android:label="@string/sports"
        tools:layout="@layout/sports_fragment" >
        <action
            android:id="@+id/action_nav_Sports_to_detailsFragment"
            app:destination="@id/detailsFragment" />
    </fragment>
    <dialog
        android:id="@+id/about"
        android:name="com.blogspot.abtallaldigital.ui.about.AboutFragment"
        android:label="about"
        tools:layout="@layout/about" />
    <fragment
        android:id="@+id/detailsFragment"
        android:name="com.blogspot.abtallaldigital.ui.DetailsFragment"
        android:label="Post details"
        tools:layout="@layout/fragment_details" >
        <argument
            android:name="postItem"
            app:argType="com.blogspot.abtallaldigital.pojo.Item" />
    </fragment>
</navigation>
    最后在 HomeFragment 中编写导航代码并像这样传递可打包的项目
@Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) 
        super.onViewCreated(view, savedInstanceState);

        navController = Navigation.findNavController(requireView());

        binding.homeRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(requireContext(),
                binding.homeRecyclerView, new RecyclerItemClickListener.OnItemClickListener() 
            @Override
            public void onItemClick(View view, int position) 

                Item item = itemArrayList.get(position);

                if (Objects.requireNonNull(navController.getCurrentDestination()).getId() == R.id.nav_home) 
                    Navigation.findNavController(requireView())
                            .navigate(HomeFragmentDirections.actionNavHomeToDetailsFragment(item));
                

            

            @Override
            public void onLongItemClick(View view, int position) 

            
        
        ));
    

关于工具栏问题,您可以选择使用片段自定义工具栏或使用应用程序主题工具栏,不能同时使用两者,如果灵魂工作正常,请告诉我

【讨论】:

【参考方案2】:

为什么要创建另一个 Activity?

导航组件的默认行为是使用一个Activity和多个Fragment。

您应该创建一个适配器来在项目上显示这些数据,然后在 ItemClickListener 接口上实现以将从适配器单击的选定项目传递给 HomeFragment。您可以从 HomeFragment 实现接口并将当前点击的 Item 发送到 DetailsFragment 而不是 DetailsActivity(您必须更改),您可以使用 args 发送。

不要在导航组件中使用多个 Activity。

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。 我已经尝试将细节作为片段制作,但存在多重问题,首先我无法创建工具栏,如果我尝试看到两个工具栏,一个归 MainActivity 拥有,另一个归片段本身所有,第二个问题是当我用一个工具栏的后退按钮导航回来时,它也导航到 homeFragmet,所以问题没有解决,当我尝试用“向下”的主后退按钮导航时,我得到了 ClassNotFound 异常 您可以做的是,您可以通过调用 ====> navController.addOnDestinationChangedListener((navController1, navDestination, bundle) -&gt; if (navDestination.getId() == R.id.detailsFragment) binding.appBarMain.toolbar.setVisibility(View.GONE); 隐藏 MainActivity 中的当前工具栏,然后您可以在此片段中显示您的自定义工具栏 / 和如果你想覆盖你的后退工具栏按钮,那么你可以检查这个:***.com/questions/55904485/… @shqipdon 谢谢,我改变了 sracure 并将 te 代码从活动移动到像 MML 答案这样的片段【参考方案3】:

您可以尝试像这样从片段管理器中删除片段:

Fragment fragmentByTag = getFragmentManager().
                    findFragmentByTag("Old fragment tag");
            if (fragmentByTag != null) 
                getFragmentManager().beginTransaction()
                        .remove(fragmentByTag).commit();
            

【讨论】:

我可以在代码的哪一部分写这个?在onSupportNavigateUp?

以上是关于从活动向上导航到片段打开相同的片段 - Android 导航组件的主要内容,如果未能解决你的问题,请参考以下文章

热门从另一个片段导航到主页片段

如何从活动意图到特定片段

如何从一个片段导航到另一个片段?

导航抽屉活动:在按钮单击时从片段移动到片段

将数据从活动传递到底部导航栏的片段

导航组件:将 safeArgs 从活动传递到片段