get parent's view from a layout

138,645

Solution 1

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.

Solution 2

If you are trying to find a View from your Fragment then try doing it like this:

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

Solution 3

You can get ANY view by using the code below

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

EDIT: This works on Kotlin. In Java, you may need to do something like this=

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

I learned getCurrentFocus() function from: @JFreeman 's answer

Solution 4

The RelativeLayout (i.e. the ViewParent) should have a resource Id defined in the layout file (for example, android:id=@+id/myParentViewId). If you don't do that, the call to getId will return null. Look at this answer for more info.

Share:
138,645
Salvatore Ucchino
Author by

Salvatore Ucchino

Updated on September 24, 2020

Comments

  • Salvatore Ucchino
    Salvatore Ucchino almost 4 years

    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!

  • Salvatore Ucchino
    Salvatore Ucchino almost 11 years
    i tried to do this but it doesn't work. the error is nullpointexception on RelativeLayout r = (RelativeLayout) ((ViewGroup) this.getParent()).getParent(); i don't understand what can be...
  • Salvatore Ucchino
    Salvatore Ucchino almost 11 years
    the getActivity() method is undefined for the type ScrollerLineraLayout which extends LinearLayout class
  • Phil
    Phil almost 11 years
    @Rajin, I added a section of my post to help you debug this issue.
  • Salvatore Ucchino
    Salvatore Ucchino almost 11 years
    i checked the log and i found that ViewParent parent = this.getParent(); returns null. I have this public class ScrollerLinearLayout extends LinearLayout { RelativeLayout r; // some code public void init(){ // your code } } is correct where i call the getParent() method?