2014-12-07 2 views
2

Есть несколько уже ответивших на вопросы о порядке рисования андроид-представлений из XML-файла, и я прочитал их и попытался их решения без везения. У меня есть RelativeLayout с тремя детьми, ImageView, Button и LinearLayout. Я хочу, чтобы LinearLayout был сверху, а остальные два в фоновом режиме. Согласно Defining Z order of views of RelativeLayout in Android, братья и сестры рисуются в том порядке, в котором они читаются из xml-файла, поэтому я поместил свой LinearLayout последним в файл, но он все еще нарисован в обратном порядке. Вот мой файл:Android RelativeLayout View Order

<RelativeLayout 
    android:id="@+id/login_form" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center_horizontal"> 

    <ImageView 
     android:layout_width="match_parent" 
     android:layout_height="fill_parent" 
     android:id="@+id/imageView" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:layout_above="@+id/register_button" 
     android:paddingLeft="@dimen/padding_xxlarge" 
     android:paddingRight="@dimen/padding_xxlarge" 
     android:src="@drawable/logo"/> 

    <Button 
     android:layout_width="fill_parent" 
     android:layout_height="@dimen/element_xlarge" 
     android:text="@string/action_register" 
     android:id="@+id/register_button" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true"/> 

    <LinearLayout 
     android:id="@+id/email_login_form" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:layout_above="@+id/register_button" 
     android:layout_marginBottom="-40dp"> 

     <AutoCompleteTextView 
      android:id="@+id/net_id" 
      android:layout_width="fill_parent" 
      android:layout_height="@dimen/element_small" 
      android:hint="@string/prompt_username" 
      android:inputType="textAutoComplete" 
      android:maxLines="1" 
      android:singleLine="true" 
      android:layout_marginLeft="@dimen/padding_xlarge" 
      android:layout_marginRight="@dimen/padding_xlarge" 
      android:layout_marginBottom="@dimen/padding_small" /> 

     <EditText 
      android:id="@+id/password" 
      android:layout_width="match_parent" 
      android:layout_height="@dimen/element_small" 
      android:hint="@string/prompt_password" 
      android:imeActionId="@+id/login" 
      android:imeActionLabel="@string/action_sign_in_short" 
      android:imeOptions="actionUnspecified" 
      android:inputType="textPassword" 
      android:maxLines="1" 
      android:singleLine="true" 
      android:layout_marginLeft="@dimen/padding_xlarge" 
      android:layout_marginRight="@dimen/padding_xlarge" /> 

     <Button 
      android:id="@+id/sign_in_button" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="@dimen/padding_xlarge" 
      android:layout_marginRight="@dimen/padding_xlarge" 
      android:text="@string/action_sign_in" /> 

    </LinearLayout> 

Изображение: https://drive.google.com/a/cornell.edu/file/d/0BzEvKm6_q_oqbllRd284dS1ubVk/view?usp=sharing

Я также попытался с помощью метода BringToFront() в моей функции OnCreate():

findViewById(R.id.email_login_form).bringToFront(); 

Но это не имело никакого эффекта. Что я делаю неправильно, и как я могу сделать свой LinearLayout выше?

--UPDATE--

После тестирования нескольких рекомендаций комментаторов, я нашел это очень странное поведение, которое может быть корнем проблемы. Когда я добавить тестовую кнопку следующим образом:

<RelativeLayout 
    android:id="@+id/login_form" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center_horizontal" 
    android:clipChildren="false"> 

    <Button 
     android:layout_width="fill_parent" 
     android:layout_height="@dimen/element_xlarge" 
     android:text="@string/action_register" 
     android:id="@+id/register_button" 
     android:layout_alignParentBottom="true"/> 

    <ImageView 
     android:layout_width="match_parent" 
     android:layout_height="fill_parent" 
     android:id="@+id/imageView" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:layout_above="@id/register_button" 
     android:paddingLeft="@dimen/padding_xxlarge" 
     android:paddingRight="@dimen/padding_xxlarge" 
     android:src="@drawable/logo"/> 

    <Button 
     android:id="@+id/test_button" 
     android:text="test" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_above="@id/register_button" 
     android:layout_centerHorizontal="true" 
     android:layout_marginBottom="-30dp"/> 

    <LinearLayout 
     android:id="@+id/email_login_form" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:layout_above="@id/register_button" 
     android:layout_marginBottom="-30dp" 
     android:clipChildren="false" > 

     <AutoCompleteTextView 
      android:id="@+id/net_id" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:hint="@string/prompt_username" 
      android:inputType="textAutoComplete" 
      android:maxLines="1" 
      android:singleLine="true" 
      android:layout_marginLeft="@dimen/padding_xlarge" 
      android:layout_marginRight="@dimen/padding_xlarge" 
      android:layout_marginBottom="@dimen/padding_small" /> 

     <EditText 
      android:id="@+id/password" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:hint="@string/prompt_password" 
      android:imeActionId="@+id/login" 
      android:imeActionLabel="@string/action_sign_in_short" 
      android:imeOptions="actionUnspecified" 
      android:inputType="textPassword" 
      android:maxLines="1" 
      android:singleLine="true" 
      android:layout_marginLeft="@dimen/padding_xlarge" 
      android:layout_marginRight="@dimen/padding_xlarge" /> 

     <Button 
      android:id="@+id/sign_in_button" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="@dimen/padding_xlarge" 
      android:layout_marginRight="@dimen/padding_xlarge" 
      android:text="@string/action_sign_in" /> 

    </LinearLayout> 

</RelativeLayout> 

Тогда test_button рисуется на вершине register_button и LinearLayout, несмотря на это объявляется перед LinearLayout в XML. Почему тестовую кнопку следует обрабатывать иначе, чем LinearLayout?

+1

Вы можетедобавить скриншот? Это может помочь понять, что происходит. [И затем ответьте, если вы добавили его, чтобы я был уведомлен] – MDragon00

+0

Этот 'android: layout_above =" @ + id/register_button "создает новый идентификатор, когда представление еще не создано. Поэтому, хотя вы можете использовать его для ImageView (но вам лучше создать кнопку раньше), это неправильно для LinearLayout (вместо этого используйте 'android: layout_above =" @ id/register_button "'). –

+0

скриншот, пожалуйста. –

ответ

0

Хорошо, я создал подобный XML, вы можете проверить его здесь: http://pastebin.com/Dx7MXfj5

<Button 
    android:id="@+id/registerButton" 
    android:layout_width="match_parent" 
    android:layout_height="100dp" 
    android:layout_alignParentBottom="true" 
    android:text="Register" /> 

<ImageView 
    android:id="@+id/logoImageView" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_above="@+id/registerButton" 
    android:src="@drawable/ic_confirmation" /> 

<LinearLayout 
    android:id="@+id/loginLayout" 
    android:layout_width="220dp" 
    android:layout_height="wrap_content" 
    android:layout_above="@+id/registerButton" 
    android:layout_centerHorizontal="true" 
    android:layout_marginBottom="-20dp" 
    android:background="#F00" 
    android:orientation="vertical" > 

    <EditText 
     android:id="@+id/editText1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Email" > 
    </EditText> 

    <EditText 
     android:id="@+id/editText2" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Password" /> 

    <Button 
     android:id="@+id/button2" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Login" /> 
</LinearLayout> 

и результат:

Xml Result

+0

Это работает, спасибо. Я все еще очень смущен тем, почему мой исходный файл не работает. Между ними нет большой разницы. – Platatat

+0

Я не понимаю, почему исходная компоновка не работает – Liuting

Смежные вопросы