Pouvez-vous superposer une vue au-dessus de tout dans Android?
Dans l'iPhone, la nouvelle vue définissait sa valeur frame.Origin
Sur (0,0) et ses largeur et hauteur sur la largeur et la hauteur de self.view
. En l'ajoutant à self.view
, Il agirait alors comme une superposition, couvrant le contenu derrière (ou s'il avait un arrière-plan transparent, affichant ensuite la vue derrière).
Existe-t-il une technique similaire sous Android? Je me rends compte que les vues sont légèrement différentes (il y a trois types (ou plus ...) de relativelayout, linearlayout et framelayout), mais existe-t-il un moyen de superposer une vue au-dessus de tout sans distinction?
Utilisez simplement RelativeLayout
ou FrameLayout
. La dernière vue enfant superposera tout le reste.
Android prend en charge un modèle que Cocoa Touch SDK n’a pas: Gestion de la présentation.
Layout pour iPhone signifie positionner tout ce qui est absolu (à part certains facteurs d'étirement). Layout in Android signifie que les enfants seront placés les uns par rapport aux autres).
Exemple (le second EditText couvrira complètement le premier):
<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
est une sorte de pile de vues. Fait pour des cas spéciaux.
RelativeLayout
est assez puissant. Vous pouvez définir des règles telles que La vue A doit aligner le bas de la présentation parent , La vue B doit aligner A de bas en haut , etc.
Mise à jour basée sur le commentaire
Habituellement, vous définissez le contenu avec setContentView(R.layout.your_layout)
dans onCreate
(cela gonflera la mise en page pour vous). Vous pouvez le faire manuellement et appeler setContentView(inflatedView)
, il n'y a pas de différence.
La vue elle-même peut être une vue unique (telle que TextView
) ou une hiérarchie de modèles complexe (modèles imbriqués, car tous les modèles sont eux-mêmes des vues).
Après avoir appelé setContentView
, votre activité sait à quoi ressemble son contenu et vous pouvez utiliser (FrameLayout) findViewById(R.id.root_view)
Pour récupérer n’importe quelle vue dans cette hiérarchie (modèle général (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>
Maintenant, toute vue que vous ajoutez sous LinearLayout avec Android:id = "@+id/overlay"
apparaîtra comme superposition avec gravité = droite sur la présentation linéaire avec Android:id="@+id/Everything"
Vous pouvez utiliser bringToFront
:
View view=findViewById(R.id.btnStartGame);
view.bringToFront();
La meilleure façon de procéder est de ViewOverlay , Vous pouvez ajouter n'importe quel dessin en tant que superposition à une vue en tant que superposition depuis Android JellyBeanMR2 (Api 18).
Ajoutez mMyDrawable
à mMyView
en tant que superposition:
mMyDrawable.setBounds(0, 0, mMyView.getMeasuredWidth(), mMyView.getMeasuredHeight())
mMyView.getOverlay().add(mMyDrawable)
J'ai essayé les auvents avant mais cela n'a pas fonctionné. Maintenant, j’ai utilisé un LinearLayout au lieu d’un TextureView, cela fonctionne maintenant sans problème. J'espère que cela aidera d'autres personnes qui ont le même problème. :)
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);
}