Android накладывает вид на все?

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

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

Есть ли подобная техника в Android? Я понимаю, что взгляды немного разные (есть три типа (или более...) relativelayout, linearlayout и framelayout), но есть ли способ просто наложить представление поверх всего без разбора?

Ответ 1

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

Android поддерживает шаблон, который Cocoa Touch SDK не поддерживает: Управление макетами.
Макет для iPhone означает положение абсолютно (кроме некоторых факторов strech). Макет в 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 довольно мощный. Вы можете определить такие правила, как "Вид А", чтобы выровнять родительский макет внизу, "Вид В" должен выровнять снизу вверх и т.д.

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

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

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

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

Ответ 2

<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 в линейной компоновке с android:id="@+id/Everything"

Ответ 3

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

    View view=findViewById(R.id.btnStartGame);
    view.bringToFront();

Ответ 4

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

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

mMyDrawable.setBounds(0, 0, mMyView.getMeasuredWidth(), mMyView.getMeasuredHeight())
mMyView.getOverlay().add(mMyDrawable)

Ответ 5

Я уже пробовал 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);
            }