如何在 Nav Controller 中获取当前显示的片段
How to get the currently displaying fragment in Nav Controller
我使用单曲 activity 并将多个片段嵌入其中。现在我想知道在单个 activity class 中,当前正在显示哪个 Fragment。我怎样才能做到这一点?我从这里查看了解决方案 How to know if a Fragment is Visible?
MyFragmentClass test = (MyFragmentClass) getSupportFragmentManager().findFragmentByTag("testID");
if (test != null && test.isVisible()) {
//DO STUFF
}
else {
//Whatever
}
但是我不知道参数"testID"
给你什么。此外,我尝试从 Get the current fragment object
实施解决方案
Fragment currentFragment = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);
但我在这里收到错误消息:“无法解析符号 'fragment_container'”
有谁知道如何在使用单个 activity 和多个片段方法时获取正在显示的当前片段的名称?
你可以这样做:
- 在您的 activity 中创建一个
Fragment
字段。像这样:
private Fragment mCurrentlyDisplayingFragment;
- 每当更改片段时,只需将片段对象传递给它即可。像这样:
MyFragment fragment = new MyFragment();
// show it in the frame layout
mCurrentlyDisplayingFragment = fragment;
现在,无论何时检查,只需检查此字段。
您的第一种方法:
如果你想通过标签查找片段,你需要先设置标签。您在进行交易时这样做,例如:
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.container, SheetEditorScreen.class, args, "testID" //Here you set the tag
)
然后你就可以像以前一样按标签获取片段了:
getSupportFragmentManager().findFragmentByTag("testID");
你的第二种方法:
如果你想通过 ID 获取片段,你需要传递你在 activity 布局 xml 文件中声明的容器视图 ID(在 setContentView(R.id.main_activity)
中设置):
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fragment_container" <--- here is the id
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
然后你可以找到可见片段:
getSupportFragmentManager().findFragmentById(R.id.fragment_container);
现在,因为我对您的问题有了更清楚的了解,所以我添加了另一个解决方案。这适用于 FrameLayout
和片段交易。但是,这也适用于 NavController
。试试这个代码:
public Fragment getCurrentlyVisibleFragment(){
Fragment navHostFragment = getSupportFragmentManager().findFragmentById(R.id.navHostFragment);
return navHostFragment == null ? null : navHostFragment.getChildFragmentManager().getFragments().get(0);
}
我知道这里已经有 2 个答案,但还有 1 个解决方案,所以我在这里写下。这是代码:
NavController navController = Navigation.findNavController(this, R.id.fragment);
int id=navController.getCurrentDestination().getId();
if(id==R.id.startGameFragment ){ // change the fragment id
selectedPosition(0);
}else if(id==R.id.gameFragment ){ // change the fragment id
selectedPosition(1);
}else if(id==R.id.endGameFragment ){ // change the fragment id
selectedPosition(2);
}
我使用单曲 activity 并将多个片段嵌入其中。现在我想知道在单个 activity class 中,当前正在显示哪个 Fragment。我怎样才能做到这一点?我从这里查看了解决方案 How to know if a Fragment is Visible?
MyFragmentClass test = (MyFragmentClass) getSupportFragmentManager().findFragmentByTag("testID");
if (test != null && test.isVisible()) {
//DO STUFF
}
else {
//Whatever
}
但是我不知道参数"testID"
给你什么。此外,我尝试从 Get the current fragment object
Fragment currentFragment = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);
但我在这里收到错误消息:“无法解析符号 'fragment_container'”
有谁知道如何在使用单个 activity 和多个片段方法时获取正在显示的当前片段的名称?
你可以这样做:
- 在您的 activity 中创建一个
Fragment
字段。像这样:
private Fragment mCurrentlyDisplayingFragment;
- 每当更改片段时,只需将片段对象传递给它即可。像这样:
MyFragment fragment = new MyFragment();
// show it in the frame layout
mCurrentlyDisplayingFragment = fragment;
现在,无论何时检查,只需检查此字段。
您的第一种方法:
如果你想通过标签查找片段,你需要先设置标签。您在进行交易时这样做,例如:
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.container, SheetEditorScreen.class, args, "testID" //Here you set the tag
)
然后你就可以像以前一样按标签获取片段了:
getSupportFragmentManager().findFragmentByTag("testID");
你的第二种方法:
如果你想通过 ID 获取片段,你需要传递你在 activity 布局 xml 文件中声明的容器视图 ID(在 setContentView(R.id.main_activity)
中设置):
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fragment_container" <--- here is the id
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
然后你可以找到可见片段:
getSupportFragmentManager().findFragmentById(R.id.fragment_container);
现在,因为我对您的问题有了更清楚的了解,所以我添加了另一个解决方案。这适用于 FrameLayout
和片段交易。但是,这也适用于 NavController
。试试这个代码:
public Fragment getCurrentlyVisibleFragment(){
Fragment navHostFragment = getSupportFragmentManager().findFragmentById(R.id.navHostFragment);
return navHostFragment == null ? null : navHostFragment.getChildFragmentManager().getFragments().get(0);
}
我知道这里已经有 2 个答案,但还有 1 个解决方案,所以我在这里写下。这是代码:
NavController navController = Navigation.findNavController(this, R.id.fragment);
int id=navController.getCurrentDestination().getId();
if(id==R.id.startGameFragment ){ // change the fragment id
selectedPosition(0);
}else if(id==R.id.gameFragment ){ // change the fragment id
selectedPosition(1);
}else if(id==R.id.endGameFragment ){ // change the fragment id
selectedPosition(2);
}