0
Kotlin error 'this' is not defined in this context and more errors - please help
Dear SoloLearners I am a Kotlin beginner and want to follow a video tutorial about making a record audio request function by a click of an simple button. Sadly, I am not able to run the code without any errors. I tried it since a few weeks but like I said: I am a beginner. Please, can someone help me? Here is the Code snipped and a picture of the errors: https://code.sololearn.com/ca20A12A14a2/?ref=app https://www.sololearn.com/post/907892/?ref=app Thank you for every help. kind regards Frederik
11 ответов
+ 5
Let's remove slideshowViewModel part of code and add to the onviewcreated().
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
//Button button = findViewById(R.id.btn_send);
//Clear this code from onviewcreate()
slideshowViewModel=
ViewModelProviders.of(this).get(SlideshowViewModel::class.java)
slideshowViewModel.text.observe(this, Observer {
})
btn_send.setOnClickListener {
requestRecordAudioPermission()
}
}
If it doesn't seems to resolve the problem try 'requestContext()' or 'activity!!' instead of 'this'.
+ 3
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
//Button button = findViewById(R.id.btn_send);
btn_send.setOnClickListener {
requestRecordAudioPermission()
}
}
Part -2
+ 3
private fun hasRecordAudioPermission() =
ActivityCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED
private fun requestRecordAudioPermission(){
var permissionsToRequest = mutableListOf<String>()
if(!hasRecordAudioPermission())
permissionsToRequest.add(Manifest.permission.RECORD_AUDIO)
if(permissionsToRequest.isNotEmpty()){
ActivityCompat.requestPermissions(this, permissionsToRequest.toTypedArray(),0)
}
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if(requestCode == 0 && grantResults.isNotEmpty()) {
for(i in grantResults.indices) {
if(grantResults [i] == PackageManager.PERMISSION_GRANTED) {
Log.d("PermissionsRequest", "${permissions[i]} granted.")
}
}
}
}
}
Part-3
+ 3
This will surely reduce some errors, click Listener part of the code should be placed inside onviewcreated() after view is created.but I still have little or no idea about the main problem of your code as I'm not familiar with kotlin. It took me a while to realize some basic things inside this code. But let's see how far can we go.
+ 2
Frederik
suggestion
use
```kt
// implement activity-ktx, fragment-ktx libs to gradle file
val myViewMidel: SlideshowViewModel by
viewModels
```
Instead of viewModelProvider which is deprecated
And also
Change
```kt
viewMiodel.observe(getActivity, Observer{
})
```
TO
```kt
viewMiodel.observe(activity){
}
```
+ 1
I'm not fully aware of what's happening with your code, but I can vividly point the onecreateview() part of the code.
First of all SlideshowFragment is not activity it is a fragment, so 'this' keyword is violiting with code. Alternative is you can try getActivity() or an context, don't know it will work out well or failed, just replace the below code with your existing onconcreteview(). And see what happens.
private lateinit var slideshowViewModel: SlideshowViewModel
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?, savedInstanceState: Bundle?
): View? {
val slideshowViewModel =
ViewModelProviders.of(getActivity()).get(SlideshowViewModel::class.java)
val root = inflater.inflate(R.layout.fragment_edward, container, false)
slideshowViewModel.text.observe(getActivity(), Observer {
})
return root
}
+ 1
There is missing curlybrace in your button clicklistner.
I recently figured out that kotlin deals differently with context, so instead of getActivity()
we need requireActivity() .
- Replace your code with this one
Button button = findViewById(R.id.btn_send);
btn_send.setOnClickListener {
requestRecordAudioPermission()
//TODO: solve error(s)
}
private lateinit var slideshowViewModel: SlideshowViewModel
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
slideshowViewModel =
ViewModelProviders.of(requireActivity()).get(SlideshowViewModel::class.java)
val root = inflater.inflate(R.layout.fragment_edward, container, false)
slideshowViewModel.text.observe(requireActivity(), Observer {
})
return root
}
If still errors remain, than I should look at your SlideshowViewModel class.
+ 1
Try this :
package com.example.testapp.ui.slideshow
import android.Manifest
import android.content.pm.PackageManager
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.app.ActivityCompat
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import com.example.testapp.R
class SlideshowFragment : Fragment() {
private lateinit var slideshowViewModel: SlideshowViewModel
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?, savedInstanceState: Bundle?
): View? {
val slideshowViewModel =
ViewModelProviders.of(getActivity()).get(SlideshowViewModel::class.java)
val root = inflater.inflate(R.layout.fragment_edward, container, false)
slideshowViewModel.text.observe(getActivity(), Observer {
})
return root
}
Part-1
0
Thank you for your answer, 0_O-[Mägár_Sám_Äkà_Nüllpøïntêr_Èxëcéptïön]~~ .
I replaced your Code and back then, I have diffrent (4) errors now. I added the button onclick listener, which I had previously just in comments and sadly, there are 27 errors now. I hope you can find another bug in this Code. Thank you so much that you said that the code would be for an activity. Not for a fragment. I didn't noticed that. Now, fore than half of the errors are comprehensible for me.
Followed the new Code and the new post of the errors...
https://www.sololearn.com/post/909368/?ref=app
https://code.sololearn.com/ca20A12A14a2/?ref=app
Thank you all again for every help.
0
Thank you. 0_O-[Mägár_Sám_Äkà_Nüllpøïntêr_Èxëcéptïön]~~
I really start to realize, that this "simple android template" is actually very difficult. Especially because I am a beginner. I hope that I will be able to learn to understand this whole Code once.
However, here is the Code of the SlideshowViewModel.kt file:
https://code.sololearn.com/cOd8mkkDb97T/?ref=app
Following my error list:
https://www.sololearn.com/post/909771/?ref=app
0
Wow! Thank you so much. I learn to understand the Code more and more. What exactly are those errors with the 'this'?
I hope I can understand and solve those.
https://www.sololearn.com/post/909880/?ref=app