Android получает OutOfMemoryError при создании экземпляра DialogFragment - PullRequest
0 голосов
/ 13 февраля 2019

Я читаю это от Google об использовании DialogFragment.Все работает до раздела Создание пользовательского макета : когда вызов сделан для отображения DialogFragment с пользовательским макетом, я получаю исключение OutOfMemoryError.

Я просто немного изменил кодиз статьи, и мое приложение содержит только 3 элемента ниже:

MainActivity.kt

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setSupportActionBar(toolbar)

        fab.setOnClickListener { view ->
            showDialog()
        }
    }


    fun showDialog() {
        // Create an instance of the dialog fragment and show it
        val dialog = FireMissilesDialogFragment()
        dialog.show(supportFragmentManager, "NoticeDialogFragment")
    }

}

FireMissilesDialogFragment.kt

class FireMissilesDialogFragment : DialogFragment() {

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

            // Inflate and set the layout for the dialog
            // Pass null as the parent view because its going in the dialog layout
            builder.setView(layoutInflater.inflate(R.layout.dialog_layout, null))
                // Add action buttons
                .setPositiveButton(R.string.ok) { dialog, id ->
                    Log.d("FireMissiles", "TEST")
                }
                .setNegativeButton(R.string.cancel) { dialog, id ->
                    getDialog().cancel()
                }
            builder.create()
        } ?: throw IllegalStateException("Activity cannot be null")
    }
}

dialog_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content">

    <EditText
            android:id="@+id/username"
            android:inputType="textEmailAddress"
            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:hint="@string/ok" android:importantForAutofill="no"/>
    <EditText
            android:id="@+id/password"
            android:inputType="textPassword"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="4dp"
            android:layout_marginLeft="4dp"
            android:layout_marginRight="4dp"
            android:layout_marginBottom="16dp"
            android:fontFamily="sans-serif"
            android:hint="@string/cancel" android:importantForAutofill="no"/>
</LinearLayout>

Мой код содержит только эти 3 элемента выше.Я предполагаю, что где-то есть утечка памяти, но я не могу ее найти.

У кого-то есть идея?


Ответы на комментарии и решение:

@ Сэм Я не использую никакое изображение, этот проект - просто попытка использовать DialogFragment, следовательно, он основан на стандартном пустом Activity проекте с потрясающим, единственное, что я не показал, это activity_main.xml, но этостандартный.

@ Тобиас, спасибо за подсказку, но это не решило проблему: (

@ user8159708, спасибо !! это решило проблему. Мой код теперь (иэто единственное, что я изменил):

class FireMissilesDialogFragment : DialogFragment() {

    lateinit var mView: View

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        mView = inflater.inflate(R.layout.dialog_layout, container, false)

        setDialog()

        return mView
    }

    fun setDialog(){
        activity?.let {
            val builder = AlertDialog.Builder(it)

            // Inflate and set the layout for the dialog
            // Pass null as the parent view because its going in the dialog layout
            builder.setView(mView)
                // Add action buttons
                .setPositiveButton(R.string.ok) { dialog, id ->
                    Log.d("FireMissiles", "TEST")
                }
                .setNegativeButton(R.string.cancel) { dialog, id ->
                    Log.d("FireMissiles", "TEST")
                    //getDialog().cancel()
                }
            builder.create()
        } ?: throw IllegalStateException("Activity cannot be null")
    }
}

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Я думаю, вы делаете это неправильно.Вам не нужно использовать AlertDialog.Builder, поскольку вы уже выходите из DialogFragment.

Вы можете перейти по этой ссылке .

Это на Java, но на Kotlinэто будет похоже.

0 голосов
/ 13 февраля 2019

Не создавайте свой диалог, используя построитель оповещений.

Удалите переопределение onCreateDialog.

Увеличьте ваш взгляд в onCreateView:

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.dialog_layout, container, false)
    }

Добавьте несколько кнопок в свой макет самостоятельно и установите свои onClickListeners вручную после того, как накачаете свой вид.

0 голосов
/ 13 февраля 2019

Звучит как цикл.

Попробуйте удалить getDialog().cancel() и просто вместо этого вернуть ноль.

Вам не нужно явно закрывать Dialog es.

...