Макет резко меняется при изменении ориентации

Я создал макет для деятельности. Макет содержит несколько кнопок с изображениями и текстовые представления. Проблема в том, что когда я устанавливаю портретную ориентацию своего устройства, оно работает нормально, но когда я меняю ориентацию на альбомную, макет дает неожиданные результаты.

Вот мой файл макета:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:fillViewport="true"
    android:padding="50dp" >


<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="wrap_content" >

    <ImageView
        android:id="@+id/settings_imageView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:src="@android:drawable/bottom_bar" />

    <TextView
        android:id="@+id/settings_textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="16dp"
        android:text="@string/my_settings"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <ImageView
        android:id="@+id/myProgramming_imageView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/settings_imageView"
        android:layout_alignParentLeft="true"
        android:src="@android:drawable/bottom_bar" />

    <TextView
        android:id="@+id/myProgramming_textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/myProgramming_imageView"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="14dp"
        android:text="@string/my_programming"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <ImageView
        android:id="@+id/library_imageView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/myProgramming_imageView"
        android:layout_alignParentLeft="true"
        android:src="@android:drawable/bottom_bar" />

    <TextView
        android:id="@+id/library_textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/library_imageView"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="16dp"
        android:text="@string/library"
        android:textAppearance="?android:attr/textAppearanceMedium" />

</RelativeLayout>
</ScrollView>

Вот вывод портретного режима на устройстве, и это вывод, который ожидается как в портретном, так и в альбомном режимах:

Портретный режим

Вот вывод для ландшафтного режима на устройстве, это неожиданно:

Ландшафтный режим

Я хочу, чтобы макет выглядел одинаково в портретном и ландшафтном режимах.


person kittu88    schedule 02.11.2012    source источник
comment
обязательно ли использовать относительную компоновку?   -  person Chintan Khetiya    schedule 02.11.2012


Ответы (4)


- Кажется, вы screen size создаете здесь проблему.

- Вам нужно будет создать еще одну папку в каталоге res как layout-land, и в нем создать файл .xml так же, как вы сделали в папке layout, и сделать так, чтобы он выглядел так, как вы хочу это в landscape mode.

- Когда ваше приложение переходит в режим landscape, автоматически этот файл .xml будет выбран (т.е. из папки layout-land).

person Kumar Vivek Mitra    schedule 02.11.2012

сначала вам нужно создать следующую папку для другого макета.....

Folder Name                       

layout-ldpi                           
layout-land-ldpi                    

layout-mdpi                           
layout-land-mdpi                      

layout-hdpi                           
layout-land-hdpi                      

layout-xlarge                        
layout-xlarge-land                    

1... Изменение в AndroidManifest.xml

android:configChanges="orientation|keyboardHidden"

2....Создайте layout_land.xml в папке layout.

3....Создайте layout_port.xml в папке layout-land.

4... Создайте следующий метод

@Override
public void onConfigurationChanged(Configuration newConfig) 
{
    super.onConfigurationChanged(newConfig);


    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) 
    {
        setContentView(R.layout.layout_land);
        set_all_id();
    } 
    else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)
    {
        setContentView(R.layout.layout_port);
        set_all_id();
    }
}

5....Изменение метода OnCreate (только этот контент)

@Override
public void onCreate(Bundle savedInstanceState)
{

    super.onCreate(savedInstanceState);
    if (getResources().getConfiguration().orientation == 1)
    {
        setContentView(R.layout.layout_port);
    }
    if (getResources().getConfiguration().orientation == 2)
    {
        setContentView(R.layout.layout_land);
    }
    set_all_id();

}

6... Создайте метод set_all_id() для инициализации объектов просмотра

public void set_all_id()
{
    //define id for all view objects..
    //textview = (textview)findViewById(R.id.textview);
}
person Parag Ghetiya    schedule 02.11.2012
comment
Хорошо, предположим, у меня есть два макета для экрана среднего размера и два макета для экранов большого размера, тогда как мне назвать макеты разного размера для разных размеров экрана в зависимости от ориентации устройства? Должны ли макеты иметь одинаковое имя файла? (например, main_portrait.xml для больших и средних экранов) - person kittu88; 03.11.2012
comment
автоматически выбирать макеты разных размеров для разных размеров экрана при изменении ориентации... вам нужно вызывать только PORTRAIT.xml и LANDSCAPE.xml.. - person Parag Ghetiya; 03.11.2012
comment
А что с именами файлов? Будут ли все макеты для книжной ориентации иметь одинаковое имя и все макеты для альбомной ориентации будут иметь одинаковое имя? - person kittu88; 03.11.2012
comment
да..... все макеты для портретной ориентации имеют одно и то же имя, и все макеты для альбомной ориентации имеют одно и то же имя - person Parag Ghetiya; 03.11.2012

Из-за меньшей высоты в режиме landscape макет будет отображаться следующим образом.

По моему мнению, хороший способ — сохранить макет в папке res и создать макет для ландшафтного режима. так что будет красиво смотреться

person Ram kiran    schedule 02.11.2012
comment
Хорошо, вы можете предложить мне хороший учебник для этого. Я не знаю, как добавить несколько макетов для одного и того же действия. Другое дело, как Система поймет, какую раскладку вызывать? Придется ли мне делать это вручную? - person kittu88; 02.11.2012
comment
Проверьте ссылка1 link2 - person Ram kiran; 02.11.2012

  • создайте папку /res/layout-land (здесь вы будете хранить макеты, настроенные по ландшафту)
  • скопируйте ChooseActivity.xml туда
  • внести в него необходимые изменения
person QuokMoon    schedule 02.11.2012