Android перекрывает вид сверху всего? - PullRequest
69 голосов
/ 22 сентября 2011

Можете ли вы наложить вид поверх всего в Android?

В iPhone я бы получил новый вид, установив его frame.origin в (0,0), а его ширину и высоту в ширину и высоту.self.view.Добавление его к self.view может привести к тому, что оно будет действовать как наложение, покрывая содержимое позади (или если у него будет прозрачный фон, а затем вид сзади).

Есть ли подобная техника в android?Я понимаю, что представления немного отличаются (есть три типа (или больше ...) относительного, линейного и фреймов), но есть ли способ просто наложить вид поверх всего без разбора?

Ответы [ 5 ]

95 голосов
/ 22 сентября 2011

Просто используйте RelativeLayout или FrameLayout.Последнее дочернее представление будет перекрывать все остальное.

Android поддерживает шаблон, который не поддерживается в Cocoa Touch SDK: Управление макетом.
Макет для iPhone означает позиционировать все абсолютно (кроме некоторыхфакторы растяжения).Макет в Android означает, что дочерние элементы будут размещены относительно друг друга.

Пример (второй EditText полностью покроет первый):

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/root_view">

    <EditText
        android:layout_width="fill_parent"
        android:id="@+id/editText1"
        android:layout_height="fill_parent">
    </EditText>

    <EditText
        android:layout_width="fill_parent"
        android:id="@+id/editText2"
        android:layout_height="fill_parent">
        <requestFocus></requestFocus>
    </EditText>

</FrameLayout>

FrameLayout - это своего рода стек представлений,Сделано для особых случаев.

RelativeLayout довольно мощный.Вы можете определить правила, такие как Представление A должно выравнивать родительский макет снизу , Представление B должно выравнивать снизу вверх и т. Д.

Обновление на основе комментария

Обычно вы устанавливаете контент с помощью setContentView(R.layout.your_layout) в onCreate (это приведет к увеличению разметки для вас).Вы можете сделать это вручную и вызвать setContentView(inflatedView), в этом нет никакой разницы.

Само представление может представлять собой одиночное представление (например, TextView) или сложную иерархию макетов (вложенные макеты, поскольку все макеты являются самими представлениями).).

После вызова setContentView ваша деятельность знает, как выглядит ее содержимое, и вы можете использовать (FrameLayout) findViewById(R.id.root_view) для получения любого представления в этой иерархии (Общий шаблон (ClassOfTheViewWithThisId) findViewById(R.id.declared_id_of_view)).

15 голосов
/ 08 апреля 2014
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<LinearLayout
    android:id = "@+id/Everything"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <!-- other actual layout stuff here EVERYTHING HERE -->

   </LinearLayout>

<LinearLayout
    android:id="@+id/overlay"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="right" >
</LinearLayout>

Теперь любой вид, добавляемый в LinearLayout с помощью android:id = "@+id/overlay", будет отображаться как наложение с gravity = right в Linear Layout с android:id="@+id/Everything"

9 голосов
/ 05 января 2017

Вы можете использовать bringToFront:

    View view=findViewById(R.id.btnStartGame);
    view.bringToFront();
7 голосов
/ 05 декабря 2016

Наилучшим способом является ViewOverlay . Вы можете добавить любой рисованный объект как оверлей к любому представлению в качестве его наложения, начиная с Android JellyBeanMR2 (Api 18).

Добавьте mMyDrawable к mMyView в качестве наложения:

mMyDrawable.setBounds(0, 0, mMyView.getMeasuredWidth(), mMyView.getMeasuredHeight())
mMyView.getOverlay().add(mMyDrawable)
0 голосов
/ 09 августа 2017

Я пробовал awnsers раньше, но это не сработало. Теперь я просто использовал LinearLayout вместо TextureView, теперь он работает без проблем. Надеюсь, что это поможет некоторым другим, у которых есть такая же проблема. :)

    view = (LinearLayout) findViewById(R.id.view); //this is initialized in the constructor
    openWindowOnButtonClick();

public void openWindowOnButtonClick()
{
    view.setAlpha((float)0.5);
    FloatingActionButton fb = (FloatingActionButton) findViewById(R.id.floatingActionButton);
    final InputMethodManager keyboard = (InputMethodManager) getSystemService(getBaseContext().INPUT_METHOD_SERVICE);
    fb.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            // check if the Overlay should be visible. If this value is false, it is not shown -> show it.
            if(view.getVisibility() == View.INVISIBLE)
            {
                view.setVisibility(View.VISIBLE);
                keyboard.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
                Log.d("Overlay", "Klick");
            }
            else if(view.getVisibility() == View.VISIBLE)
            {
                view.setVisibility(View.INVISIBLE);
                keyboard.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...