从另一个Fragment调用方法时出现NullPointerException

时间:2017-07-14 09:29:20

标签: android android-fragments instance detach

我正在尝试按照用户@sunil-sunny的一个给定示例,即

  

您可以像这样创建静态变量

static  FragmentB f;

public static FragmentB newInstance(String title) {
        FragmentB f = new FragmentB();
        Bundle b = new Bundle();
        b.putString(ARG_STATION_TITLE, title);
        f.setArguments(b);
        return f;
    }
     

您可以使用getInstance()方法获取实例   fragmentB

public static FragmentB getInstance(){
    return f;
}
     

像这样调用FragmentB.getInstance().methodinFragmentB();

但出于某种原因,我得到了NullPointerException

在我的片段中,我有:

static ProductListFragment fragment;

    public static ProductListFragment newInstance(Category category, SubCategory subCategory) {
        Bundle args = new Bundle();
        args.putParcelable(AppConstants.FLAG_CATEGORY, category);
        args.putParcelable(AppConstants.FLAG_SUBCATEGORY, subCategory);
        ProductListFragment fragment = new ProductListFragment();
        fragment.setArguments(args);
        return fragment;
    }

    public static ProductListFragment getInstance(){
        return fragment;
    }

在另一个片段中,我调用方法detachFragment来关闭当前片段并重新加载上一个片段中更新的列表:

// We close the fragment and reload the list
public void detachFragment(String tag) {
    transition.reverseTransition(100);
    FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
    Fragment fragment = fragmentManager.findFragmentByTag(tag);
    if (fragment != null) {
        fragmentManager
               .beginTransaction()
               .disallowAddToBackStack()
               .setCustomAnimations(R.anim.slide_up_bottom_sheet, R.anim.slide_down_bottom_sheet)
               .remove(fragment)
               .commitNow();

        ProductListFragment.getInstance().reloadProducts(); // Reload Fragment
    }
}

Logcat sais,下一行返回Null:

...
ProductListFragment.getInstance().reloadProducts(); // Reload Fragment
...

3 个答案:

答案 0 :(得分:0)

当你调用ProductListFragment.getInstance().reloadProducts();时,你从这个函数返回static ProductListFragment fragment但是static ProductListFragment fragment是没有初始化的,返回null。

答案 1 :(得分:0)

使用以下代码

static ProductListFragment fragment;
public static ProductListFragment newInstance(Category category, SubCategory subCategory) {
    Bundle args = new Bundle();
    args.putParcelable(AppConstants.FLAG_CATEGORY, category);
    args.putParcelable(AppConstants.FLAG_SUBCATEGORY, subCategory);
//Replace this line 
   // ProductListFragment fragment = new ProductListFragment();
//with this
fragment = new ProductListFragment();
    fragment.setArguments(args);
    return fragment;
}

public static ProductListFragment getInstance(){
    return fragment;
}

答案 2 :(得分:0)

正如Jaydeep Patel sais所说:

  

检查此行ProductListFragment fragment = new   ProductListFragment();并删除ProductListFragment

我删除了一个新片段ProductListFragment的声明,它正在工作。我正在初始化相同变量(同名)的2倍。