Android: проблема с размером экрана пользовательских настроек - PullRequest
1 голос
/ 23 сентября 2011

Я использую пользовательский макет для отображения настроек, чтобы я мог вставить рекламный баннер внизу экрана.Идея состоит в том, чтобы баннер прикреплялся к нижней части страницы, а настройки отображались на остальной части экрана в виде прокрутки.У меня проблема с высотой, взятой из предпочтений.В настоящее время я жестко запрограммировал его на «2000dip» в XML-макете ниже.

Он работает нормально, баннер остается внизу, настройки вверху в режиме прокрутки.

Но имеяжестко запрограммированное значение высоты является плохим, и я бы хотел, чтобы оно автоматически устанавливалось на точную высоту, заданную настройками, потому что в настоящее время оно слишком короткое или слишком длинное (с пустой областью после настроек).Я попытался заменить жестко закодированное значение на wrap_content или fill_parent, но безуспешно.Любая идея?

В моей PreferenceActivity я включил следующие две строки:

    setContentView(R.layout.preferences_scrollable);
    addPreferencesFromResource(R.layout.preferences);

И я определил макет preferences_scrollable в xml-файле preferences_scrollable.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:orientation="vertical">

    <ScrollView android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:layout_weight="1"
        android:id="@+id/pref_scrollable_sv">

        <LinearLayout android:layout_width="fill_parent"
            android:layout_height="wrap_content" android:orientation="vertical"
            android:id="@+id/pref_scrollable_ll">

            <ListView android:id="@android:id/list"
                android:layout_width="fill_parent" android:layout_height="2000dip">

            </ListView>
        </LinearLayout>
    </ScrollView>
    <LinearLayout android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:orientation="vertical">
        <com.google.ads.AdView android:id="@+id/ad"
            ads:adSize="BANNER" android:layout_width="fill_parent"
            ads:loadAdOnCreate="true" ads:adUnitId="xxx"
            android:layout_height="wrap_content" 
            android:layout_weight="0"/>
    </LinearLayout>
</LinearLayout>

Ответы [ 3 ]

1 голос
/ 23 октября 2011

Использование атрибута «android: fillViewport» в представлении прокрутки позволяет получить правильную высоту. Так что это было бы решением, за исключением того, что с этим атрибутом представление не прокручивается или прокручивается очень плохо. Для меня это выглядит как ошибка Android.

В любом случае, решение, которое работает, это удалить ScrollView и вместо этого использовать LinearLayout (который также поддерживает прокрутку). Макет, корректно работающий с прокручиваемым списком предпочтений (контент, заполненный из кода Java) вверху и рекламным баннером внизу, приведен ниже.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:orientation="vertical">

    <LinearLayout android:layout_width="fill_parent"
        android:id="@+id/ad_layout" android:layout_height="wrap_content"
        android:orientation="vertical" 
        android:layout_alignParentBottom="true">

        <com.google.ads.AdView android:id="@+id/ad"
            ads:adSize="BANNER" android:layout_width="fill_parent"
            ads:loadAdOnCreate="true" ads:adUnitId="xxx"
            android:layout_height="wrap_content" primaryTextColor="#FFFFFF"
            secondaryTextColor="#CCCCCC" />
    </LinearLayout>
    <LinearLayout android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="horizontal"
        android:layout_above="@+id/ad_layout">

        <ListView android:id="@android:id/list" android:layout_width="fill_parent"
            android:layout_height="wrap_content">
        </ListView>
</LinearLayout>     
</RelativeLayout>
0 голосов
/ 04 октября 2011

Используйте RelativeLayout для вашего внешнего макета. Пример:

   <?xml version="1.0" encoding="utf-8"?>
   <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" .....>

       <LinearLayout android:layout_alignParentBottom="true" android:id="@+id/adsLayout" ...>
           <!-- This is the ads part of it, which will remain the same as you have above-->
       </LinearLayout>
            <!-- You have to have the ads part first, so you are able to reference it with the scrollview -->
       <ScrollView .... android:layout_above="@+id/adsLayout">
          <!-- This ScrollView contents will remain the same -->
       </ScrollView>
   </RelativeLayout>

Итак, в рекламной части макета вы используете android:layout_alignParentBottom="true", чтобы поместить его внизу экрана. Затем в ScrollView вы ставите android:layout_above="@+id/adsLayout", поэтому он выходит за рамки просмотра рекламы. Это отформатирует как вам нужно.

Это должно сработать. Просто прокомментируйте, если у вас есть проблемы.

0 голосов
/ 23 сентября 2011

Попробуйте установить <android:layout_marginRight="10dp" android:layout_marginBottom="10dp" android:layout_marginLeft="5dp>" в свойствах макета.

...