web-dev-qa-db-fra.com

Comment afficher une vue en superposition d'une autre?

J'ai deux vues qui prennent la totalité de l'écran et je veux afficher les deux vues en même temps, l'une au-dessus de l'autre. Ma disposition ressemble à ceci:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:orientation="vertical">

    <WebView 
        Android:id="@+id/webview"
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
    />

    <org.example.myCustomView
        xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
    />

</LinearLayout>

Notez que myCustomView utilise onDraw (cette dernière instruction de méthode est invalidate ()) pour dessiner des graphiques personnalisés. Le problème que j'obtiens est qu'il affiche uniquement myCustomView, WebView est masqué. J'ai essayé de changer la couleur d'arrière-plan de mycustomView en transparent mais cela ne fait aucune différence.

Je voudrais également avoir la possibilité de créer myCustomView en superposition sur WebView ou vice versa.

29
ace

Utilisez un RelativeLayout pour commencer.

Vous pouvez utiliser la ViewGroup.addView(View child, int index, ViewGroup.LayoutParams params) ou une variante avec ViewGroup.removeView(View view) ou ViewGroup.removeViewAt(int index).

Cela vous obligerait évidemment à gonfler les vues manuellement en utilisant LayoutInflater mais vous pourriez garder une référence globale à chacune après le gonflement et simplement basculer entre les deux.

23
techiServices

Je ne sais pas si vous pouvez le faire lorsqu'ils sont dans le même fichier xml, mais je sais que si vous vous déplacez:

<org.example.myCustomView
    xmlns:Android="http://schemas.Android.com/apk/res/Android"  
    Android:layout_width="fill_parent"   
    Android:layout_height="fill_parent" />

vers un autre fichier xml et créez une autre activité. définissez la vue de contenu sur le fichier xml qui contient org.example.myCustomView et appelez cette activité. dans le manifeste, lorsque vous ajoutez cette activité, ajoutez une déclaration de thème comme suit:

Android:theme="@Android:style/Theme.Dialog"

la déclaration complète devrait ressembler à ceci:

<activity Android:name=".name_of_activity"  
    Android:label="TextToBeOnTop"  
    Android:theme="@Android:style/Theme.Dialog">  
</activity>

le résultat ressemblera à ceci (seulement avec vos composants à la place):

enter image description here

bien qu'il soit possible de le faire quand ils sont toujours dans le même fichier xml. si c'est possible, cela serait probablement fait en laissant le manifeste seul et en modifiant votre costomeView comme suit:

<org.example.myCustomView 
    xmlns:Android="http://schemas.Android.com/apk/res/Android"  
    Android:layout_width="fill_parent"  
    Android:layout_height="fill_parent"  
    Android:theme="@Android:style/Theme.Dialog" />

(J'ai ajouté la déclaration de thème dans le CustomView)

si ce n'est pas ce que vous recherchez, je recommanderais quelque chose de similaire à ce que Nick Campion a dit, qui était de changer fillParent en wrapContent. vous pouvez le faire, ou vous pouvez choisir la taille souhaitée. voici deux options que vous pourriez utiliser:

<org.example.myCustomView  
    xmlns:Android="http://schemas.Android.com/apk/res/Android"  
    Android:layout_width="50dip"  
    Android:layout_height="50dip" /> 

(vous pouvez changer "50dip" en n'importe quel nombre tant qu'il se termine par dip)

ou:

<org.example.myCustomView  
    xmlns:Android="http://schemas.Android.com/apk/res/Android"  
    Android:layout_width="wrap_content"  
    Android:layout_height="wrap_content" />
15
Ephraim