2010-10-21 4 views
0

Ce que je voudrais accomplir est, à l'exécution, placer un bouton au milieu de l'écran, en tant que couche supérieure, recouvrant tout ce qui est en dessous. (Ce n'est pas grand, donc il ne couvrira pas complètement l'écran, juste ce qui se trouve en dessous.)Comment superposer un bouton par programmation?

J'ai regardé créer une boîte de dialogue personnalisée, mais cela bloque toutes les autres entrées utilisateur. Je veux que toutes les vues au-dessous de ce nouveau bouton agissent normalement et répondent à l'utilisateur, mais je veux juste ajouter (et enlever plus tard) le bouton au-dessus de tout.

J'espère que cela a du sens. Je me demande juste quelle pourrait être la meilleure approche à examiner?

Merci

Répondre

2

Utilisez un FrameLayout, avec le bouton comme il est 2ème enfant. Réglez-le sur GONE lorsque vous ne voulez pas qu'il soit visible.

+0

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

+2

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. –

1

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.

Questions connexes