Android накладывает вид на все?
можете ли вы наложить вид поверх всего в android?
в iPhone я бы получил новый вид установить его frame.origin
до (0,0) и его ширина и высота до ширины и высоты self.view
. Добавление его в self.view
затем заставит его действовать как наложение, покрывая содержимое позади (или если у него был прозрачный фон, а затем показывал вид сзади).
есть ли подобная техника в android? Я понимаю, что взгляды немного отличаются (есть три типа (или более...) relativelayout, linearlayout и framelayout) но есть ли способ просто наложить представление поверх всего без разбора?
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"
лучший способ-это ViewOverlay , вы можете добавить любого выигрышного качестве оверлея в любом виде, как его наложения, поскольку JellyBeanMR2 Андроид программирования(API 18).
добавить
mMyDrawable
tomMyView
в качестве оверлея: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); }