Я запутался, почему намерения не могут быть вызваны в классе фрагмента - PullRequest
0 голосов
/ 01 мая 2020

Привет всем, я, хафидср, я новичок в Kotlin, я не знаю, почему мой Intent не может быть вызван, и когда он заменяется на контекст, все равно ошибка, я использую recylerview во фрагменте, но когда я использую Intent во фрагменте, Intent не вызывается

FilmFragment.kt

class FilmFragment : Fragment(){

private lateinit var filmViewModel: FilmViewModel

private lateinit var adapter: MyAdapter

companion object {

    @JvmStatic
    fun newInstance() =
        FilmFragment().apply {
            arguments = Bundle().apply {
                // putInt(ARG_COLUMN_COUNT, columnCount)
            }
        }
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    arguments?.let {
        // columnCount = it.getInt(ARG_COLUMN_COUNT)
    }
}

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    filmViewModel =
        ViewModelProviders.of(this).get(FilmViewModel::class.java)
    val root = inflater.inflate(R.layout.fragment_film, container, false)
    val linearLayout: LinearLayout = root.findViewById(R.id.linear_home)
    filmViewModel.text.observe(viewLifecycleOwner, Observer {
        linearLayout.background
    })


    return root
}

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)

    val items = listOf(
        Model("Start Wars", "blalalal", R.drawable.film_1),
        Model("Conjuring", "Film bla bla", R.drawable.film_1),
        Model("Content 03", "Source", R.drawable.film_1),
        Model("Content 04", "Source", R.drawable.film_1),
        Model("Content 05", "Source", R.drawable.film_1),
        Model("Content 06", "Source", R.drawable.film_1),
        Model("Content 07", "Source", R.drawable.film_1),
        Model("Content 08", "Source", R.drawable.film_1),
        Model("Content 09", "Source", R.drawable.film_1),
        Model("Content 10", "Source", R.drawable.film_1)
    )

    adapter = MyAdapter()
    adapter.replaceItems(items)
    recylerViewFilm.adapter = adapter
}



class MyAdapter : RecyclerView.Adapter<MyAdapter.ViewHolder>() {
    private var items = listOf<Model>()
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.row_film, parent, false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val item = items[position]


        holder.titleTv.text = item.title
        holder.descriptionTv.text = item.desc
        holder.imageTv.setImageResource(item.image)

        holder.itemView.setOnClickListener {
            val model = items.get(position)
            var gTitle : String = model.title
            var gDescription : String = model.desc
            var gImageView : Int = model.image

            val intent = Intent(this, AnotherActivity::class.java)
            intent.putExtra("title",item.title)
            intent.putExtra("desc",item.desc)
            intent.putExtra("image",item.image)
        }
    }

    fun replaceItems(items: List<Model>) {
        this.items = items
        notifyDataSetChanged()
    }

    override fun getItemCount(): Int = items.size

    inner class ViewHolder(override val containerView: View) :
        RecyclerView.ViewHolder(containerView),
        LayoutContainer {
    }
}

}

, почему мое намерение красное, и когда оно заменяется контекстом, оно все равно получает ошибку

val intent = Intent(this, AnotherActivity::class.java)
            intent.putExtra("title",item.title)
            intent.putExtra("desc",item.desc)
            intent.putExtra("image",item.image)

Ответы [ 3 ]

1 голос
/ 01 мая 2020

Вместо

holder.itemView.setOnClickListener {
    val model = items.get(position)
    var gTitle : String = model.title
    var gDescription : String = model.desc
    var gImageView : Int = model.image

    val intent = Intent(this, AnotherActivity::class.java)
    intent.putExtra("title",item.title)
    intent.putExtra("desc",item.desc)
    intent.putExtra("image",item.image)
}

Я бы сделал

holder.itemView.apply {
     val model = items.get(position)
     var gTitle : String = model.title
     var gDescription : String = model.desc
     var gImageView : Int = model.image

     val intent = Intent(context, AnotherActivity::class.java)
     intent.putExtra("title",item.title)
     intent.putExtra("desc",item.desc)
     intent.putExtra("image",item.image)

     setOnClickListener {
         startActivity(intent)
     }

}

Эта вторая версия делает то, что говорит Tenfour04, и создает ваше намерение в представлении. Затем он запускает действие внутри onClickListener.

1 голос
/ 01 мая 2020

this относится к самому близкому классу переноса, который в этом случае является самим OnClickListener, который не является Context. Вы не можете передать context здесь, потому что ваш класс MyAdapter не имеет свойства context и не является внутренним классом вашего фрагмента. Вы можете получить ссылку на контекст из представления, такого как представление, переданное слушателю щелчка. Поскольку вы не указали аргумент view в своей лямбде, вы можете передать it.context в конструктор Intent. Или вы можете быть более точным для ясности:

    holder.itemView.setOnClickListener { view ->
        val model = items.get(position)
        var gTitle : String = model.title
        var gDescription : String = model.desc
        var gImageView : Int = model.image

        val intent = Intent(view.context, AnotherActivity::class.java)
        intent.putExtra("title",item.title)
        intent.putExtra("desc",item.desc)
        intent.putExtra("image",item.image)
    }

Другие альтернативы - сделать MyAdapter внутренним классом вашего фрагмента, чтобы он мог получить доступ к свойству context фрагмента, или добавить свойство Context в ваш конструктор MyAdapter.

0 голосов
/ 01 мая 2020

Пожалуйста, вставьте этот код, ваше намерение будет называться ..

val intent = Intent(context, AnotherActivity::class.java)
                intent.putExtra("title",item.title)
                intent.putExtra("desc",item.desc)
                intent.putExtra("image",item.image)
    context.startActivity(intent)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...