SwitchCompat Unresolved reference - Android Kotlin - android

I'm using a SwitchCompat in a fragment where I keep getting and Unresolved reference that don't let me compile.
I don't know where to look at any more.. I believe I have my gradle files how they are supposed to be but I still suspect is something from there..
Any idea what I might be doing wrong?
Thank you in advance!! Any tip would be very appreciated
My gradle files:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext.kotlin_version = "1.4.21"
ext.nav_version = '2.3.0'
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.1.1"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
And:
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'androidx.navigation.safeargs.kotlin'
}
android {
compileSdkVersion 30
buildToolsVersion "30.0.2"
defaultConfig {
applicationId "com.example.onemorepassword"
minSdkVersion 21
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
buildFeatures {
dataBinding true
}
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.3.2'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.2.1'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
//ViewModel
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'
}
I have my XML:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.SwitchCompat
android:id="#+id/lowLetters_switch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="30dp"
android:checked="true"
android:fontFamily="#font/nunito_sans_bold"
android:text="#string/switchLowLetters"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="#+id/lengthSize_seekBar" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
My Fragment:
package com.example.onemorepassword
import android.annotation.SuppressLint
import android.content.ClipData
import android.content.ClipboardManager
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.animation.Animation
import android.view.animation.AnimationUtils
import android.widget.Button
import android.widget.SeekBar
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import com.example.onemorepassword.databinding.OneMorePasswordFragmentBinding
class OneMorePasswordFragment : Fragment() {
private lateinit var binding: OneMorePasswordFragmentBinding
private lateinit var viewModel: OneMorePasswordViewModel
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
binding = DataBindingUtil.inflate<OneMorePasswordFragmentBinding>(inflater, R.layout.one_more_password_fragment, container, false)
viewModel = ViewModelProvider(this).get(OneMorePasswordViewModel::class.java)
//All fun that update UI from viewModel
savedGeneratedPass()
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
**val myLowLettersSwitch = binding.lowLettersSwitch
myLowLettersSwitch.setOnCheckedChangeListener { _, b ->
Toast.makeText(requireActivity(),b.toString(),Toast.LENGTH_SHORT).show(**)
}
......
More code...
....
**private fun switchLowLetters(): Boolean {
val myLowLettersSwitch= binding.lowLettersSwitch
return myLowLettersSwitch.isChecked
}**
....
More code...
And last my mainActivity
package com.example.onemorepassword
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import com.example.onemorepassword.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//setContentView(R.layout.activity_main)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
supportActionBar?.hide()
}
}

You need to add viewBinding true to buildFeatures in build.gradle (app) file in order to be able to use view binding.
Just replace:
buildFeatures {
dataBinding true
}
with:
buildFeatures {
dataBinding true
viewBinding true
}

Found out what was happening. Once you know it..!
I have to XML files for same Fragment, Portrait and Landscape.
Forgot to edit me Landscape XML file.... So in one I had <com.google.android.material.switchmaterial.SwitchMaterial> (or compat, does not matter)
and in other XML I only had
Maybe this will serve for someone to look into this before collapsing

Related

onClick at XML can't see method from viewmodel using Room & databinding

It seems I have some problem with kapt. I study Android and try to create app with Room and Coroutines.
I get this kind of mistakes:
enter image description here
and my onclicklistener at XML is underlined with red, and the mistake here is "Cannot find identifier 'onSave' ".
I also tried to set onclick listener at the fragment, but I got the same mistakes.
Neither invalidating caches nor rebuilding project helps.
AddViewModel.kt:
`package com.example.memorizewords.add
import android.app.Application
import androidx.lifecycle.*
import androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.Companion.APPLICATION_KEY
import androidx.lifecycle.viewmodel.CreationExtras
import com.example.memorizewords.database.Word
import com.example.memorizewords.database.WordDatabase
import com.example.memorizewords.database.WordDatabaseDao
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
class AddViewModel(
val database: WordDatabaseDao?,
application: Application) : AndroidViewModel(application) {
private val _targetWord = MutableLiveData<String>()
private val _nativeWord = MutableLiveData<String>()
private suspend fun insert(word: Word) {
database?.insert(word)
}
private fun onSave() {
runBlocking {
viewModelScope.launch(Dispatchers.IO) {}
// val newWord = Word(0L, _targetWord.value!!, _nativeWord.value!!, true)
val newWord = Word(0L, "String", "String", true)
insert(newWord)
}
}
companion object {
val Factory: ViewModelProvider.Factory = object : ViewModelProvider.Factory {
#Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(
modelClass: Class<T>,
extras: CreationExtras
): T {
val application = checkNotNull(extras[APPLICATION_KEY])
val dataSource = WordDatabase.getInstance(application).WordDatabaseDao
AddViewModel(dataSource, application)
return AddViewModel(dataSource, application) as T
}
}
}
}`
AddFragment.kt:
`package com.example.memorizewords.add
import android.os.Bundle
import android.view.LayoutInflater
import android.view.ViewGroup
import android.view.View
import android.widget.Toast
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import com.example.memorizewords.R
import com.example.memorizewords.databinding.FragmentAddBinding
class AddFragment : Fragment() {
private val viewModel: AddViewModel by viewModels { AddViewModel.Factory }
lateinit var targetWord: String
lateinit var nativeWord: String
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
val binding: FragmentAddBinding = DataBindingUtil.inflate(
inflater, R.layout.fragment_add, container, false)
binding.setLifecycleOwner(this)
binding.addViewModel = viewModel
}`
XML:
`<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="addViewModel"
type="com.example.memorizewords.add.AddViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="#+id/targetBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="#dimen/button_margin_left_right"
android:layout_marginEnd="#dimen/button_margin_left_right"
android:hint="#string/enterTarget"
android:textSize="#dimen/edit_text_size"
app:layout_constraintBottom_toTopOf="#+id/guideline2"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.Guideline
android:id="#+id/guideline2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.15" />
<EditText
android:id="#+id/nativeBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="#dimen/button_margin_left_right"
android:layout_marginEnd="#dimen/button_margin_left_right"
android:hint="#string/enterNative"
android:textSize="#dimen/edit_text_size"
app:layout_constraintBottom_toTopOf="#+id/guideline3"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="#id/guideline2" />
<androidx.constraintlayout.widget.Guideline
android:id="#+id/guideline3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.3" />
<Button
android:id="#+id/saveButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="#dimen/save_button_margin"
android:layout_marginEnd="#dimen/save_button_margin"
android:text="#string/save"
android:textSize="#dimen/button_text_size"
android:onClick="#{() -> addViewModel.onSave()}" //onSave here is underlined with red
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="#+id/guideline3"
app:layout_constraintVertical_bias="0.1" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>`
module's build.gradle
`plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-kapt'
id 'androidx.navigation.safeargs.kotlin'
}
android {
compileSdk 32
defaultConfig {
applicationId "com.example.memorizewords"
minSdk 21
targetSdk 32
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
buildFeatures {
dataBinding true
viewBinding true
}
}
dependencies {
// Android KTX
implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.appcompat:appcompat:1.5.1'
implementation 'com.google.android.material:material:1.7.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
// ViewModel and LiveData
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.5.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'
// Navigation
implementation 'androidx.navigation:navigation-fragment-ktx:2.5.3'
implementation 'androidx.navigation:navigation-ui-ktx:2.5.3'
// Room and Lifecycle dependencies
implementation "androidx.room:room-runtime:2.4.3"
kapt "androidx.room:room-compiler:2.4.3"
// Kotlin Extensions and Coroutines support for Room
implementation("androidx.room:room-ktx:2.4.3")
// Coroutines
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1"
// Testing
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.4'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0'
implementation 'com.jakewharton.timber:timber:4.7.1'
}`
app's build.gradle
`plugins {
id 'com.android.application' version '7.2.0' apply false
id 'com.android.library' version '7.2.0' apply false
id 'org.jetbrains.kotlin.android' version '1.7.10' apply false
id 'androidx.navigation.safeargs.kotlin' version '2.4.1' apply false
}
task clean(type: Delete) {
delete rootProject.buildDir
}`

Cannot find identifier 'currentItem' in Kotlin using Android Studio 4.2

First of all, I'm new into kotlin and I found issues within my learning process. So I found these errors:
"Cannot find identifier 'Current Item"
The errors occured in the xml file. here is code of the xml file:
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="args"
type="com.example.todoapp.fragments.update.UpdateFragment" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="24dp"
tools:context=".fragments.update.UpdateFragment">
<EditText
android:id="#+id/current_title_et"
android:layout_width="0dp"
android:layout_height="60dp"
android:background="#drawable/custom_input"
android:ems="10"
android:hint="#string/title"
android:inputType="textPersonName"
android:paddingStart="24dp"
android:paddingEnd="24dp"
android:text="#{args.currentItem.title}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Spinner
android:id="#+id/current_priorities_spinner"
android:layout_width="0dp"
android:layout_height="60dp"
android:layout_marginTop="8dp"
android:background="#drawable/custom_input"
android:entries="#array/priorities"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:parsePriorityToInt="#{args.currentItem.priority}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="#+id/current_title_et" />
<EditText
android:id="#+id/current_description_et"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="8dp"
android:background="#drawable/custom_input"
android:ems="10"
android:gravity="top|start"
android:hint="#string/description"
android:inputType="textMultiLine"
android:paddingStart="24dp"
android:paddingTop="16dp"
android:paddingEnd="24dp"
android:text="#{args.currentItem.description}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="#+id/current_priorities_spinner" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
and this is the kt file
package com.example.todoapp.fragments.update
import android.app.AlertDialog
import android.os.Bundle
import android.view.*
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
import com.example.todoapp.R
import com.example.todoapp.data.models.ToDoData
import com.example.todoapp.data.viewmodel.ToDoViewModel
import com.example.todoapp.databinding.FragmentUpdateBinding
import com.example.todoapp.fragments.SharedViewModel
class UpdateFragment : Fragment() {
private val args by navArgs<UpdateFragmentArgs>()
private val mSharedViewModel: SharedViewModel by viewModels()
private val mToDoViewModel: ToDoViewModel by viewModels()
private var _binding: FragmentUpdateBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
// Data binding
_binding = FragmentUpdateBinding.inflate(inflater, container, false)
// Set Menu
setHasOptionsMenu(true)
// Spinner Item Selected Listener
binding.currentPrioritiesSpinner.onItemSelectedListener = mSharedViewModel.listener
return binding.root
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.update_fragment_menu, menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.menu_save -> updateItem()
R.id.menu_delete -> confirmItemRemoval()
}
return super.onOptionsItemSelected(item)
}
private fun updateItem() {
val title = binding.currentTitleEt.text.toString()
val description = binding.currentDescriptionEt.text.toString()
val getPriority = binding.currentPrioritiesSpinner.selectedItem.toString()
val validation = mSharedViewModel.verifyDataFromUser(title, description)
if (validation) {
// Update Current Item
val updatedItem = ToDoData(
args.currentItem.id,
title,
mSharedViewModel.parsePriority(getPriority),
description
)
mToDoViewModel.updateData(updatedItem)
Toast.makeText(requireContext(), "Successfully updated!", Toast.LENGTH_SHORT).show()
// Navigate back
findNavController().navigate(R.id.action_updateFragment_to_listFragment)
} else {
Toast.makeText(requireContext(), "Please fill out all fields.", Toast.LENGTH_SHORT)
.show()
}
}
// Show AlertDialog to Confirm Item Removal
private fun confirmItemRemoval() {
val builder = AlertDialog.Builder(requireContext())
builder.setPositiveButton("Yes") { _, _ ->
mToDoViewModel.deleteItem(args.currentItem)
Toast.makeText(
requireContext(),
"Successfully Removed: ${args.currentItem.title}",
Toast.LENGTH_SHORT
).show()
findNavController().navigate(R.id.action_updateFragment_to_listFragment)
}
builder.setNegativeButton("No") { _, _ -> }
builder.setTitle("Delete '${args.currentItem.title}'?")
builder.setMessage("Are you sure you want to remove '${args.currentItem.title}'?")
builder.create().show()
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
this is the plugin and dependency
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: "kotlin-kapt"
apply plugin: "androidx.navigation.safeargs.kotlin"
apply plugin: "kotlin-parcelize"
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "com.example.todoapp"
minSdkVersion 26
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
buildFeatures{
dataBinding = true
viewBinding = true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8.toString()
}
}
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation 'androidx.core:core-ktx:1.5.0'
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
// Navigation Component
implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5'
implementation 'androidx.navigation:navigation-ui-ktx:2.3.5'
// Room components
implementation "androidx.room:room-runtime:2.3.0"
kapt "androidx.room:room-compiler:2.3.0"
implementation "androidx.room:room-ktx:2.3.0"
androidTestImplementation "androidx.room:room-testing:2.3.0"
// Lifecycle components
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
implementation "androidx.lifecycle:lifecycle-common-java8:2.3.1"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
// Kotlin components
api "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0-native-mt"
api "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0-native-mt"
}
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.2.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.10"
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.3.5"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
Any help or explanation would be appreciated

How to solve an error `None of the following functions can be called with the arguments supplied.` with show()

I'm currently developing an application using android-studio with Kotlin.
I want to use a bottom sheet, but when I call the show() method I have an error and I have no idea how to solve it...
When I hover a cursor on the show() I have this error message.
None of the following functions can be called with the arguments supplied.
・show(FragmentManager!, String!) defined in com sample.myprojectname.BottomSheetFragment
・show(FragmentTransaction!, String!) defined in com sample.myprojectname.BottomSheetFragment
How can I solve this error?
Here are the codes:
build.gradle
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.sample.bottomsheetvalue"
minSdkVersion 16
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:2.0.1'
implementation 'com.android.support:support-v4:28.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.google.android.material:material:1.0.0'
}
MainActivity.kt
package com.sample.bottomsheetvalue
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val button = findViewById<Button>(R.id.button)
button.setOnClickListener {
val bottomSheet = BottomSheet()
bottomSheet.show(supportFragmentManager,"navigation_bottom_sheet")
//↑ I have the error here
}
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:text="Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="#+id/button"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
/>
</android.support.constraint.ConstraintLayout>
BottomSheet.kt
package com.sample.bottomsheetvalue
import android.os.Bundle
import android.support.v4.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
class BottomSheet : BottomSheetDialogFragment()
{
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_bottom_sheet, container, false)
return view
}
}
fragment_bottom_sheet.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".BottomSheet">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="#string/hello_blank_fragment"/>
</FrameLayout>
Android Studio : 3.3.2

Kotlin-Android-Extension doesn't work across module?

I'm using Kotlint 1.3.50 and Android Studio 3.4
I have my code
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
my_txt.text = "ABC"
}
}
Any my layout as below
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="#+id/my_txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
</android.support.constraint.ConstraintLayout>
Everything compiles fine if they are in the same module.
However, if I move my layout to an android library, with gradle as below
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 28
defaultConfig {
minSdkVersion 21
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
I can still import kotlinx.android.synthetic.main.activity_main.* and Android Studio doesn't complaint. But, when I compile, it complaints
Unresolved reference: activity_main
Unresolved reference: my_txt
Looks like the kotlin-extension can't cross use layout from another library?
If I change to findViewById<TextView>(R.id.my_txt).text = "XYZ", it works fine.
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
findViewById<TextView>(R.id.my_txt).text = "XYZ"
}
}

Databingding V2 and kotlin,I can not find my BR?

Yesterday, I updated my Android Studio to 3.1. So I can only use Databinding V2.I can build successfully in Java.But fail in Kotlin.It told me Unresolved reference: BR
layout
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="mainViewModel"
type="com.example.shao.myapplication.ViewModel" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="#{mainViewModel.title}"/>
</LinearLayout>
</layout>
in Java
public class MainActivity2 extends AppCompatActivity {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setVariable(BR.mainViewModel, new ViewModel());
}
public static int getMainBr() {
return BR.mainViewModel;
}
}
in kotlin
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val mBinding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
mBinding.setVariable(BR.mainViewModel, ViewModel())
}
}
Android’s Data Binding with Kotlin
First of all, after having a created Android project in Android Studio, we need to add the Data Binding dependency and the ones of Kotlin to the build.gradle file of our app.
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
android {
....
dataBinding {
enabled = true
}
}
dependencies {
...
// notice that the compiler version must be the same than our gradle version
kapt 'com.android.databinding:compiler:2.3.1'
}
First we need to create a model. In this case a basic one like User.kt
data class User(val name: String, val age: Int)
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<variable
name="user"
type="com.kuma.sample.User"
/>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.kuma.sample.MainActivity"
>
<TextView
android:id="#+id/user_name_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:text="#{user.name}"
tools:text="Name"
/>
<TextView
android:id="#+id/user_age_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:text="#{Integer.toString(user.age)}"
tools:text="XX"
/>
</LinearLayout>
</layout>
Kotlin Class
package com.kuma.sample
import android.databinding.DataBindingUtil
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import com.kuma.kotlinsteps.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
val user = User("Kuma", 23)
binding.setVariable(BR.user, user)
binding.executePendingBindings()
}
}
Solve Error Br
enter code hereapply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 24
buildToolsVersion "24.0.0"
defaultConfig {
applicationId "com.example.icarusud.recyclerviewtest"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
dataBinding {
enabled true
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.1.1'
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
//recyclerview
compile "com.android.support:recyclerview-v7:24.1.1"
//lastadapter
compile 'com.github.nitrico.lastadapter:lastadapter:1.1.1'
kapt "com.android.databinding:compiler:2.1.2"
}
repositories {
mavenCentral()
}
kapt { generateStubs = true }
Change your gradle setting according to below code try this code it helps you.
change
mBinding.setVariable(BR.mainViewModel, ViewModel())
to
mBinding.mainViewModel=ViewModel()
I worked around this issue by adding a BRUtils.java, then in the Kotlin files, accessing BR values in BRUtils.java
BRUtils.java:
/**
* since {#link BR} cannot be resolved in kotlin files during compile time
* for some reason, created this file to hold getters for {#link BR} fields
* that can then be accessed from said kotlin files.
*/
public class BRUtils {
private BRUtils() {}
public static int getMainViewModel() {
return BR.mainViewModel;
}
}
something.kt:
binding.setVariable(BRUtils.getMainViewModel(), ViewModel())

Categories

Resources