Вид поверх другого Вид - PullRequest
1 голос
/ 02 мая 2011

У меня есть несколько всплывающих окон на моем экране, и мне нужно что-то не очень распространенное.

Я размещаю всплывающее окно с помощью заголовка + содержимого + нижнего колонтитула в LinearLayout. Но мне нужна маленькая стрелка, чтобы показать на моем компоненте.

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

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

<LinearLayout android:id="@+id/header" android:background="@drawable/background_header"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="wrap_content">
</LinearLayout>

<HorizontalScrollView android:background="@drawable/background"
    android:layout_width="wrap_content" android:layout_height="match_parent"
    android:scrollbars="none">

</HorizontalScrollView>

<ImageView android:id="@+id/arrow_down" android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:layout_marginTop="-3dip"
    android:src="@drawable/quickcontact_arrow_down" />
</LinearLayout>

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

    ViewGroup.MarginLayoutParams param = (ViewGroup.MarginLayoutParams) mArrowDown
            .getLayoutParams();
    param.leftMargin = root.getMeasuredWidth()
            - (screenWidth - anchor.getLeft());

И это показывают правильно.

Теперь мне нужно сделать то же самое, но стрелка должна показываться вверх. Моя проблема в том, что стрелка должна немного перекрывать другой вид (потому что цвет фона соответствует им), поэтому нужно рисовать после.

Я попытался с FrameLayout, и у «содержимого» есть некоторый topMargin, но он не работает.

Я знаю, что это можно сделать с помощью AbsoluteLayout, но я избегаю этого любой ценой.

EDIT:

Следуя ответу Джоша, я написал следующий код.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content" android:layout_height="wrap_content">
<LinearLayout android:id="@+id/content"
    android:orientation="vertical" android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:fadingEdgeLength="0dip">

    <RelativeLayout android:id="@+id/header"
        android:background="@drawable/background_header" android:orientation="horizontal"
        android:layout_width="match_parent" android:layout_height="wrap_content">
    </RelativeLayout>

    <HorizontalScrollView android:background="@drawable/background"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:scrollbars="none">
    </HorizontalScrollView>
</LinearLayout>
<ImageView android:id="@+id/arrow_up" android:layout_above="@id/content"
    android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:src="@drawable/quickcontact_arrow_up" />
</RelativeLayout>

Но я не знаю почему, стрелка не показывается сейчас.

1 Ответ

4 голосов
/ 02 мая 2011

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

Если вы оберните все, что у вас есть, например, в один RelativeLayout, а затем добавите, скажем, Button в качестве второго элемента, вы можете дать атрибуты кнопки, такие как alignParentRight = true и layout_marginRight = 10dp, чтобы разместить кнопку 10dp из правый край экрана, на вершине всех видов уже есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...