繁体   English   中英

从片段中运行代码时应用程序崩溃

[英]App crashes when running code from in fragment

我正在 android studio 中制作我的第一个应用程序。 到目前为止,我已经使用片段构建了一个底部导航栏。 我现在正在尝试向其中一个片段添加日历功能,我复制了一个使用活动来运行代码的教程,并认为使用“视图”存在问题。

这是打开导航栏以打开片段的代码。

 @Override
        public boolean onNavigationItemSelected(MenuItem item) {
            switch (item.getItemId()){
                case R.id.home:
                    getSupportFragmentManager().beginTransaction().replace(R.id.container,homeFragment).commit();
                    return true;
                case R.id.calendar:
                    getSupportFragmentManager().beginTransaction().replace(R.id.container,calendarFragment).commit();
                    return true;
                case R.id.wellbeing:
                    getSupportFragmentManager().beginTransaction().replace(R.id.container,wellbeingFragment).commit();
                    return true;
            }

            return false;

这是我的日历片段中的 java,当从导航栏打开时,应用程序会崩溃

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    initWidgets();
    selectedDate = LocalDate.now();
    setMonthView();

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

}

private void initWidgets()
{
    calendarRecyclerView = requireView().findViewById(R.id.calendarRecyclerView);
    monthYearText = requireView().findViewById(R.id.monthYearTV);
}

private void setMonthView()
{
    monthYearText.setText(monthYearFromDate(selectedDate));
    ArrayList<String> daysInMonth = daysInMonthArray(selectedDate);

    CalendarAdapter calendarAdapter = new CalendarAdapter(daysInMonth, this);
    RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getContext(),7);
    calendarRecyclerView.setLayoutManager(layoutManager);
    calendarRecyclerView.setAdapter(calendarAdapter);
}

这是我在 logcat 中收到的错误消息

2022-05-12 12:45:05.305 10950-10950/com.example.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.myapplication, PID: 10950
    java.lang.IllegalStateException: Fragment CalendarFragment{c4de180} (94b1c782-ca39-403f-b45b-5d0d7a042f15 id=0x7f080087) did not return a View from onCreateView() or this was called before onCreateView().
        at androidx.fragment.app.Fragment.requireView(Fragment.java:1964)
        at com.example.myapplication.CalendarFragment.initWidgets(CalendarFragment.java:41)
        at com.example.myapplication.CalendarFragment.onCreateView(CalendarFragment.java:30)
        at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2963)
        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:518)
        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282)
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189)
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2100)
        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2002)
        at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:524)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loopOnce(Looper.java:201)
        at android.os.Looper.loop(Looper.java:288)
        at android.app.ActivityThread.main(ActivityThread.java:7842)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)

我相信日历代码中没有错误,并且与片段代码中的onCreateView有关。

在从onCreateView()返回非空值之前,您不能调用requireView() ) 。

移动这些行

initWidgets();
selectedDate = LocalDate.now();
setMonthView();

(其中initWidgets()调用 requireView( requireView() )从onCreateView()到例如onViewCreated()

是的,它崩溃了,因为在返回 inflater 之前没有从 fragment_calendar 布局调用 findViewById,因此在 return 语句之后调用的任何内容都不会被执行,并将返回 NullPointerException。 除非你重写 onViewCreated 方法并记下代码

所以为了避免这种情况,你需要重写 onViewCreated 方法或者你必须返回视图。 请记住,如果要返回视图,则必须在返回视图语句之前到达所有代码或公共方法。 否则会因为异常而崩溃

检查此代码,它将正确修复

public class TestFragment extends Fragment {
RecyclerView calendarRecyclerView;
TextView monthYearText;
@Nullable
@org.jetbrains.annotations.Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable @org.jetbrains.annotations.Nullable ViewGroup container, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
    selectedDate = LocalDate.now();
    return inflater.inflate(R.layout.fragment_calendar, container, false);
}

@Override
public void onViewCreated(@NonNull View view, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    initWidgets(view);
    setMonthView();
}

private void initWidgets(View view) {
    calendarRecyclerView = view.findViewById(R.id.calendarRecyclerView);
    monthYearText = view.findViewById(R.id.monthYearTV);
}

private void setMonthView() {
    monthYearText.setText(monthYearFromDate(selectedDate));
    ArrayList<String> daysInMonth = daysInMonthArray(selectedDate);
    
    CalendarAdapter calendarAdapter = new CalendarAdapter(daysInMonth, getActivity());
    RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getActivity(), 7);
    calendarRecyclerView.setLayoutManager(layoutManager);
    calendarAdapter.setAdapter(calendarAdapter);
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM