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


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

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

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

5 67

5 ответов:

просто использовать 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 довольно мощный. Вы можете определить правила, как посмотреть нужно выровнять родительского макета дно!--17-->,вид B должен выровнять снизу вверх, etc

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

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

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

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

<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" появится как наложение с гравитация = правильно на линейной компоновке с android:id="@+id/Everything"

можно использовать bringToFront:

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

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

добавить mMyDrawable to mMyView в качестве оверлея:

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

Я пробовал ости раньше, но это не сработало. Теперь я jsut использовал 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);
            }