Holen Sie sich die Ansicht der Eltern von einem Layout

Lesezeit: 5 Minuten

Benutzer-Avatar
Salvatore Ucchino

Ich habe ein FragmentActivity mit dieser Anordnung:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/menulabel"
    android:textSize="24sp" />

<EditText
    android:id="@+id/editText1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:ems="10"
    android:inputType="text"
    android:layout_below="@+id/textView1"
    android:hint="@string/search_title_hint" />

<TextView
    android:id="@+id/textView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/spinnersearch"
    android:layout_below="@+id/editText1" />

<LinearLayout
    android:id="@+id/layout1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/textView2" >

    <Spinner
        android:id="@+id/spinner_search"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:prompt="@string/spinnersearch" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/reset_search" />

</LinearLayout>

<Button
    android:id="@+id/button2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/buttonnewcat"
    android:layout_below="@+id/layout1" />

<Button
    android:id="@+id/button3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/buttondelcat" 
    android:layout_below="@+id/button2" />

<Button
    android:id="@+id/button4"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/buttoneditcat"
    android:layout_below="@+id/button3" />

<Button
    android:id="@+id/button5"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/buttonnewtext"
    android:layout_below="@+id/button4" />

<Button
    android:id="@+id/button6"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/buttondeltext"
    android:layout_below="@+id/button5" />

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <side.menu.scroll.ScrollerLinearLayout
        android:id="@+id/menu_content_side_slide_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="45dp"
            android:background="@drawable/ab_solid_example"
            android:orientation="horizontal" >

            <ImageView
                android:id="@+id/main_tmp_button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/actionbar_background"
                android:src="https://stackoverflow.com/questions/17879743/@drawable/download" />

        </LinearLayout>
        <FrameLayout
            android:id="@+id/fragment_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/bg_groud" />

    </side.menu.scroll.ScrollerLinearLayout>
</RelativeLayout>

und die ScrollerLinearLayout-Klasse sieht ungefähr so ​​​​aus:

public class ScrollerLinearLayout extends LinearLayout {
    // code of the class
}

Zugriff von ScrollerLinearLayout zum übergeordneten Layout, um beispielsweise den editetxt zu erhalten? FragmentActivity und ScrollerLineraLayout befinden sich in verschiedenen Paketen derselben Projekte. Ich habe versucht, die zu verwenden getParent() Funktion auf diese Weise innerhalb der ScrollerLinearLayout aber es funktioniert nicht.

RelativeLayout r = (RelativeLayout) this.getParent().getParent();
int w = r.findViewById(R.id.editText1).getLayoutParams().width;

Jemand hilft mir? Vielen Dank!

  • Was genau geht nicht?

    – FD_

    26. Juli 2013 um 11:09 Uhr

  • @FD_ es ist eine Nullzeigerausnahme RelativeLayout r = (RelativeLayout) ((ViewGroup) this.getParent()).getParent();

    – Salvatore Ucchino

    26. Juli 2013 um 11:23 Uhr

  • Wo drin ScrollerLinearLayout nennen Sie diesen Code?

    – FD_

    26. Juli 2013 um 11:28 Uhr


  • @FD_ in einer Methode init()

    – Salvatore Ucchino

    29. Juli 2013 um 7:02 Uhr

  • Fügen Sie es zu a hinzu ViewGroup vor dem Anruf init() ?

    – FD_

    29. Juli 2013 um 7:52 Uhr

Benutzer-Avatar
Phil

Das getParent Methode gibt a zurück ViewParentkein View. Sie müssen den ersten Anruf umleiten getParent() Auch:

RelativeLayout r = (RelativeLayout) ((ViewGroup) this.getParent()).getParent();

Wie in den Kommentaren des OP angegeben, verursacht dies a NPE. Teilen Sie dies zum Debuggen in mehrere Teile auf:

ViewParent parent = this.getParent();
RelativeLayout r;
if (parent == null) {
    Log.d("TEST", "this.getParent() is null");
}
else {
    if (parent instanceof ViewGroup) {
        ViewParent grandparent = ((ViewGroup) parent).getParent();
        if (grandparent == null) {
            Log.d("TEST", "((ViewGroup) this.getParent()).getParent() is null");
        }
        else {
            if (parent instanceof RelativeLayout) {
                r = (RelativeLayout) grandparent;
            }
            else {
                Log.d("TEST", "((ViewGroup) this.getParent()).getParent() is not a RelativeLayout");
            }
        }
    }
    else {
        Log.d("TEST", "this.getParent() is not a ViewGroup");
    }
}

//now r is set to the desired RelativeLayout.

  • Ich habe versucht, dies zu tun, aber es funktioniert nicht. der Fehler ist nullpointexception on RelativeLayout r = (RelativeLayout) ((ViewGroup) this.getParent()).getParent(); ich verstehe nicht was sein kann…

    – Salvatore Ucchino

    26. Juli 2013 um 11:16 Uhr

  • @Rajin, ich habe einen Abschnitt meines Beitrags hinzugefügt, um Ihnen beim Debuggen dieses Problems zu helfen.

    – Phil

    26. Juli 2013 um 11:34 Uhr

  • Ich habe das Protokoll überprüft und das gefunden ViewParent parent = this.getParent(); gibt null zurück. ich habe das public class ScrollerLinearLayout extends LinearLayout { RelativeLayout r; // some code public void init(){ // your code } } ist richtig wo ich das nenne getParent() Methode?

    – Salvatore Ucchino

    30. Juli 2013 um 10:20 Uhr


Wenn Sie versuchen, eine zu finden View von deiner Fragment dann versuche es mal so:

int w = ((EditText)getActivity().findViewById(R.id.editText1)).getLayoutParams().width;

  • das getActivity() Die Methode ist für den Typ ScrollerLineraLayout, der die LinearLayout-Klasse erweitert, nicht definiert

    – Salvatore Ucchino

    26. Juli 2013 um 11:20 Uhr

Benutzer-Avatar
Sirius Bey

Du kannst bekommen IRGENDEIN mit dem folgenden Code anzeigen

view.rootView.findViewById(R.id.*name_of_the_view*)

EDIT: Dies funktioniert auf Kotlin. In Java müssen Sie möglicherweise so etwas tun =

this.getCurrentFocus().getRootView().findViewById(R.id.*name_of_the_view*);

Ich habe die Funktion getCurrentFocus() gelernt von: @JFreeman ‘s Antwort

Benutzer-Avatar
Aditya369

Das RelativeLayout (also die ViewParent) sollte eine in der Layoutdatei definierte Ressourcen-ID haben (z. B. android:[email protected]+id/myParentViewId). Wenn Sie dies nicht tun, gibt der Aufruf von getId null zurück. Sehen Sie sich diese Antwort an, um weitere Informationen zu erhalten.

Überprüfen Sie meine Antwort hier

Die Verwendung von Layout-Inspektor Das Tool kann sehr praktisch sein, wenn Sie eine komplexe Ansicht haben oder eine Bibliothek eines Drittanbieters verwenden, in der Sie einer Ansicht keine ID hinzufügen können

Benutzer-Avatar
JFreeman

Das funktioniert auch:

this.getCurrentFocus()

Es bekommt die Ansicht, damit ich es verwenden kann.

1179770cookie-checkHolen Sie sich die Ansicht der Eltern von einem Layout

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy