添加和删​​除片段空指针

时间:2014-12-22 18:16:58

标签: android android-fragments nullpointerexception

我有两个片段在主要活动中,我想在发生某些事情时刷新它们。

现在代码适用于第二个片段,但不适用于第一个片段,我不知道为什么。

我一直在看代码大约一个小时,我似乎无法找到原因。

这是代码

public class MainActivity extends FragmentActivity {

    Fragment frag,frag2;
    FragmentManager fm;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String screen = getString(R.string.screen_type);

        /*
         * Get a reference to fragment manager
         * Wire the container to represent fragment
         */
        fm = getSupportFragmentManager();
        frag = fm.findFragmentById(R.id.container);
        if(screen.equals("large")){
            frag2 = fm.findFragmentById(R.id.containerDetails);
            loadFragments(frag,frag2,fm);
        }
        /*Loads the fragment into the activity*/
        else
            loadFragment(frag,fm);

    }

    private void loadFragments(Fragment frag, Fragment frag2, FragmentManager fm) {
        if(frag == null && frag2 == null){

            frag = new DisplayFragment();
            frag2 = new DetailsFragment();
            fm.beginTransaction().add(R.id.container,frag).add(R.id.containerDetails, frag2).commit();

        }   
    }

    private void loadFragment(Fragment frag, FragmentManager fm) {

        if(frag == null){

            frag = new DisplayFragment();
            fm.beginTransaction().add(R.id.container,frag).commit();

        }
    }

    public void updateDetails(int position) {
        // Reload current fragment
        if(frag2!=null)fm.beginTransaction().remove(frag2).commit();
        frag2 = new DetailsFragment();
        Bundle b = new Bundle();
        b.putInt("Id",position);
        frag2.setArguments(b);
        fm.beginTransaction().add(R.id.containerDetails, frag2).commit();
    }

    public void updateDisplay() {
        // Reload current fragment
        if(frag!=null)fm.beginTransaction().remove(frag).commit(); //THIS IS ALWAYS NULL FOR SOME REASON
        frag = new DisplayFragment();
        fm.beginTransaction().add(R.id.container, frag).commit();
    }

    public void refreshDetails() {
        // Reload current fragment
        if(frag2!=null)fm.beginTransaction().remove(frag2).commit();
        frag2 = new DetailsFragment();
        fm.beginTransaction().add(R.id.containerDetails, frag2).commit();
    }
}

第一个片段始终为null,并且不会被删除,而是粘贴另一个片段,并造成混乱。

1 个答案:

答案 0 :(得分:1)

尝试使用replace()方法而不是add()