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).
добавить
mMyDrawabletomMyViewв качестве оверлея: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); }