Как передать список в Spinner в зависимости от выбранного пункта в другом Spinner?

Делаю приложение для автоматических расчетов некоторых испытаний в области материаловедения. Есть диалоговое окно DialogFragment, в котором находятся два Spinner'а. В первом из них пользователь выбирает стандарт испытания, как показано на скрине. После выбора стандарта в первом спиннере во втором спиннере должен появиться набор параметров в зависимости от выбранного стандарта. Подскажите, пожалуйста, как это реализовать.

Отдельный XML со спиннерами в диалоговом окне:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <Spinner
        android:id="@+id/methods"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:layout_marginLeft="4dp"
        android:layout_marginRight="4dp"
        android:layout_marginBottom="4dp"
        android:entries="@array/methods" />

    <Spinner
        android:id="@+id/time"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="4dp"
        android:layout_marginTop="16dp"
        android:layout_marginRight="4dp"
        android:layout_marginBottom="10dp" />

</LinearLayout>

Набор массивов для второго спиннера находится в strings.xml:

<resources>
    <string name="app_name">Measurements Calculator</string>
    <string name="testing_method_title">Configure testing parameters</string>
    <string name="testing_method_dialogue">Стандарт испытания</string>
    <string name="measurement_time_dialogue">Время между отрезами</string>
    <string name="okay">ОК</string>
    <string name="cancel">Отменить</string>

    <string-array name="methods">
        <item>ГОСТ 11645</item>
        <item>ISO 1133</item>
        <item>ASTM D1238</item>
    </string-array>

    <string-array name="timeGost">
        <item>240</item>
        <item>120</item>
        <item>60</item>
        <item>30</item>
        <item>10 – 15</item>
        <item>5 – 15</item>
    </string-array>

    <string-array name="timeIso">
        <item>240</item>
        <item>120</item>
        <item>60</item>
        <item>30</item>
        <item>5 – 15</item>
    </string-array>

    <string-array name="timeAstm">
        <item>200</item>
        <item>100</item>
        <item>50</item>
        <item>20</item>
    </string-array>
</resources>

MainActivity.kt:

class MainActivity : AppCompatActivity() {

    lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        binding.settingsButton.setOnClickListener { openSettingsWindow() }

        val methodsList = findViewById<Spinner>(R.id.methods)
    }

    private fun openSettingsWindow(){
        var settingsDialog = SettingsDialog()
        settingsDialog.show(supportFragmentManager, "NoticeDialogFragment")
    }


}

class SettingsDialog : DialogFragment() {

    private val methods = arrayOf("ГОСТ 11635", "ISO 1133", "ASTM D1238")

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        return activity?.let {
            val builder = AlertDialog.Builder(it)

            val inflater = requireActivity().layoutInflater

            builder.setTitle("Параметры испытания")
                .setView(inflater.inflate(R.layout.dialog_settings, null))
                .setPositiveButton(R.string.okay,
                    DialogInterface.OnClickListener { dialog, id ->
                    })
                .setNegativeButton(R.string.cancel,
                    DialogInterface.OnClickListener { dialog, id ->
                    })
            // Create the AlertDialog object and return it
            builder.create()
        } ?: throw IllegalStateException("Activity cannot be null")
    }

введите сюда описание изображения


Ответы (1 шт):

Автор решения: Andrew

После выбора данных в первом спиннере вы можете скрывать ваш DialogFragment() передавая при этом в активность какие-то данные:

parentFragmentManager.setFragmentResult(
     "filter_data",
     Bundle().apply {
       putInt("filter_data", 3)
})

dialog?.dismiss()

дальше в активности вы делаете слушатель на прилетающие в него данные:

supportFragmentManager.apply {
    setFragmentResultListener("filter_data",
     viewLifecycleOwner, FragmentResultListener { _, result ->
           result.getInt("filter_data")
     })
}

и в этом же слушателе можно сделать выбор у спиннера по полученному индексу.

→ Ссылка