Пользовательское представление Android полностью игнорирует параметры макета im xml и растягивается на весь экран

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

Это представление игнорирует android: layout_width = "wrap_content и android: layout_height =" wrap_content, оно не оборачивает фоновое изображение, а растягивает и выталкивает элементы управления под представлением. экрана.

Пользовательское представление находится в основном LinearLayout, но где бы я его ни поместил, он ведет себя одинаково.

Я пробовал использовать setLayoutParams, но физический размер почему-то остался прежним для видимых элементов управления, и размер важен из-за координат, которые я сохраняю для других случаев. Он даже присутствует под пользовательским заголовком, а координаты возвращаются как отрицательные, и это тоже проблема.

Мне не нравится идея статической установки размера из-за разных размеров экрана.

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

<org.danizmax.tradar.MapView
android:id="@+id/mapView" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content"
/>

<!-- koordinate -->
<LinearLayout android:id="@+id/controls"
android:orientation="horizontal"
android:layout_width="fill_parent" 
android:layout_height="fill_parent"
android:paddingLeft="10sp"
android:paddingRight="10sp">

    <TextView android:id="@+id/coordsText" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent"
    android:textStyle="bold"
    android:textSize="15sp"
    android:gravity="center"
    android:layout_weight="1">
    </TextView>

</LinearLayout>

<!-- radij -->
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent" 
android:layout_height="wrap_content"
android:paddingBottom="10sp"
android:paddingLeft="-5sp"
android:paddingRight="-5sp">
    <Button android:text="" 
        android:id="@+id/ButtonInc"
        android:background="@drawable/leftbuttonani"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:layout_weight="1">
        </Button>
    <TextView android:id="@+id/radiusSize" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"
        android:textStyle="bold"
        android:textSize="16sp"
        android:gravity="center"
        android:layout_weight="1"
        android:paddingLeft="0sp"
        android:paddingRight="0sp">
        </TextView>
    <Button android:text="" 
        android:id="@+id/ButtonDec"
        android:background="@drawable/rightbuttonani"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:layout_weight="1">
        </Button>
</LinearLayout>

<!-- alert togle -->
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent" 
android:layout_height="wrap_content"
android:paddingLeft="-5sp"
android:paddingRight="-5sp">
    <Button android:text="" 
        android:id="@+id/ButtonDec"
        android:background="@drawable/buttonani"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:layout_weight="1">
        </Button>
    <ToggleButton
        android:id="@+id/toggleAlert"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:textColor="#D8D8D8"
        android:background="@drawable/buttonani"
        android:textOn="@string/alertOn"
        android:textOff="@string/alertOff"
        android:textStyle="bold"
        android:layout_weight="0.5"
        android:paddingTop="1sp">
        </ToggleButton>
    <Button android:text="" 
        android:id="@+id/ButtonDec"
        android:background="@drawable/buttonani"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:layout_weight="1">
        </Button>
</LinearLayout>

<!-- izpis zadnjega dogodka -->
<TextView android:id="@+id/timeStatText" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content"
android:textStyle="bold"
android:textSize="10sp"
android:gravity="center">
</TextView>

This is how it should look, the blue part is MapView:

alt text

любая идея?


person danizmax    schedule 15.12.2010    source источник
comment
вот он, но где бы я его ни поставил, даже в нелепом месте, он будет таким же.   -  person danizmax    schedule 15.12.2010
comment
попробуйте присоединить линейные макеты к общему линейному макету, например ‹linlay_outer› ‹linlayout_inner1› .... ‹/linlayout_inner1› ‹linlayout_inner2› ... ‹/linlayout_inner2› ‹/linlayout_outer›   -  person mad    schedule 15.12.2010
comment
вы пытаетесь поместить этот пользовательский просмотр карты под другие элементы управления? что вы имеете в виду его растягивание и выталкивание элементов управления под видом за пределы экрана? Итак, MapView - это фоновое изображение, о котором вы говорите?   -  person slim    schedule 15.12.2010
comment
нет, в верхней части элементов управления и под строкой заголовка c. Да, Mapview должен занимать ровно столько места, сколько изменяется размер фонового изображения, обратите внимание, что фоновое изображение имеет правильный размер и занимает только верхнюю часть экрана, нижняя часть черного цвета там, где должны быть элементы управления.   -  person danizmax    schedule 15.12.2010
comment
Я добавил изображение прототипа приложения, там не хватает еще двух кнопок слева и справа от кнопки переключения, но это не важно.   -  person danizmax    schedule 15.12.2010
comment
и в настоящее время эта синяя часть не расширяется на всю ширину и высоту, как на этой картинке? Просто пытаетесь понять, каков ваш желаемый результат?   -  person slim    schedule 15.12.2010
comment
Конечно, без проблем: P Ну, синяя часть - это фон, размер которого я изменяю в onDraw () до нужного размера, и он не больше, чем вы видите сейчас. Элементы управления, которые вы видите ниже, отсутствуют, и есть пустота. Пустота по-прежнему остается MapView, я знаю это, потому что все еще могу рисовать на ней.   -  person danizmax    schedule 15.12.2010


Ответы (1)


Проблема была решена переопределением onMeasure ():

    @Override
    protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec){
       super.onMeasure(widthMeasureSpec, heightMeasureSpec);

       int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
       int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
       if(parentWidth<parentHeight){
           this.setMeasuredDimension(parentWidth, (int)(parentWidth*(float)factor));
       }else{
           this.setMeasuredDimension((int)(parentHeight/(float)factor), parentHeight);
       }
    }

Более подробный ответ был найден ЗДЕСЬ.

person danizmax    schedule 19.12.2010
comment
@danixmax Я столкнулся с той же проблемой, что и ваша. Не могли бы вы объяснить мне фактор в вашем коде? - person vinothp; 06.11.2014
comment
@Vino Давно давно я сделал это, но я считаю, что это был всего лишь коэффициент масштабирования для компонента. Например, если коэффициент равен 0,5, представление будет в два раза меньше размера своего родителя. Как объясняется в ответе, моя проблема заключалась в том, что я забыл переопределить метод, и поэтому мой код не был выполнен. - person danizmax; 07.11.2014
comment
спасибо даниз. Я попытался переопределить метод onmeasure. Ширина работает нормально, но не высота (с учетом родительской высоты). Я представляю это представление между двумя представлениями как match_parent как для ширины, так и для высоты. Не уверены, что у вас есть представление об этом? - person vinothp; 07.11.2014
comment
Вероятно, вам стоит задать реальный вопрос, поскольку без XML макета и изображения трудно найти проблему. - person danizmax; 10.11.2014