Kotlin Android начинает новую деятельность
Я хочу начать еще одно действие на Android, но я получаю эту ошибку:
Пожалуйста, укажите вызов конструктора; У классификатора 'Страница2' нет сопутствующего объекта
после создания экземпляра класса Intent
. Что я должен сделать, чтобы исправить ошибку? Мой код:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
fun buTestUpdateText2 (view: View) {
val changePage = Intent(this, Page2)
// Error: "Please specify constructor invocation;
// classifier 'Page2' does not have a companion object"
startActivity(changePage)
}
}
Ответы
Ответ 1
Чтобы запустить Activity
в java, мы написали Intent(this, Page2.class)
, в основном вам нужно определить Context
в первом параметре и целевом классе во втором параметре. Согласно методу Intent
в исходном коде -
public Intent(Context packageContext, Class<?> cls)
Как вы можете видеть, мы должны передать Class<?>
Type во втором параметре.
Написав Intent(this, Page2)
мы никогда не укажем, что мы собираемся передать класс, мы пытаемся передать тип class
который неприемлем.
Используйте ::class.java
который является альтернативой .class
в kotlin. Используйте приведенный ниже код, чтобы начать свою Activity
Intent(this, Page2::class.java)
Пример -
val intent = Intent(this, NextActivity::class.java)
// To pass any data to next activity
intent.putExtra("keyIdentifier", value)
// start your next activity
startActivity(intent)
Ответ 2
Вы можете попробовать это,
val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("key", value)
startActivity(intent)
Ответ 3
Чтобы начать новую активность,
startActivity(Intent([email protected],RequiredClassName::class.java)
Поэтому измените свой код на:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
fun buTestUpdateText2 (view: View) {
startActivity(Intent([email protected],ClassName::class.java))
// Also like this
val intent = Intent([email protected],ClassName::class.java)
startActivity(intent)
}
Ответ 4
Попробуй это
val intent = Intent(this, Page2::class.java)
startActivity(intent)
Ответ 5
Вы должны указать второй аргумент типа класса. Вы также можете сделать его немного более аккуратным, как показано ниже.
startActivity(Intent(this, Page2::class.java).apply {
putExtra("extra_1", value1)
putExtra("extra_2", value2)
putExtra("extra_3", value3)
})
Ответ 6
Это связано с тем, что ваш класс Page2
не имеет объекта-компаньона, который аналогичен static
в Java, поэтому для использования вашего класса. Чтобы передать свой класс в качестве аргумента в Intent
, вам нужно будет сделать что-то вроде этого
val changePage = Intent(this, Page2::class.java)
Ответ 7
Обычно вы можете упростить спецификацию параметра BlahActivity::class.java
встроенную встроенную функцию.
inline fun <reified T: Activity> Context.createIntent() =
Intent(this, T::class.java)
Потому что это позволяет
startActivity(createIntent<Page2>())
Или даже проще
inline fun <reified T: Activity> Activity.startActivity() {
startActivity(createIntent<T>())
}
Итак, теперь
startActivity<Page2>()
Ответ 8
Это моя основная деятельность, когда я беру имя пользователя и пароль из текста редактирования и установки на намерение
class MainActivity : AppCompatActivity() {
val userName = null
val password = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener {
val intent = Intent([email protected],SecondActivity::class.java);
var userName = username.text.toString()
var password = password_field.text.toString()
intent.putExtra("Username", userName)
intent.putExtra("Password", password)
startActivity(intent);
}
}
Это мой второй вид деятельности, когда мне нужно получать значения из основного вида деятельности
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
var strUser: String = intent.getStringExtra("Username")
var strPassword: String = intent.getStringExtra("Password")
user_name.setText("Seelan")
passwor_print.setText("Seelan")
}
Ответ 9
От деятельности к деятельности
val intent = Intent(this, YourActivity::class.java)
startActivity(intent)
От фрагмента до активности
val intent = Intent(activity, YourActivity::class.java)
startActivity(intent)
Ответ 10
подробности
- Android Studio 3.1.4
- Версия Котлина: 1.2.60
Шаг 1. Применение()
Получить ссылку на контекст вашего приложения
class MY_APPLICATION_NAME: Application() {
companion object {
private lateinit var instance: MY_APPLICATION_NAME
fun getAppContext(): Context = instance.applicationContext
}
override fun onCreate() {
instance = this
super.onCreate()
}
}
Шаг 2. Добавьте объект Router
object Router {
inline fun <reified T: Activity> start() {
val context = MY_APPLICATION_NAME.getAppContext()
val intent = Intent(context, T::class.java)
context.startActivity(intent)
}
}
использование
// You can start activity from any class: form Application, from any activity, from any fragment and other
Router.start<ANY_ACTIVITY_CLASS>()