Muszę często przełączać się między dwoma układami. Błąd występuje w układzie zamieszczonym poniżej.
Kiedy mój układ jest wywoływany po raz pierwszy, nie ma żadnego błędu i wszystko jest w porządku. Kiedy następnie wywołuję inny układ (pusty), a następnie wywołuję mój układ po raz drugi, generuje następujący błąd:
> FATAL EXCEPTION: main
> java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
Mój kod układu wygląda następująco:
tv = new TextView(getApplicationContext()); // are initialized somewhere else
et = new EditText(getApplicationContext()); // in the code
private void ConsoleWindow(){
runOnUiThread(new Runnable(){
@Override
public void run(){
// MY LAYOUT:
setContentView(R.layout.activity_console);
// LINEAR LAYOUT
LinearLayout layout=new LinearLayout(getApplicationContext());
layout.setOrientation(LinearLayout.VERTICAL);
setContentView(layout);
// TEXTVIEW
layout.addView(tv); // <========== ERROR IN THIS LINE DURING 2ND RUN
// EDITTEXT
et.setHint("Enter Command");
layout.addView(et);
}
}
}
Wiem, że to pytanie zostało już zadane, ale w moim przypadku nie pomogło.
java
android
android-edittext
textview
parent-child
blackst0ne
źródło
źródło
LinearLayout
ale dodajeszTextView
. Więc napraw to.TranstitionManager.beginDelayedTransition
, proszę sprawdzić moją odpowiedź tutajOdpowiedzi:
Komunikat o błędzie mówi, co należy zrobić.
źródło
po prostu przekaż argument attachtoroot jako fałsz
źródło
attachToRoot
= fałsz jest drogą do zrobienia.Przyszedłem tutaj, aby wyszukać błąd z moim recyklingiem, ale rozwiązanie nie zadziałało (oczywiście). Napisałem przyczynę i rozwiązanie problemu w przypadku przeglądu recyklingowego. Mam nadzieję, że to komuś pomoże.
Błąd jest spowodowany, jeśli zastosowana
onCreateViewHolder()
zostanie następująca metoda:Zamiast tego powinno być
źródło
Otrzymałem tę wiadomość podczas próby zatwierdzenia fragmentu za pomocą dołącz do roota na true zamiast false, na przykład:
Po zrobieniu:
Zadziałało.
źródło
Jeśli inne rozwiązanie nie działa jak:
sprawdź, co zwracasz z onCreateView fragmentu, czy jest to pojedynczy widok czy grupa widoków? w moim przypadku miałem viewpager w katalogu głównym xml fragmentu i zwracałem viewpager, kiedy dodałem viewgroup w układzie, nie zaktualizowałem, że muszę teraz zwrócić viewgroup, a nie viewpager (widok).
źródło
frameLayout.addView (bannerAdView); <----- jeśli pojawi się błąd w tej linii, wykonaj poniższe czynności.
źródło
Mój błąd polegał na zdefiniowaniu widoku w ten sposób:
Brakowało:
źródło
W moim przypadku problem był spowodowany tym, że nadmuchałem widok rodzica z
<merge>
układem. W tym przypadkuaddView()
spowodował awarię.Usunięcie
addView()
pomogło rozwiązać problem.źródło
sprawdź, czy dodałeś już widok
źródło
Poniższy kod rozwiązał to za mnie:
Uwaga: błąd pochodził z mojej klasy fragmentów i przez zastąpienie metody onDestroy w ten sposób mogłem go rozwiązać.
źródło
źródło
W moim przypadku dzieje się tak, gdy chcę dodać widok przez rodzica do innego widoku
musisz dodać widok rodzica w ten sposób
źródło
Najpierw musisz usunąć widok podrzędny z jego elementu nadrzędnego.
Jeśli Twój projekt jest w Kotlinie, Twoje rozwiązanie będzie wyglądać nieco inaczej niż Java. Kotlin upraszcza rzutowanie
as?
, zwracając wartość null, jeśli lewa strona jest pusta lub rzutowanie się nie powiedzie.Rozszerzenie Kotlin
Jeśli musisz to zrobić więcej niż raz, dodaj to rozszerzenie, aby kod był bardziej czytelny.
Bezpiecznie nic nie zrobi, jeśli ten widok ma wartość null, widok nadrzędny ma wartość null lub widok nadrzędny nie jest grupą widoków
źródło
Znalazłem inną poprawkę:
Tutaj mam po prostu instrukcję if, która sprawdza, czy widok ma element nadrzędny, a jeśli nie. Utwórz nowe okno dialogowe, ustaw contentView i pokaż okno dialogowe w mojej metodzie „createAlgorithmDialog ()”.
To również ustawia przyciski dodatnie i ujemne (przyciski ok i anuluj) za pomocą onClickListeners.
źródło
Możesz użyć tej metody, aby sprawdzić, czy widok ma dzieci, czy nie.
źródło
Mój przypadek był inny, widok dziecka miał już widok nadrzędny. Dodaję widok podrzędny w widoku rodzica do innego rodzica. przykładowy kod poniżej
Nadmuchałem ten widok i dodałem do innego LinearLayout, a następnie usunąłem LinaarLayout z powyższego układu i zaczął działać
poniższy kod naprawił problem:
źródło
Mój problem jest związany z wieloma innymi odpowiedziami, ale trochę inny powód, dla którego muszę wprowadzić zmianę ... Próbowałem przekonwertować działanie na fragment. Więc przeniosłem kod inflate z onCreate do onCreateView, ale zapomniałem przekonwertować z setContentView na metodę inflate i ten sam IllegalStateException przeniósł mnie na tę stronę.
Zmieniłem to:
do tego:
To rozwiązało problem.
źródło