Quero iniciar outra atividade no Android, mas recebo este erro:
Especifique a invocação do construtor; classificador 'Page2' não tem um objeto complementar
após instanciar a Intent
classe. O que devo fazer para corrigir o erro? Meu código:
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)
}
}
android
kotlin
android-intent
android-activity
J Adonai Dagdag
fonte
fonte
Respostas:
Para iniciar um
Activity
em java que escrevemosIntent(this, Page2.class)
, basicamente você tem que definirContext
no primeiro parâmetro e a classe de destino no segundo parâmetro. De acordo com oIntent
método no código-fonte -Como você pode ver, temos que passar o
Class<?>
tipo no segundo parâmetro.Ao escrever
Intent(this, Page2)
, nunca especificamos que passaremos de classe, estamos tentando passar umclass
tipo que não é aceitável.Use o
::class.java
que é alternativo.class
no kotlin. Use o código abaixo para iniciar o seuActivity
Exemplo -
fonte
::class.java
vez de.class
? A abordagem Kotlin é incomumente complicada, em comparação com Java.class
retorna um KotlinKClass
, mas o Android espera um JavaClass<...>
, daí a.java
propriedade.Simplesmente você pode começar um
Activity
emKOTLIN
usando este método simples,fonte
putExtra
método. Acabei de adicioná-lo para passar valores ao começar de novoActivity
Para iniciar uma nova atividade,
Portanto, altere seu código para:
fonte
Geralmente, você pode simplificar a especificação do parâmetro
BlahActivity::class.java
definindo uma função genérica reificada embutida.Porque isso permite que você faça
Ou ainda mais simples
Então é agora
fonte
inline fun <reified T: Activity> Context.createIntent(vararg extras: Pair<String, Any?>) = Intent(this, T::class.java).apply { putExtras(bundleOf(*extras)) }
vez do que eu disse e vai funcionar (supondo que você tenhabundleOf
do android-ktx ou anko)Você tem que dar o segundo argumento do tipo de classe. Você também pode deixá-lo um pouco mais arrumado como abaixo.
fonte
Tente isto
fonte
Esta é a minha atividade principal, onde pego o nome de usuário e a senha da edição de texto e configuração para a intenção
Esta é a minha segunda atividade onde eu tenho que receber os valores da atividade principal
fonte
Isso ocorre porque sua
Page2
classe não tem um objeto companheiro que seja semelhante aostatic
Java para usar sua classe. Para passar sua classe como um argumento paraIntent
, você terá que fazer algo assimfonte
De atividade para atividade
Do fragmento à atividade
fonte
Bem, descobri que essas 2 maneiras são as mais simples de todos os resultados:
Caminho # 1:
Forma # 2: (de uma forma genérica)
fonte
fonte
Eu tive um problema semelhante, comecei a escrever meu aplicativo em Kotlin, depois de reescrever uma de minhas atividades, eu queria ver se havia algum problema, o problema era que eu não tinha certeza de como enviar um intent do arquivo java para kotlin Arquivo.
Neste caso, criei uma função estática em kotlin (objeto companheiro), esta função está obtendo um contexto (da atividade atual) e retornando a nova intenção ao usar o contexto atual (contexto "java") ao usar a classe kotlin (" :: class.java ").
Aqui está o meu código:
fonte
@JvmStatic
ao seunewIntent
método, poderá chamá-lo de java sem aCompanion
parte.Detalhes
Etapa 1. Aplicativo ()
Etapa 2. Adicionar objeto Roteador
Uso
fonte
Lembre-se de adicionar a atividade que deseja apresentar ao seu
AndroidManifest.xml
também :-) Esse era o problema para mim.fonte
Que tal considerar o encapsulamento?
Por exemplo:
fonte
Você pode usar arquivos Kotlin e Java em seu aplicativo.
Para alternar entre os dois arquivos, certifique-se de fornecer a eles <action android: name = "" em AndroidManifest.xml, como:
Em seguida, em seu MainActivity.kt (arquivo Kotlin), para iniciar uma atividade escrita em Java, faça o seguinte:
Em seu MainActivityJava.java (arquivo Java), para iniciar uma Activity escrita em Kotlin, faça o seguinte:
fonte
outra maneira simples de navegar para outra atividade é
fonte