Dodaj i usuń widok z układu


94

Jak mogę dodać i usunąć widok z układu?


jaki rodzaj układu? czy możesz wkleić część kodu, nad którym pracujesz?
Cristian,

3
Jak to jest dobrze przygotowane?
Cornelius,

Odpowiedzi:


219

Zrobiłem to tak:

((ViewManager)entry.getParent()).removeView(entry);

45
W nowszych SDK jest (ViewGroup):)
Ron

@schwiz, jak możemy zresetować identyfikator widoku w tym przypadku Mój problem polega na tym, że nawet po zakończeniu mojej aktywności za każdym razem, gdy zostanie dodany następny widok, identyfikator widoku zostanie zwiększony. Chcę, aby identyfikator widoku był domyślnie ustawiony na 1, gdy wrócę do tej czynności .
AndroidNewBee

Dziękuję bardzo za udzielenie tej odpowiedzi
hem

ViewGroup rozszerza View implementuje ViewParent, ViewManager. ładniej to nazwać z castingiem do (ViewGroup)
Mercury

24

Użyj ViewStub i określ układ widoku, który chcesz przełączyć. Obejrzeć:

mViewStub.setVisibility(View.VISIBLE) or mViewStub.inflate();

Zniknąć:

mViewStub.setVisibility(View.GONE);

40
Ukrywanie to nie to samo, co usuwanie.
Darkwater

Jeśli chcesz ukryć / odkryć, możesz użyć .setVisibility (View.INVISIBLE) i .setVisibility (View.VISIBLE). Gdy widok jest niewidoczny, użytkownik nie może z nim wchodzić.
dennisschagt

Powiedzmy, że mam textView z dołączonym do niego onClickListener. Jeśli sprawię, że zniknie, a następnie go dotknę, czy zdarzenie będzie nadal działać?
ahitt6345

22

To najlepszy sposób

LinearLayout lp = new LinearLayout(this);
lp.addView(new Button(this));
lp.addView(new ImageButton(this));
// Now remove them 
lp.removeViewAt(0); // and so on

Jeśli masz układ XML, nie musisz dodawać dynamicznie. Po prostu zadzwoń

lp.removeViewAt(0);

Jaka będzie różnica w wydajności? Mam na myśli różnicę w wydajności dodawania ich dynamicznie lub umieszczania ich w statycznym pliku układu xml i pozwalania na zawyżenie?
stdout

19

Aby dodać widok do układu, możesz użyć addViewmetody ViewGroupklasy. Na przykład,

TextView view = new TextView(getActivity());
view.setText("Hello World");

ViewGroup Layout = (LinearLayout) getActivity().findViewById(R.id.my_layout);
layout.addView(view); 

Istnieje również kilka metod usuwania. Sprawdź dokumentację ViewGroup . Jednym prostym sposobem usunięcia widoku z układu może być:

layout.removeAllViews(); // then you will end up having a clean fresh layout

4
removeAllViews () jest tym, czego szukałem!
Alan

6

Do zmiany widoczności:

predictbtn.setVisibility(View.INVISIBLE);

Do usunięcia:

predictbtn.setVisibility(View.GONE);

To rozwiązało mój problem, bardziej niż każda inna odpowiedź. Przydatne, jeśli tak jak ja, twoje tło lub niektóre parametry uniemożliwiają całkowite zniknięcie widoku.
Virthuss

1
Dzieje się tak, ponieważ View.GONE nie usuwa widoku układu, tylko czyni go niewidocznym i nie zajmuje miejsca do celów układu.
Victor

6

Świetna odpowiedź od Sameera i Abla Terefe. Jednak gdy usuwasz widok, w mojej opcji chcesz usunąć widok z określonym identyfikatorem. Oto jak to robisz.

1, nadaj widokowi identyfikator podczas jego tworzenia:

_textView.setId(index);

2, usuń widok o identyfikatorze:

removeView(findViewById(index));

1

możesz użyć addView lub removeView

Jawa:

// Root Layout
LinearLayout linearLayout = new LinearLayout(context);
linearLayout.setGravity(Gravity.CENTER);
linearLayout.setOrientation(LinearLayout.VERTICAL);

// TextView
TextView textView = new TextView(context);
textView.setText("Sample");

// Add TextView in LinearLayout
linearLayout.addView(textView);

// Remove TextView from LinearLayout
linearLayout.removeView(textView);

kotlin:

// Root Layout
val linearLayout = LinearLayout(context)
linearLayout.gravity = Gravity.CENTER
linearLayout.orientation = LinearLayout.VERTICAL

// TextView
val textView = TextView(context)
textView.text = "Sample"

// Add TextView in LinearLayout
linearLayout.addView(textView)

// Remove TextView from LinearLayout
linearLayout.removeView(textView)

0

cześć, jeśli jesteś nowy w Androidzie, użyj w ten sposób Zastosuj swój widok, aby zniknął, jest jeden sposób, w przeciwnym razie zdobądź widok rodzica i usuń z niego dziecko ..... w przeciwnym razie pobierz układ nadrzędny i użyj tego metoda an remove all child parentView.remove (child)

Sugerowałbym użycie podejścia GONE ...


1
GONE skutecznie ukryje widok, ale nie usunie go z układu
Sababado

1
Proste użycie parentView.remove (removeViewName);
Zala Janaksinh

Masz rację, ale próbowałem zasugerować, że nie odpowiedziałeś na pytanie, podając rozwiązanie „GONE”.
Sababado

0

Usuwam widok za pomocą metody start i count, dodałem widok 3 w układzie liniowym.

view.removeViews (0, 3);


0

Rozwiązanie wielokrotnego użytku Kotlin

Uprość usuwanie

Dodaj to rozszerzenie:

myView.removeSelf()

fun View?.removeSelf() {
    this ?: return
    val parent = parent as? ViewGroup ?: return
    parent.removeView(this)
}

Uprość dodawanie

Oto kilka opcji:

// Built-in
myViewGroup.addView(myView)

// Null-safe extension
fun ViewGroup?.addView(view: View?) {
    this ?: return
    view ?: return
    addView(view)
}

// Reverse addition
myView.addTo(myViewGroup)

fun View?.addTo(parent: ViewGroup?) {
    this ?: return
    parent ?: return
    parent.addView(this)
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.