Краш диалога при передачи данных во фрагмент

308
27 октября 2017, 11:28

Пытаюсь передать данные по этому примеру и в результате приложение падает.

public void startTimer(View v) {
    int vOtd = getIntent().getExtras().getInt("otd");
    int sec = vOtd * 1000;
    forTimer ft = new forTimer();
    Bundle bundleMin = new Bundle();
    bundleMin.putInt("sec", sec);
    ft.setArguments(bundleMin);
    android.app.FragmentManager fm = getFragmentManager();
    fm.beginTransaction().replace(fragment3, ft).commit();
    DialogFragment newFragment = new timer();
    newFragment.show(getSupportFragmentManager(), "timer");
}

Принимаю во фрагменте

Bundle bundleMin = getArguments();
if (bundleMin != null) {
    int rInfo = bundleMin.getInt("sec");
}

Что я делаю не так?

Answer 1

Создайте метод newInstance во фрагменте, в который будете передавать нужные параметры. Например, уровень прогресса для ProgressBar в окне. Не переопределяйте конструктор фрагмента

public static MyDialog newInstance(int levelProgress) {
    MyDialog instance = new MyDialog();
    Bundle args = new Bundle();
    args.putInt(LEVEL_PROGRESS, text);
    instance.setArguments(args);
    return instance;
}

В onCreateView фрагмента нужно создавать View для диалога. Туда и приходит наш Bundle.

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle args) {
    View v = inflater.inflate(R.layout.dialog, null);
    ProgressBar level = v.findViewById(R.id.dialog_level);
    int levelProgress = args.getInt(LEVEL_PROGRESS);
    level.setProgress(levelProgress);
    return v;
}

Или, в onCreateDialog():

@Override
public Dialog onCreateDialog(Bundle args) {
    AlertDialog.Builder alert = new AlertDialog.Builder(getActivity())
        .setTitle("Alert")
        .setMessage("Уровень: " + args.getInt(LEVEL_PROGRESS));
    return alert.create();
}

LEVEL_PROGRESS это ключ для данных в Bundle. Вам нужно создать константу во фрагменте:

private static final String LEVEL_PROGRESS = "levelProgress";

Теперь можно использовать наш диалог так:

MyDialog dialog = MyDialog.newInstance(50);
dialog.show(getFragmentManager(), /*тэг*/);

Транзакция происходит внутри метода show, вам о ней думать не надо. Тэгом может быть хоть что, если не надо, киньте null.

READ ALSO
Как понять этот кусок кода? [дубликат]

Как понять этот кусок кода? [дубликат]

На данный вопрос уже ответили:

215
Паттерн для instanceof

Паттерн для instanceof

Есть несколько классов, далее идет проверка классов через instanceof, если передали такой класс тогда выполнить такие то действияКакой паттерн...

194
Файл настроек websphere

Файл настроек websphere

Ну удается запустить websphere application server после изменения настроек памяти, начальный размер кучи и максимальный я оставил поля пустыми, не запускается...

206
Список популярных библиотек CAS на Java

Список популярных библиотек CAS на Java

Например: JAS (Java Algebra System)Вопрос в том, какие еще библиотеки существуют для использования? И какие из них можно использовать на Android?

231