2011-12-06 9 views
6

Próbuję utworzyć niestandardową grupę ViewGroup i chcę jej użyć z aplikacją pełnoekranową. Używam "requestWindowFeature (Window.FEATURE_NO_TITLE)", aby ukryć pasek tytułu. Pasek tytułu nie jest wyświetlany, ale nadal zajmuje miejsce na górze okna.Android: Używanie FEATURE_NO_TITLE z niestandardową ViewGroup pozostawia miejsce na górze okna

Here is a picture of the problem

Powyższe zostało wygenerowane z następującego kodu obrazu:

public class CustomLayoutTestActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     Button b = new Button(this); 
     b.setText("Hello"); 
     CustomLayout layout = new CustomLayout(this); 
     layout.addView(b); 
     setContentView(layout); 
    } 
} 

public class CustomLayout extends ViewGroup { 
    public CustomLayout(Context context) { 
     super(context); 
    } 
    public CustomLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 
    public CustomLayout(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 
    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 
     Log.i("CustomLayout", "changed="+changed+" l="+l+" t="+t+" r="+r+" b="+b); 
     final int childCount = getChildCount(); 
     for (int i = 0; i < childCount; ++i) { 
      final View v = getChildAt(i); 
      v.layout(l, t, r, b); 
     } 
    } 
} 

(The full Eclipse project is here)

Jest to interesujące zobaczyć, że jest to Android, który podany jest to miejsce dla mojego niestandardowy układ. Ustawiam CustomLayout jako główny układ mojej Aktywności. W dzienniku "onLayout" otrzymuje "t = 25", i to właśnie powoduje przesunięcie mojego układu w dół. Nie wiem, co robię źle, co sprawia, że ​​Android to "t = 25" (co jest dokładnie wysokością paska tytułu).

Uruchomiłem ten kod w systemie Android SDK 2.1, ale zdarza się też w systemie Android 2.2.


EDIT: Jeśli zmienię klasy CustomLayout jakiegoś układu domyślnego (takich jak LinearLayout), przestrzeń znika. Oczywiście domyślne układy Androida SDK nie tworzą układu, który próbuję utworzyć, dlatego właśnie go tworzę.

Chociaż układ, który tworzę, jest nieco skomplikowany, jest to najmniejszy kod, jaki mógłbym stworzyć, odtwarzając problem, który mam z moim układem.

Odpowiedz

3

To nie jest pełna odpowiedź, ale w międzyczasie można obejść problem owijając swój niestandardowy układ w <FrameLayout />

Ponadto, warto zauważyć, że układ wystaje poza dole ekranu. Jest przesunięty w dół o wysokość paska tytułu (38 pikseli w moim emulatorze)

Edytuj: Gotowy. onLayout() (i odpowiednia metoda layout()) określają, że współrzędna nie jest względna względem początku ekranu, są one względem obiektu nadrzędnego (http://developer.android.com/reference/android/view/View.html#layout%28int,%20int,%20int,%20int%29). System informuje Cię, że masz względne współrzędne (0, 38) i dodajesz je, gdy przekazujesz je dziecku, co oznacza, że ​​mówisz, że Twoje dziecko ma współrzędne ekranu (0, 76), powodując lukę.

Co ty właściwie chcesz zrobić, to:

v.layout(0, 0, r - l, b - t); 

To będzie umieścić swoje dziecko Wyświetleń wyrównane z lewym górnym rogu widok, z tej samej szerokości i wysokości co widzenia.

+0

Dziękuję @Hounshell. Brakowało mi tego punktu na dokumentach dotyczących układu współrzędnych w stosunku do rodzica. Oto obraz tego, co chcę osiągnąć (wynik twojego komentarza): [link] (http://i.imgur.com/FIOIG) – lgfischer

0

miałem ten sam problem z FrameLayout w 2.2

Naprawiłem go dodając android:layout_gravity="top" do FrameLayout

Powiązane problemy