Перезагрузить фрагмент, когда из DatePickerFragment onDateSet - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь обновить / перезагрузить фрагмент после того, как я установил другую дату. Поэтому я создал DatePickerFragment, который расширяет DialogFragment и реализует DatePickerDialog.OnDateSetListener.

Внутри моей функции onDataSet у меня есть этот код:

FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction ft = fragmentManager.beginTransaction();
    Fragment reload = fragmentManager.findFragmentByTag("mealsworkoutsfrag");
    Bundle bundle = new Bundle();
    bundle.putString("newdate",date);
    ft.detach(reload);
    reload.setArguments(bundle);
    ft.attach(reload);
    ft.commit();

Теперь, если я запустил это, я получаю сообщение об ошибке в строке reload.setArgs, говорящее

"Попытка вызвать виртуальный метод 'void android.support.v4.app.Fragment.setArguments(android.os.Bundle)' для пустой ссылки на объект"

Кстати, в своей основной деятельности я создаю свой фрагмент так:

FragmentTransaction mealsworkoutsFrag = getSupportFragmentManager().beginTransaction();
        mealsworkoutsFrag.replace(R.id.flMain,new MealsWorkoutsFragment(),"mealsworkoutsfrag");
        mealsworkoutsFrag.commit();

Чего мне не хватает?

Редактировать: запрашивается дополнительный код

@Override
public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    int id = item.getItemId();

    if (id == R.id.mealworkoutTab) {
        iconShow = true;
        invalidateOptionsMenu();
        FragmentTransaction mealsworkoutsFrag = getSupportFragmentManager().beginTransaction();
        mealsworkoutsFrag.replace(R.id.flMain,new MealsWorkoutsFragment(),"mealsworkoutsfrag");
        mealsworkoutsFrag.commit();
    } else if (id == R.id.userinfoTab) {
        iconShow = false;
        invalidateOptionsMenu();
        FragmentTransaction userInfoFrag = getSupportFragmentManager().beginTransaction();
        userInfoFrag.replace(R.id.flMain,new UserInfoFragment(),"userinfofrag");
        userInfoFrag.commit();

    } else if (id == R.id.logoutTab) {
        auth.signOut();
    }

    DrawerLayout drawer = findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}

А вот указатель даты:

public class DatePickerFragment extends DialogFragment
    implements DatePickerDialog.OnDateSetListener {

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    // Use the current date as the default date in the picker
    final Calendar c = Calendar.getInstance();

    int year = c.get(Calendar.YEAR);
    int month = c.get(Calendar.MONTH);
    int day = c.get(Calendar.DAY_OF_MONTH);

    // Create a new instance of DatePickerDialog and return it
    return new DatePickerDialog(getActivity(), this, year, month, day);
}

public void onDateSet(DatePicker view, int year, int month, int day) {
    // Do something with the date chosen by the user
    final String d,m,y,date;

    month = month +1;

    if (String.valueOf(day).length() == 1) {
        d = "0"+day;
    }
    else {
        d = String.valueOf(day);
    }

    if (String.valueOf(month).length() == 1) {
        m = "0"+month;
    }
    else {
        m = String.valueOf(month);
    }

    y = String.valueOf(year);

    date = d+m+y;
    //EventBus.getDefault().post(new DateEvent(date));
    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction ft = fragmentManager.beginTransaction();
    Fragment reload = fragmentManager.findFragmentByTag("mealsworkoutsfrag");
    Bundle bundle = new Bundle();
    bundle.putString("newdate",date);
    ft.detach(reload);
    reload.setArguments(bundle);
    ft.attach(reload);
    ft.commit();

}

}

Вот как я называю сборщик дат:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.date_picker) {

        DialogFragment newFragment = new DatePickerFragment();
        newFragment.show(getSupportFragmentManager(), "datePicker");

        return true;
    }

    return super.onOptionsItemSelected(item);
}

1 Ответ

0 голосов
/ 04 июля 2019

Можете ли вы поделиться больше кода?

У вас может быть много ошибок во всей логике, которую вы используете. Например, к какому классу расширяются ваши действия и фрагменты, импортируются и т. Д.

Полагаю, возможно, используя getActivity (). GetFragmentManager (); в onDateSet работает.

Другим решением является добавление реализации прослушивателя во фрагмент и вызов его из onDateSet. (Связь между фрагментами).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...