J'ai dû superposer une mise en page simple par programme en plus de toute activité visible. Les xml de disposition d'activité normale ne savent rien de l'overlay. La mise en page comporte un composant textview, mais n'importe quelle structure peut vous convenir. Ceci est ma disposition de superposition.
res/layout/identity.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/identitylayout"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_centerInParent="true" >
<TextView
android:id="@+id/identityview"
android:padding="5dp"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:textColor="#FFFFFF" android:background="#FF6600"
android:textSize="30dp"
/>
</RelativeLayout>
Overlay est affichée au-dessus du contenu existant, après le délai est supprimé de l'écran. L'application appelle cette fonction pour afficher la superposition.
private void showIdentity(String tag, long duration) {
// default text with ${xx} placeholder variables
String desc = getString(R.string.identity);
desc = desc.replace("${id}", reqId!=null ? reqId : "RequestId not found");
desc = desc.replace("${tag}", tag!=null ? tag : "");
desc = desc.trim();
// get parent and overlay layouts, use inflator to parse
// layout.xml to view component. Reuse existing instance if one is found.
ViewGroup parent = (ViewGroup)findViewById(R.id.mainlayout);
View identity = findViewById(R.id.identitylayout);
if (identity==null) {
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
identity = inflater.inflate(R.layout.identity, parent, false);
parent.addView(identity);
}
TextView text = (TextView)identity.findViewById(R.id.identityview);
text.setText(desc);
identity.bringToFront();
// use timer to hide after timeout, make sure there's only
// one instance in a message queue.
Runnable identityTask = new Runnable(){
@Override public void run() {
View identity = findViewById(R.id.identitylayout);
if (identity!=null)
((ViewGroup)identity.getParent()).removeView(identity);
}
};
messageHandler.removeCallbacksAndMessages("identitytask");
messageHandler.postAtTime(identityTask, "identitytask", SystemClock.uptimeMillis()+duration);
}
minuterie messageHandler est membre de l'instance principale d'activité (messageHandler privé Handler) où je mets toutes les tâches planifiées. J'utilise Android 4.1 périphérique inférieur à celui que je ne sais pas ce qui se passe.
Cela a fonctionné parfaitement. Merci. Connaissez-vous un moyen d'y parvenir sans avoir à modifier la mise en page xml des activités? Toutes les activités de mon application auront besoin de cela et il semble inefficace d'avoir à emballer toutes les mises en page des activités dans un framelayout afin que ce bouton contextuel apparaisse au-dessus quand nécessaire. – cottonBallPaws
Vous pouvez créer une sous-classe d'activité que toutes vos activités étendent, et avoir une certaine logique pour insérer de manière programmée la mise en page particulière dans un FrameLayout. –