DatePickerDialog не работает во фрагменте - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть эта проблема при добавлении DataPickerDialog, структура проекта является примером компоновки ящика для android studio.

package asaek.ikusi.ikusi_1.ui.home
import android.app.DatePickerDialog
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.fragment.app.Fragment
import asaek.ikusi.ikusi_1.MainActivity
import asaek.ikusi.ikusi_1.R
import kotlinx.android.synthetic.main.fragment_home.*
import java.text.SimpleDateFormat
import java.util.*

class HomeFragment : Fragment(){

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val root = inflater.inflate(R.layout.fragment_home, container, false)
        val textVFecha: TextView = root.findViewById(R.id.textView_Fecha)
        val textVHora: TextView = root.findViewById(R.id.textView_Hora)
        val textVFecha_Atencion: TextView = root.findViewById(R.id.textView_Fecha_atencion)

        textVFecha_Atencion.setOnClickListener {
            val c = Calendar.getInstance()
            val year = c.get(Calendar.YEAR)
            val month = c.get(Calendar.MONTH)
            val day = c.get(Calendar.DAY_OF_MONTH)
            val pickDate = DatePickerDialog(this, DatePickerDialog.OnDateSetListener{ view, year, monthOfYear, dayOfMonth ->
                //Asignandole al textview
                textVFecha_Atencion.setText("" + dayOfMonth + " - " + (monthOfYear+1) + " - " + year)
            }, year, month, day)
            pickDate.show()
        }

        val dateFormat = SimpleDateFormat("dd-MM-yyyy", Locale.getDefault())
        val timeFormat = SimpleDateFormat("hh:mm:ss a", Locale.getDefault())

        val fechaActual = dateFormat.format(Date())
        val horaActual = timeFormat.format(Date())

        textVFecha.setText(fechaActual)
        textVHora.setText(horaActual)
        return root
    }
}

Ошибка выдает его в «This» и выдает следующее «Несоответствие типов»:Предполагаемый тип - HomeFragment, но ожидаемый контекст "

    val pickDate = DatePickerDialog(this, DatePickerDialog.OnDateSetListener{ view, year, monthOfYear, dayOfMonth ->

1 Ответ

0 голосов
/ 30 сентября 2019

Добро пожаловать в SO, Асаэль.

this в этом месте / контексте относится к экземпляру DatePickerDialog.OnDateSetListener, потому что именно там вы находитесь в точке выполнения;вам нужен Context, а именно контекст, который может управлять темой (например, фрагмент или контекст действия), чтобы ваш диалог соответствовал вашей теме. OnDateSetListener не является контекстом ...

Измените его, например:

val pickDate = DatePickerDialog(requireContext(), DatePickerDialog.OnDateSetListener...

Откуда берется requireContext ()?

Это происходит из Fragment класса:


    /**
     * Return the {@link Context} this fragment is currently associated with.
     *
     * @throws IllegalStateException if not currently associated with a context.
     * @see #getContext()
     */
    @NonNull
    public final Context requireContext() {
        Context context = getContext();
        if (context == null) {
            throw new IllegalStateException("Fragment " + this + " not attached to a context.");
        }
        return context;
    }

Как DateSetListener может получить доступ к методу из фрагмента?

Это хитрый, но ваш DateSetListener()анонимный экземпляр класса DateSetListener и анонимные классы в java имеют прямой доступ к родительскому / содержащему класс. Вот почему вы можете позвонить requireContext() из своего анонимного класса, содержащегося в Fragment.

Если бы вы скопировали и вставили свой код в другой класс, класс, который не является фрагментом, вы получили бы ошибку компиляции (если ваш класс another не имеет метод requireContext(), то есть.

:)

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