2013-07-26 20 views
28

Mam FragmentActivity z tego układu:dostać widok rodziców z układem

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

i klasy ScrollerLinearLayout jest coś takiego:

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

Jak korzystać z ScrollerLinearLayout do układ nadrzędny, aby uzyskać - na przykład - editetxt? FragmentActivity i ScrollerLineraLayout są w różnych pakietach tych samych projektów. Próbowałem użyć funkcji getParent() w ten sposób w ramach ScrollerLinearLayout, ale to nie działa.

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

Ktoś mi pomoże? Dzięki!

+2

Co dokładnie nie działa? –

+0

@FD_ to wyjątek punktowy zerowy na 'RelativeLayout r = (RelativeLayout) ((ViewGroup) this.getParent()). GetParent();' –

+0

Gdzie w 'ScrollerLinearLayout' wywołujesz ten kod? –

Odpowiedz

59

Metoda zwraca wartość ViewParent, a nie View. Trzeba rzucić pierwsze połączenie do getParent() także:

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

Jak podano w komentarzach przez PO, to jest spowodowanie NPE. Do debugowania, podzielić to na wiele części:

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. 
+0

Próbowałem to zrobić, ale to nie działa. błąd jest zerowy wyjątek na 'RelativeLayout r = (RelativeLayout) ((ViewGroup) this.getParent()). getParent();' nie rozumiem, co może być ... –

+0

@Rajin, dodałem sekcji mojego posta aby pomóc w debugowaniu tego problemu. – Phil

+0

Sprawdziłem dziennik i znalazłem, że 'ViewParent parent = this.getParent();' zwraca null. Mam to 'public class ScrollerLinearLayout extends LinearLayout {RelativeLayout r; // jakiś kod public void init() {// twój kod}} 'jest poprawny, gdy nazywam metodę' getParent() '? –

4

Jeśli próbujesz znaleźć View ze swojego Fragment następnie spróbować zrobić to tak:

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

Metoda 'getActivity()' jest niezdefiniowana dla typu ScrollerLineraLayout, który rozszerza LinearLayout o klasę –

0

RelativeLayout (tj ViewParent) powinien identyfikator zasobu zdefiniowany w pliku układu (na przykład android:[email protected]+id/myParentViewId). Jeśli tego nie zrobisz, wywołanie getId zwróci wartość null. Aby uzyskać więcej informacji, spójrz na numer this answer.

-2

Wystarczy napisać

this.getRootView(); 
+0

po prostu zwraca widok rodzicielski, a nie rzeczywisty układ, taki jak tylko rodzic pierwszego poziomu – Thecarisma

Powiązane problemy