从活动向上导航到片段打开相同的片段 - 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) -> 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 导航组件的主要内容,如果未能解决你的问题,请参考以下文章