studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android android-layout view parent-child

android - programacion - obtener la vista de los padres desde un diseño



manual de programacion android pdf (4)

Tengo una FragmentActivity con este diseño:

<?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="@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>

y la clase ScrollerLinearLayout es algo como esto:

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

¿Cómo acceder desde ScrollerLinearLayout al diseño principal para obtener, por ejemplo, el editetxt? FragmentActivity y ScrollerLineraLayout están en diferentes paquetes de los mismos proyectos. Traté de usar la función getParent() de esta manera dentro de ScrollerLinearLayout pero no funciona.

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

¿Alguien ayúdeme? ¡Gracias!


El RelativeLayout (es decir, el ViewParent ) debe tener un Id de recurso definido en el archivo de diseño (por ejemplo, android:id=@+id/myParentViewId ). Si no lo hace, la llamada a getId devolverá nulo. Mire esta respuesta para más información.


El método getParent devuelve un ViewParent , no una View . Debes lanzar la primera llamada a getParent() también:

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

Como se afirma en los comentarios del OP, esto está causando un NPE . Para depurar, divida esto en varias partes:

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.


Si intentas encontrar una View desde tu Fragment , intenta hacerlo así:

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


Solo escribe

this.getRootView();