我有一个 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 调用片段获得相同结果的原因?
答案 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;
}