如何从onOptionsItemSelected替换片段?

时间:2018-02-14 14:10:05

标签: java android android-fragments

我有一个 AppCompatActivity ,它是该应用的主要 View 。 我有一个 OptionsMenu ,带有一个按钮,用于显示抽屉菜单,另一个按钮用于过滤结果(因为抽屉中的每个 MenuItem 是不同的 Listfragments )。

我需要完成的是,当点击 OptionsMenu 上的过滤器按钮时,打开一个包含所有过滤条件的片段

所以这是管理上述解释的代码:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_menu:

            if (drawer.isDrawerOpen(GravityCompat.START)) {
                hideDrawer();
            } else {
                showDrawer();
            }

            return true;
        case R.id.action_filter:

            fragmentManager = getFragmentManager();

            fragment = new FilterFragment();
            args.putInt("idList", idList);
            fragment.setArguments(args);

            fragmentManager.beginTransaction().replace(R.id.drawer_layout, fragment).commit();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

将片段显示出来,然后我得到 NPE

  

java.lang.NullPointerException:尝试在空对象引用上调用虚方法'void android.widget.TableRow.setVisibility(int)'

碎片onCreateViewMethod

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {

    setHasOptionsMenu(true);
    getActivity().invalidateOptionsMenu();
    skbrDays = getActivity().findViewById(R.id.seekBar);
    daysLostRow = getActivity().findViewById(R.id.daysLostRow);
    genderRow = getActivity().findViewById(R.id.genderRow);
    locationRow = getActivity().findViewById(R.id.locationRow);
    rgupGender = getActivity().findViewById(R.id.rgupGender);
    rgupType = getActivity().findViewById(R.id.rgupType);
    btnBreed = getActivity().findViewById(R.id.btnBreed);
    recyclerView = getActivity().findViewById(R.id.recyclerView);

    daysLostRow.setVisibility(View.VISIBLE);

    return inflater.inflate(R.layout.activity_filter, container, false);
}

好的,所以我得到了NPE,因为 getActivity()正在返回 null 。现在我不得不猜测,不是真的知道原因,那是因为我没有从活动中替换 onCreate 方法上的片段吗?

如果这就是我怎样才能从 onCreate 调用片段获得相同结果的原因?

1 个答案:

答案 0 :(得分:2)

将onCreateView中的代码替换为以下代码。

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
 View rootView = inflater.inflate(R.layout.activity_filter, container, false);
    setHasOptionsMenu(true);
    getActivity().invalidateOptionsMenu();
    skbrDays = rootView.findViewById(R.id.seekBar);
    daysLostRow = rootView.findViewById(R.id.daysLostRow);
    genderRow = rootView.findViewById(R.id.genderRow);
    locationRow = rootView.findViewById(R.id.locationRow);
    rgupGender = rootView.findViewById(R.id.rgupGender);
    rgupType = rootView.findViewById(R.id.rgupType);
    btnBreed = rootView.findViewById(R.id.btnBreed);
    recyclerView = rootView.findViewById(R.id.recyclerView);

    daysLostRow.setVisibility(View.VISIBLE);

    return rootView;
}