簡體   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