簡體   English   中英

findFragmentByTag() 在現有的 fragmentTag 上返回 null

[英]findFragmentByTag() returns null on existing fragmentTag

我有一個帶有FragmentContainerActivity ,它只會顯示兩個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM