Как передать аргументы в диалог в Android? - PullRequest
0 голосов
/ 11 июня 2019

Я вызываю диалог с аргументами следующим образом:

MyDialog("title", "message").show(this@MyActivity.supportFragmentManager, null)

А это мой класс диалога:

class MyDialog(private val theTitle: String, private val theMessage: String) : DialogFragment() {
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        return activity.let {
            val myBuilder = AlertDialog.Builder(it)
            myBuilder
                .setTitle(theTitle)
                .setMessage(theMessage)
                .setPositiveButton("OK") { _, _ -> }
            myBuilder.create()
        }
    }
}

Но когда ориентация устройства меняется при вращении, приложение перестает работать. Этого не произойдет, если не будет передано никаких аргументов. Итак, как передать аргументы и как это лучше всего сделать?

Ответы [ 4 ]

1 голос
/ 11 июня 2019

Полное решение с использованием kotlin

Шаг 1. Создайте свой класс, как следует

class MyDialog : DialogFragment() {

    private var title: String? = null
    private var message: String? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        arguments?.let {
            title = it.getString(ARG_TITLE)
            message = it.getString(ARG_MESSAGE)
        }
    }

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        return activity.let {
            val myBuilder = AlertDialog.Builder(it)
                myBuilder
                    .setTitle(title)
                    .setMessage(message)
                    .setPositiveButton("OK") { _, _ -> }
            myBuilder.create()
        }
    }

    companion object {
        const val TAG = "myDialog"
        private const val ARG_TITLE = "argTitle"
        private const val ARG_MESSAGE = "argMessage"

        fun newInstance(title: String, message: String) = MyDialog().apply {
            arguments = Bundle().apply {
                putString(ARG_TITLE, title)
                putString(ARG_MESSAGE, message)
            }
        }
    }
}

Шаг 2. Создайте экземпляр и покажитеэто

MyDialog.newInstance("title", "message").show(this@MyActivity.supportFragmentManager, MyDialog.TAG)

Это все!

1 голос
/ 11 июня 2019

Если это фрагмент, то всегда должен быть доступен конструктор по умолчанию. Отдельная передача аргументов обеспечит сохранение аргументов при изменении состояния фрагмента
Так что есть метод setArgument (Bundle), в котором вы можете передавать свои параметры. Так что здесь ваш звонок должен быть переписан как

class MyDialog: DialogFragment() {
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        return activity.let {
             val arg = arguments
            // Use the parameters by accessing the key from variable "arg"
            val myBuilder = AlertDialog.Builder(it)
            myBuilder
                .setTitle(theTitle)
                .setMessage(theMessage)
                .setPositiveButton("OK") { _, _ -> }
            myBuilder.create()
        }
    }
}

Вы называете Диалог так:

val d = MyDialog()
val b = Bundle()
b.putInt("KEY1",1)
d.arguments = b
d.show(FragmentManager,Tag)

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

0 голосов
/ 11 июня 2019

Причина, по которой вы должны передавать параметры через пакет, заключается в том, что когда система восстанавливает фрагмент (например, при изменении конфигурации), она автоматически восстанавливает ваш пакет.

Источник: https://stackoverflow.com/a/16042750/619673

Вместо создания DialogFragment - вам нужно создать экземпляр, вызвав статический метод из его класса:

public static MyDialog newInstance(String param1) {
    MyDialog d = new MyDialog ();

    Bundle args = new Bundle();
    args.putString("param1", param1);
    d.setArguments(args);

    return d;
}

И когда вы хотите показать его, вы вызываете:

MyDialog dialog = MyDialog .newInstance("lorem ipsum");
dialog.show(fm, "fragment_confirm_dialog");

Источник: https://stackoverflow.com/a/15463986/619673

0 голосов
/ 11 июня 2019

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

    private void confirmdialog(String msg_str) {

    final Dialog dialog = new Dialog(this);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setCancelable(false);
    dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
    LayoutInflater li = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View v1 = li.inflate(R.layout.dialog_forsurity, null, false);
    dialog.setContentView(v1);
    dialog.setCancelable(true);


    TextView msg = (TextView) v1.findViewById(R.id.msg);
    msg.setText(msg_str);

    Button btn_submit = (Button) v1.findViewById(R.id.btn_submit);


    btn_submit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            dialog.dismiss();

            Intent intent = new Intent(SellNumberPlateActivity.this, HomeActivity.class);
            startActivity(intent);
            finishAffinity();

        }
    });

    dialog.show();
    Window window = dialog.getWindow();
    window.setLayout(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);

}

Здесь R.layout.dialog_forsurity - это дизайн вашего диалога ...

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