Chcę rozpocząć inną aktywność na Androidzie, ale pojawia się ten błąd:
Proszę określić wywołanie konstruktora; klasyfikator „Strona 2” nie ma obiektu towarzyszącego
po utworzeniu instancji Intent
klasy. Co mam zrobić, aby poprawić błąd? Mój kod:
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
źródło
źródło
Odpowiedzi:
Aby uruchomić
Activity
w Javie, który napisaliśmyIntent(this, Page2.class)
, w zasadzie musisz zdefiniowaćContext
w pierwszym parametrze, a klasę docelową w drugim parametrze. Zgodnie zIntent
metodą w kodzie źródłowym -Jak widać,
Class<?>
w drugim parametrze musimy podać typ.Pisząc
Intent(this, Page2)
, nigdy nie określamy, że przejdziemy klasę, staramy się przekazaćclass
typ, który jest niedopuszczalny.Użyj,
::class.java
która jest alternatywą.class
w kotlin. Użyj poniższego kodu, aby rozpocząćActivity
Przykład -
źródło
::class.java
zamiast.class
? Podejście Kotlin jest niezwykle skomplikowane w porównaniu z Javą.class
zwraca KotlinKClass
, ale Android oczekuje JavaClass<...>
, stąd.java
właściwość.Po prostu można rozpocząć
Activity
wKOTLIN
tą metodą prostą,źródło
putExtra
metody. Po prostu dodałem go do przekazywania wartości podczas rozpoczynania nowegoActivity
Aby rozpocząć nową aktywność,
Więc zmień swój kod na:
źródło
Generalnie można uprościć specyfikację parametru
BlahActivity::class.java
, definiując wbudowaną, reifikowaną funkcję ogólną.Ponieważ to na to pozwala
Albo jeszcze prostsze
Więc to teraz
źródło
inline fun <reified T: Activity> Context.createIntent(vararg extras: Pair<String, Any?>) = Intent(this, T::class.java).apply { putExtras(bundleOf(*extras)) }
zamiast tego, co powiedziałem i zadziała (zakładając, że maszbundleOf
z android-ktx lub anko)Musisz podać drugi argument typu klasy. Możesz też trochę uporządkować, jak poniżej.
źródło
Spróbuj tego
źródło
To jest moja główna działalność, w której nazwa użytkownika i hasło są przenoszone z edycji tekstu i ustawień do celu
To moja druga aktywność, w której muszę otrzymać wartości z głównej działalności
źródło
Dzieje się tak, ponieważ Twoja
Page2
klasa nie ma obiektu towarzyszącego, który jest podobny do tegostatic
w Javie, więc aby użyć swojej klasy. Aby przekazać swoją klasę jako argumentIntent
, będziesz musiał zrobić coś takiegoźródło
Od aktywności do aktywności
Od fragmentu do działania
źródło
Cóż, znalazłem te 2 sposoby na najprostsze ze wszystkich wyników:
Sposób nr 1:
Sposób 2: (w ogólny sposób)
źródło
źródło
Miałem podobny problem, zacząłem pisać aplikację w Kotlinie, po przepisaniu jednej z moich czynności chciałem sprawdzić, czy są jakieś problemy, problem polegał na tym, że nie byłem pewien jak wysłać intencję z pliku java do kotlina plik.
W tym przypadku utworzyłem statyczną funkcję w kotlin (obiekt towarzyszący), ta funkcja pobiera kontekst (z bieżącej czynności) i zwraca nową intencję podczas korzystania z bieżącego kontekstu (kontekst "java") podczas używania klasy kotlin (" :: class.java ”).
Oto mój kod:
źródło
@JvmStatic
do swojejnewIntent
metody, możesz wywołać ją z javy bezCompanion
części.Detale
Krok 1. Aplikacja ()
Krok 2. Dodaj obiekt routera
Stosowanie
źródło
Pamiętaj, aby dodać aktywność, którą chcesz zaprezentować, również do swojej
AndroidManifest.xml
:-) To był problem dla mnie.źródło
Co powiesz na rozważenie hermetyzacji?
Na przykład:
źródło
W swojej aplikacji możesz używać zarówno plików Kotlin, jak i Java.
Aby przełączać się między tymi dwoma plikami, upewnij się, że w pliku AndroidManifest.xml podajesz im unikalne <action android: name = "", na przykład:
Następnie w pliku MainActivity.kt (plik Kotlin), aby rozpocząć działanie napisane w języku Java, wykonaj następujące czynności:
W pliku MainActivityJava.java (plik Java), aby rozpocząć działanie napisane w Kotlin, wykonaj następujące czynności:
źródło
Innym prostym sposobem na przejście do innej czynności jest
źródło