Как установить заголовок и текст в FragmentDialog? - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть MainActivity, содержащее 5 фрагментов, 2 из которых имеют значок справки на панели инструментов в правом верхнем углу.Я спрятал эту иконку на 3 других фрагмента.При нажатии на значок справки появляется диалоговое окно с заголовком, сообщением и положительной кнопкой.

Это мой код диалога оповещения:

public class HelpDialogFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("Help");
        builder.setMessage("Placeholder");
        builder.setPositiveButton("Got It", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {}
            });
        return builder.create();
    }
}

, и вот как я его показываюMainActivity:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_help:
            DialogFragment helpDialog = new HelpDialogFragment();
            helpDialog.show(getSupportFragmentManager(), "dialogHelp");
            return true;
    }
    return super.onOptionsItemSelected(item);
}

Приведенный выше код работает, но я хотел бы показать другое сообщение в зависимости от выбранного фрагмента, так как изменить сообщение?Я пытался это изменить, чтобы изменить заголовок

helpDialog.getDialog().setTitle("Some Text");

Обратите внимание, что я хочу изменить диалоговое сообщение, т. Е. Основное содержимое. Я получил только метод setTitle() для getDialog(), а не setMessage(), указанный выше setTitleэто просто для примера, но даже он генерирует исключение NullPointerException.

enter image description here

Как вы можете видеть на скриншоте выше, текст по умолчанию является текстом по умолчаниюЯ добавил во время создания AlertDialog, но как теперь его изменить?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Сначала передайте требуемое сообщение через пакет при вызове класса HelpDialogFragment

HelpDialogFragment helpDialog = new HelpDialogFragment();

Bundle bundle = new Bundle();
bundle.putString("placeholder", "Custom placeholder");
helpDialog.setArguments(bundle);
helpDialog.show(getSupportFragmentManager(), "dialogHelp");

Теперь измените свой класс HelpDialogFragment и создайте диалоговое окно, подобное этому

public class HelpDialogFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("Help");
        if (getArguments() != null) 
            builder.setMessage(getArguments().getString("placeholder",""));
        builder.setPositiveButton("Got It", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {}
            });
        return builder.create();
    }
}
0 голосов
/ 27 сентября 2018

После прочтения вашего поста и комментариев кажется, что вам нужно установить разные заголовки в зависимости от того, какой фрагмент виден.И создание диалогов происходит из Activity, поэтому вы не уверены, какой заголовок установить.

Проблема заключается в том, чтобы идентифицировать видимый фрагмент и установить сообщение в соответствии с ним.

Вы можете передать сообщение с такими аргументами.

Fragment fragment = new Fragment();
Bundle bundle = new Bundle();
bundle.putString(message, "My title");
fragment.setArguments(bundle);  

Затем в своем фрагментеполучить данные (например, в методе onCreate ())

Bundle bundle = this.getArguments();
if (bundle != null) {
        String message = bundle.getString(message, defaultValue);
}

Как определить видимый в данный момент фрагмент?Вы можете сделать это, как предложено в этих ответах.Как только вы получите текущий фрагмент, просто отправьте сообщение в приведенных выше аргументах в соответствии с ним.

Объединив две вышеупомянутые идеи, вы можете сделать это.

Другим способом будет запуск диалогаиз фрагмента, а не из Деятельности, но это потребовало бы большего количества изменений, поэтому вышеуказанный подход лучше.

...