[英]findFragmentByTag() returns null on existing fragmentTag
我有一個帶有FragmentContainer
的Activity
,它只會顯示兩個Fragment
中的一個。
通過單擊第一個Fragment
( CreateTasksListFragment
) 的Button
,可以顯示另一個 ( CreateTaskFragment
)。
當用戶單擊該按鈕時, CreateTasksListFragment
被隱藏並顯示CreateTaskFragment
的新實例。 然后,將顯示CreateTasksListFragment
(通過單擊CreateTaskFragment
的按鈕),並且必須刪除CreateTaskFragment
。
問題是,當我嘗試從FragmentManager
獲取CreateTasksListFragment
的最后一個實例以再次顯示它時,即使我通過調用getBackStackEntryAt()
正確獲取了它的標簽, findFragmentByTag()
返回 null 。
我認為沒有待處理的交易,所以我可能犯了另一種錯誤。
如果您知道實現此目標的更好方法,即使不使用此方法,也請分享。
這是對該問題感興趣的代碼:
CreateTasksActivity.java
@Override
protected void onStart() {
super.onStart();
Bundle bundle = new Bundle();
...
CreateTasksListFragment fragment = new CreateTasksListFragment();
fragment.setArguments(bundle);
setCurrentFragment(fragment, CreateTasksListFragment.TAG);
}
/**
* Sets new fragment
* @param fragment
*/
public void setCurrentFragment(Fragment fragment, String fragmentTag){
getSupportFragmentManager().beginTransaction()
.replace(R.id.create_tasks_fragment_container, fragment)
.addToBackStack(fragmentTag)
.commit();
}
CreateTasksListFragment.java
mNewTaskFabButton.setOnClickListener(v -> {
Task task = new Task(mTasks.size() + 1);
mTasks.add(task);
Bundle bundle = new Bundle();
bundle.putParcelable(CreateTaskFragment.TASK_EXTRA, task);
CreateTaskFragment fragment = new CreateTaskFragment();
fragment.setArguments(bundle);
// Replacing fragment with the fragment to create a single task
getParentFragmentManager()
.beginTransaction()
.hide(CreateTasksListFragment.this)
.add(R.id.create_tasks_fragment_container, fragment)
.addToBackStack(null)
.commit();
});
CreateTaskFragment.java
mCreateTaskButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
...
FragmentManager fm = getParentFragmentManager();
Fragment fragment;
String fragmentTag = fm.getBackStackEntryAt(fm.getBackStackEntryCount() - 2).getName(); // -2 since it starts counting from 0 and we need the second-last transaction
Log.d("log1", fragmentTag);
fragment = fm.findFragmentByTag(fragmentTag);
Log.d("log2", String.valueOf(fragment == null));
fm.beginTransaction()
.remove(CreateTaskFragment.this)
.show(fragment)
.commit();
}
});
日志
2021-05-13 21:19:44.952 20865-20865/* D/log1: CreateTasksListFragmentTag
2021-05-13 21:19:44.952 20865-20865/* D/log2: true
標簽與我將第一筆交易放在后台時使用的標簽相同。
您從fm.getBackStackEntryAt(fm.getBackStackEntryCount() - 2).getName()
的name
是您傳遞給addToBackStack(String name)
的name
。 這是一個與片段關聯的標簽完全不同的概念。
如果要設置與片段關聯的標簽,則需要使用帶有標簽的版本將其設置為replace()
調用的一部分:
getSupportFragmentManager().beginTransaction()
.replace(R.id.create_tasks_fragment_container, fragment, fragmentTag)
.addToBackStack(fragmentTag)
.commit();
注意:您不應該將使用addToBackStack()
的片段事務與不使用addToBackStack()
() 的事務混合,因為這會破壞popBackStack()
和系統后退按鈕的行為(假設您沒有更改任何片段,因為最后一個addToBackStack()
事務)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.