Android накладає вид на все?


75

Чи можете ви накласти вигляд поверх усього в android?

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

Чи існує подібна техніка в android? Я розумію, що погляди дещо відрізняються (існує три типи (або більше ...) relalayout, linearlayout та framelayout), але чи є спосіб просто накласти погляд поверх усього без розбору?

Відповіді:


101

Просто використовуйте 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 має вирівнювати A знизу вгору тощо

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

Зазвичай ви встановлюєте вміст за допомогою setContentView(R.layout.your_layout)in onCreate(це роздує макет для вас). Ви можете зробити це вручну і зателефонувати setContentView(inflatedView), немає різниці.

Сам вигляд може бути одним видом (наприклад TextView) або складною ієрархією макета (вкладені макети, оскільки всі макети - це самі подання).

Після виклику setContentViewваша активність знає, як виглядає її вміст, і ви можете використовувати її (FrameLayout) findViewById(R.id.root_view)для отримання будь-якого подання в цій ієрархії (загальний шаблон (ClassOfTheViewWithThisId) findViewById(R.id.declared_id_of_view)).


Ах, дякую за приклад. Тож я припускаю, що у певному виді подання вмісту, мабуть, є рамковою версією? Якщо я використовую a layoutinflaterдля захоплення relativelayoutфайлу xml макета, як я можу додати його до подання вмісту? Чи є спосіб отримати посилання на перегляд вмісту? Дякую
Thomas Clayson

Я оновив свою відповідь, тому вона пояснює, що таке зміст діяльності та як з нею взаємодіяти.
Knickedi

Блискуче. Дуже дякую. :)
Томас Клейсон,

1
Я хотів би зазначити, що, хоча я віддаю перевагу FrameLayoutзавдяки своїй легкій природі, він не поширює максимальну виміряну висоту (тобто власну результуючу висоту) своїм дітям у разі match_parentзростання, див. Тут . Тому підтримка Android 2 та робота з match_parent, RelativeLayoutє єдиним робочим варіантом; приклад див. тут .
класний штабелер

JFYI: Для Android 4.4.4 для мене було достатньо розмістити фрагмент як накладення. З Android 5.0 деякі елементи, такі як кнопки та перегляди карт, розміщені зверху. З рішенням у відповіді, це працює як шарм.
промінь

16
<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", відображатиметься як накладення з гравітацією = прямо на Linear Layout with android:id="@+id/Everything"



9

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

Додати mMyDrawableв mMyViewкачесіве:

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

друкарська помилка: mMyDrawable.setBounds
yk4ever

Дякуємо за ваше рішення. Але ви можете отримати доступ до компонентів перегляду із зображення. Наприклад, якщо у вашому поданні є кнопка, якщо ви клацаєте зображення, кнопка оригінального перегляду натискається автоматично.
Ранджит Субраманіам,

@RanjithSubramaniam Так, через це просто накладений малюнок, намальований над видом.
Jacks Gong

Але це не спрацює, якщо вигляд потрібно поставити поверх іншого, оскільки малюнок є лише графікою
Neeraj Sewani,

0

Я вже пробував антисенсери, але це не спрацювало. Зараз я використовував 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);
            }

1
Думаю, щоб зробити цю справді корисну відповідь, вам слід додати ще трохи. Приклад коду, знімки екрана, ...
GhostCat

0

Я щойно вирішив це. Я створив для цього бібліотеку, щоб зробити це багаторазовим способом, тому вам не потрібно перекодувати у своєму XML. Ось документація про те, як використовувати його в Java та Kotlin . По-перше, ініціалізуйте його з дії, звідки ви хочете показати накладення-

AppWaterMarkBuilder.doConfigure()
                .setAppCompatActivity(MainActivity.this)
                .setWatermarkProperty(R.layout.layout_water_mark)
                .showWatermarkAfterConfig();

Тоді ви можете приховати та показати його з будь-якої точки програми -

  /* For hiding the watermark*/
  AppWaterMarkBuilder.hideWatermark() 

  /* For showing the watermark*/
  AppWaterMarkBuilder.showWatermark() 

Попередній перегляд GIF -

попередній перегляд

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.