#android #layout #popup
#Android #макет #всплывающее окно
Вопрос:
У меня есть несколько всплывающих окон на моем экране, и мне нужно что-то не такое распространенное.
Я оформляю свое всплывающее окно с помощью заголовка содержимого нижнего колонтитула в 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 и позволил «контенту» иметь некоторый верхний предел, но это не работает.
Я знаю, что это можно сделать с помощью AbsoluteLayout, но я избегаю этого любой ценой.
Редактировать:
Следуя ответу Джоша, я написал следующий код.
<?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:
Я не буду притворяться, что прочитал весь этот xml. Я думаю, что вам нужен RelativeLayout, хотя. Вы должны быть в состоянии использовать этот метод для размещения любого вида со стрелкой там, где вам нравится, относительно границ RelativeLayout, который его охватывает.
Например, если вы объедините все, что у вас есть, в один RelativeLayout, а затем добавите, скажем, кнопку в качестве второго элемента, вы можете присвоить кнопке такие атрибуты, как alignParentRight=true и layout_marginRight=10dp, чтобы поместить кнопку на 10dp с правого края экрана поверх всех уже имеющихся представлений.
Комментарии:
1. Я знаю, это расширенный код. Я собираюсь протестировать ваше решение.
2. Хорошо подмечено @Josh, я согласен с тобой,
RelativeLayout
определенно решило бы проблему. 1 за компактное описание решения.3. Ну, я попытался следовать вашему решению, но стрелка сейчас не появляется. Я добавил код с помощью I try it в свой вопрос.
4. Не используйте атрибут layout_above в вашем ImageView. Это пытается переместить стрелку вверх в направлении y экрана (вне экрана), а не выше, как в depth / layers.
5. Layout_above предназначен только для отображения его в верхней части моего макета. Итак, как я могу это сделать?