无法添加片段

时间:2018-04-09 08:01:25

标签: java android android-fragments

我现在已经坚持了一段时间,并会对此提出任何指导。还不确定我的标题是否准确。在我的适配器中,我创建了一个新片段:

  

适配器代码:

cardAdoptDetailsFrag nextFrag = new cardAdoptDetailsFrag();

android.support.v4.app.Fragment callingFrag = ((FragmentActivity)context).getSupportFragmentManager().findFragmentByTag("TagFeedFragment");
FragmentTransaction ft = ((FragmentActivity)context).getSupportFragmentManager().beginTransaction();
ft.hide(callingFrag);
ft.add(R.id.fram, nextFrag,"cardAdoptDetailsFrag");
ft.addToBackStack("TagFeedFragment");
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();

然后在我管理所有片段的主要活动中,我试图检查" cardAdoptDetailsFrag"被添加。出于某种原因,我不能按照以下原则这样做。

  

按标记获取片段。以下是null对象引用失败的地方。

Fragment frag = getSupportFragmentManager().findFragmentByTag("cardAdoptDetailsFrag");
Log.d(TAG, "Check if added: "+frag.isAdded());

现在我知道我可以在方法中添加它并进行空检查并返回一个布尔值,但我知道我在这里做错了。因为我的其他片段是添加和删除工作,但它们是在主活动中启动的,其中" cardAdoptDetailsFrag"在适配器内部启动。

  

主要活动示例:

public class MainActivity extends AppCompatActivity implements adoptFeedFragment.OnFragmentInteractionListener,
        lostAndFoundFragment.OnFragmentInteractionListener,
        servicesFragment.OnFragmentInteractionListener,
        userMenuFragment.OnFragmentInteractionListener,
        showUserAdoptPostsFrag.OnFragmentInteractionListener{

    adoptFeedFragment adoptFeedFragment;
    lostAndFoundFragment lostAndFoundFragment;
    servicesFragment servicesFragment;
    userMenuFragment userMenuFragment;  


    ....

            @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
            adoptFeedFragment = new adoptFeedFragment();
            lostAndFoundFragment = new lostAndFoundFragment();
            servicesFragment = new servicesFragment();
            userMenuFragment = new userMenuFragment();

    ....

    //Here I can do for example:

    adoptFeedFragment.isAdded(); //Will simply return a boolean.

    //Or I can do a remove:

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.remove(adoptFeedFragment);

   //But I cannot do the below:

   Fragment frag = getSupportFragmentManager().findFragmentByTag("cardAdoptDetailsFrag");
   Log.d(TAG, "frag.isAdded(): "+frag.isAdded());

*****Edited Post. Ok lets say the frag is added. Why can I not remove it using the below.

public boolean isAdoptDetailsFragAdded() {
    Fragment frag = getSupportFragmentManager().findFragmentByTag("cardAdoptDetailsFrag");
    if(frag == null){
        return false;
    } else {
        return true;
    }
}

public Fragment getAdoptDetailsFrag() {
    return getSupportFragmentManager().findFragmentByTag("cardAdoptDetailsFrag");
}

//I'm unable to remove the fragment using the below:

Log.d(TAG, "showFeedFragment: "+isAdoptDetailsFragAdded()); <--returns true
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    if(isAdoptDetailsFragAdded()) {
        ft.remove(getAdoptDetailsFrag());
    }
    ft.commit();
//Now I check again wether it is still added. And still returns true even though I just removed it.
Log.d(TAG, "showFeedFragment: "+isAdoptDetailsFragAdded()); <-- Still returns true.

    }  

3 个答案:

答案 0 :(得分:0)

这是我在13个项目中使用的片段添加或替换方法。 您可以使用它并摆脱管理片段。

/**
     * replace or add fragment to the container
     *
     * @param fragment pass android.support.v4.app.Fragment
     * @param bundle pass your extra bundle if any
     * @param popBackStack if true it will clear back stack
     * @param findInStack if true it will load old fragment if found
     */
    public void replaceFragment(Fragment fragment, @Nullable Bundle bundle, boolean popBackStack, boolean findInStack) {
        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        String tag = fragment.getClass().getName();
        Fragment parentFragment;
        if (findInStack && fm.findFragmentByTag(tag) != null) {
            parentFragment = fm.findFragmentByTag(tag);
        } else {
            parentFragment = fragment;
        }
        // if user passes the @bundle in not null, then can be added to the fragment
        if (bundle != null)
            parentFragment.setArguments(bundle);
        else parentFragment.setArguments(null);
        // this is for the very first fragment not to be added into the back stack.
        if (popBackStack) {
            fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        } else {
            ft.addToBackStack(parentFragment.getClass().getName() + "");
        }
        ft.replace(R.id.main_frame_container, parentFragment, tag);
        ft.commit();
        fm.executePendingTransactions();
    }

此处R.id.main_frame_container在放置片段的活动布局中为FrameLayout

答案 1 :(得分:0)

执行null后,findFragmentByTag() getSupportFragmentManager().findFragmentByTag("cardAdoptDetailsFrag")会返回findFragmentByTag()

null将在两种情况下返回Fragment frag = getSupportFragmentManager().findFragmentByTag("cardAdoptDetailsFrag"); if (frag != null && frag.isAdded()) { // Do you task. Fragment is added } else { // Fragment is not added yet }

  1. 如果片段cardAdoptDetailsFrag尚未附加到视图(您没有为此片段调用add或replace)
  2. 您添加了该片段,但在搜索该片段时使用了不同的TAG。
  3. 确定问题是否属于非案例。

    现在的解决方案是,你可以修改你的逻辑,比如

    ItemsPresenter

答案 2 :(得分:0)

我没有通过长篇文章,但我只阅读了这一部分。

现在我再次检查它是否仍然添加。即使我刚删除它,仍然会返回true。

背后的原因是FragmentTransaction.commit不同步。 阅读提交方法的文档:

*安排此交易的提交。提交确实如此      *不会立即发生;它将被安排为主线程上的工作      *下次线程准备就绪时完成。*

如果您需要同步,请改用commitNow。