Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

get parent's view from a layout

I have a FragmentActivity with this layout:

<?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> 

and the ScrollerLinearLayout class is something like this:

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

How to access from ScrollerLinearLayout to the parent layout to get - for example - the editetxt? FragmentActivity and ScrollerLineraLayout are in different packages of the same projects. I tried to use the getParent() function in this way within the ScrollerLinearLayout but it doesn't work.

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

Someone help me? Thanks!

like image 600
Salvatore Ucchino Avatar asked Jul 26 '13 11:07

Salvatore Ucchino


People also ask

How to get View from parent View in android?

RelativeLayout r = (RelativeLayout) this. getParent(). getParent(); int w = r. findViewById(R.

What is parent view in Android?

A ViewGroup "is a special view that can contain other views (called children.)" It's the superclass for all of the Layout classes. Parent view refers to a specific parent-child relationship (This RelativeLayout is the parent of this ImageView).

What is parent view and child view Android?

In android (and most other technologies), views can have subviews, aka "children". Most views can have children and can be a child of a parent view. It's kind of like a "tree". The most obvious feature of being a child of some other view is that the child moves with the parent view.

What is view parent?

Defines the responsibilities for a class that will be a parent of a View. This is the API that a view sees when it wants to interact with its parent.


1 Answers

The getParent method returns a ViewParent, not a View. You need to cast the first call to getParent() also:

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

As stated in the comments by the OP, this is causing a NPE. To debug, split this up into multiple parts:

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. 
like image 67
Phil Avatar answered Sep 28 '22 01:09

Phil