1

我有一个带有片段的导航抽屉及其使用androidx编译的活动,其中一个我想调用一个包含自定义caldroid的片段,直到现在它工作正常,但目前完成片段或更改为另一个片段logcat 调用此错误:

我在互联网上搜索并发现了一个类似的案例,https: //issuetracker.google.com/issues/135764330,它仅与使用 androidx 的项目有关,但我不知道如何将库中的更改应用于消除这个错误。

错误日志:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: edu.usil.staffmovil, PID: 29749
    java.lang.NullPointerException: Attempt to invoke virtual method 'boolean androidx.fragment.app.FragmentManagerImpl.isDestroyed()' on a null object reference
        at androidx.fragment.app.Fragment.performDetach(Fragment.java:2849)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1034)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
        at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManagerImpl.java:2659)
        at androidx.fragment.app.FragmentManagerImpl.dispatchDestroy(FragmentManagerImpl.java:2644)
        at androidx.fragment.app.Fragment.performDestroy(Fragment.java:2825)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1028)
        at androidx.fragment.app.FragmentManagerImpl$3$1.run(FragmentManagerImpl.java:1099)
        at android.os.Handler.handleCallback(Handler.java:746)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5443)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

片段中的代码:

public class EventHomeFragment extends Fragment {

public static final String TAG = "EventHomeFragment";
private int diaSemana=0, diaMes=0, mes=0, anio=0, diaSelect=0;
    private CaldroidFragment caldroid;
    private int altoContenido=0, altoFila=0, posicionScroll=0, altoMesAnio = 0, altoSemana = 0, mesVisible = 0, anioVisible = 0;
    private Calendar fechaSelect;
//More Definitions
//...
//...

public EventHomeFragment() {
        // Required empty public constructor
    }



@Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.savedInstanceState = savedInstanceState;
        fechaSelect = Calendar.getInstance();

        Calendar cal = Calendar.getInstance();
        diaSemana = cal.get(Calendar.DAY_OF_WEEK);
        diaMes = cal.get(Calendar.DAY_OF_MONTH);
        mes = cal.get(Calendar.MONTH);
        anio = cal.get(Calendar.YEAR);

        mesVisible = mes;
        anioVisible = anio;
setViewsComponentsAndEvents();
            fechaSelect.setTime(FechaUtils.getDateFromStringYYYYMMMDD( anio + "-" + ((mes + 1) < 10 ? ("0" + mes) : mes) + "-" + diaMes));
        }

private void setViewsComponentsAndEvents() {

    setDatosSemanaCabecera();
    setListarEventosPantalla();
    setCustomCaldroid();
    manejador_sliding.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (!expand) {
                expand();
            } else {
                collapse();
            }
        }
    });

    lista_eventos.post(new Runnable() {
        @Override
        public void run() {
            //Log.e("post","entramos");
            configurarViewsEventos();
        }
    });

}

private void setCustomCaldroid() {

    CaldroidListener listener = new CaldroidListener() {

        @Override
        public void onSelectDate(Date date, View view) {
            long currTime = System.currentTimeMillis();
            if(timeLastClick!=0){
                if(currTime - timeLastClick < ViewConfiguration.getDoubleTapTimeout()){
                    return;
                }
            }else{
                timeLastClick = currTime;
            }

            Calendar fecha = Calendar.getInstance();
            fecha.setTime(date);
            setFechaSelectedFromCalendar(fecha.get(Calendar.DAY_OF_WEEK), fecha.get(Calendar.DAY_OF_MONTH), fecha.get(Calendar.MONTH), fecha.get(Calendar.YEAR));

            if(lastSelected!=null){
                Calendar lastSelectedFecha = Calendar.getInstance();
                lastSelectedFecha.setTime(lastSelected);
                if(fecha.get(Calendar.DAY_OF_MONTH)==lastSelectedFecha.get(Calendar.DAY_OF_MONTH) &&
                        fecha.get(Calendar.MONTH)==lastSelectedFecha.get(Calendar.MONTH) &&
                        fecha.get(Calendar.YEAR)==lastSelectedFecha.get(Calendar.YEAR)){
                    mismaFecha=true;
                }else{
                    mismaFecha=false;
                }
                caldroid.clearBackgroundDrawableForDate(lastSelected);
            }else{
                mismaFecha = true;
            }
            //si el mes que se muestra es mayor que el mes de la fecha seleccionada
            //entonces se ha seleccionado la una fecha del mes anterior
            //se esta en la primera fila
            if(anio==anioVisible) {
                if (mesVisible > mes) {
                    posicionScroll = 0;
                }
                if (mesVisible < mes) {
                    Calendar fechaPrimero = Calendar.getInstance();
                    fechaPrimero.set(anioVisible, mesVisible, 1);
                    fechaPrimero.setMinimalDaysInFirstWeek(1);
                    int semanaMes = fechaPrimero.getActualMaximum(Calendar.WEEK_OF_MONTH);
                    posicionScroll = altoFila * (semanaMes - 1);
                }
                if(mesVisible==mes){
                    int semanaMes = fechaSelect.get(Calendar.WEEK_OF_MONTH);
                    posicionScroll = 0;
                    if(semanaMes>1){
                        posicionScroll = altoFila*(semanaMes-1);
                    }
                }
            }

            if(anioVisible>anio){
                posicionScroll = 0;
            }

            if(anioVisible<anio){
                Calendar fechaPrimero = Calendar.getInstance();
                fechaPrimero.set(anioVisible, mesVisible, 1);
                fechaPrimero.setMinimalDaysInFirstWeek(1);
                int semanaMes = fechaPrimero.getActualMaximum(Calendar.WEEK_OF_MONTH);
                posicionScroll = altoFila * (semanaMes - 1);
            }

            lastSelected = date;
//                caldroid.setBackgroundResourceForDate(R.color.color_evento_selected, lastSelected);
            caldroid.refreshView();

            moveScrollToDateSelected();

            if(expand && !mostrarMensaje && moveScrollToDateSelected()){
                collapse();
            }

        }
    };

    caldroid = new CaldroidFragment();

    Bundle args = new Bundle();
    Calendar fecha = Calendar.getInstance();
    fecha.setTime(FechaUtils.getDateFromStringYYYYMMMDD(anio + "-" + (mes + 1) + "-" + diaMes));
    args.putInt(CaldroidFragment.MONTH, fecha.get(Calendar.MONTH) + 1);
    args.putInt(CaldroidFragment.YEAR, fecha.get(Calendar.YEAR));
    args.putInt(CaldroidFragment.THEME_RESOURCE, R.style.CaldroidEventosUsil);
    args.putInt(CaldroidFragment.START_DAY_OF_WEEK, CaldroidFragment.MONDAY);
    args.putBoolean(CaldroidFragment.SIX_WEEKS_IN_CALENDAR, false);

    caldroid.setBackgroundDrawableForDate(getResources().getDrawable(R.color.color_evento_selected), fechaSelect.getTime());
    caldroid.setArguments(args);
    trans = getChildFragmentManager().beginTransaction();
    trans.addToBackStack(null);
    trans.replace(R.id.fragment_custom_caldroid, caldroid);
//        trans.remove();
    trans.commit();


}


}
4

1 回答 1

4

通过使用更新版本的 Caldroid 解决了我的问题。尝试使用 @roomorama 创建的https://github.com/vpotvin/CaldroidX

该库与较新版本的 Android 片段和 AndroidX 兼容。

仅替换 Caldroid 依赖项解决了我的问题。将 Gradle 文件中的依赖项更改为以下

  implementation 'com.github.vpotvin:caldroidx:1.0'
于 2019-12-05T14:45:47.707 回答