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();