2010-11-19 3 views
2

I ont une MapActivity comme l'un des quatre onglets dans un TabActivity. Cette MapActivity peut lancer un PopupWindow qui est une légende. Le PopupWindow reste sur l'écran, en haut de la carte, jusqu'à ce que le bouton "Afficher la légende" soit de nouveau cliqué (avant et arrière, etc.).Ignorer Android PopupWindow lors du passage à un nouvel onglet dans TabActivity?

Le problème est que, lorsqu'un utilisateur passe à un autre onglet, le popupWindow reste persistant sur la vue.

J'ai essayé la mise en œuvre de la méthode OnPause() dans la classe MapActivity, et rejetant à partir de là. La force d'application se ferme avec cette méthode en place.

Toute aide? Merci!

EDIT: Voici une partie de mon code:

Dans le MainActivity, qui établit les quatre onglets:

Resources res = getResources(); // Resource object to get Drawables 
    TabHost tabHost = getTabHost(); // The activity TabHost 
    TabHost.TabSpec spec; // Reusable TabSpec for each tab 
    Intent intent; // Reusable Intent for each tab 

    // Create an Intent to launch an Activity for the tab (to be reused) 
    intent = new Intent().setClass(this, FirstActivity.class); 

    // Initialize a TabSpec for each tab and add it to the TabHost 
    spec = tabHost.newTabSpec("game").setIndicator("First", 
         res.getDrawable(R.drawable.ic_tab_game)) 
        .setContent(intent); 
    tabHost.addTab(spec); 

    // Do the same for the other tabs 
    intent = new Intent().setClass(this, SecondActivity.class); 
    spec = tabHost.newTabSpec("alerts").setIndicator("Second", 
         res.getDrawable(R.drawable.ic_tab_alert)) 
        .setContent(intent); 
    tabHost.addTab(spec); 

    intent = new Intent().setClass(this, MapActivity.class); 
    spec = tabHost.newTabSpec("map").setIndicator("Map", 
         res.getDrawable(R.drawable.ic_tab_map)) 
        .setContent(intent); 
    tabHost.addTab(spec); 

    intent = new Intent().setClass(this, LastActivity.class); 
    spec = tabHost.newTabSpec("experience").setIndicator("Last", 
         res.getDrawable(R.drawable.ic_tab_experience)) 
        .setContent(intent); 
    tabHost.addTab(spec); 

    tabHost.setCurrentTab(0); 

Maintenant, dans ma classe de MapActivity (qui s'étend MapActivity):

// Declare the Legend PopupWindow 
    mapLegendInflater = (LayoutInflater) MapActivity.this 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    mapLegendPopupLayout = mapLegendInflater.inflate(
      R.layout.maptablegendpopuplayout, null, false); 
    mapLegendPopup = new PopupWindow(mapLegendPopupLayout, 
      (int) (0.45 * getApplicationContext().getResources() 
        .getDisplayMetrics().widthPixels), 
      (int) (0.33 * getApplicationContext().getResources() 
        .getDisplayMetrics().heightPixels), true); 
    mapLegendPopup.setFocusable(false); 
    mapLegendPopup.setOutsideTouchable(true); 

      Boolean legendIsShown = false; 

    mapLegendButton = (Button) findViewById(R.id.buttonMapLegend); 
    mapLegendButton.setOnClickListener(mapLegendListener); 


private OnClickListener mapLegendListener = new OnClickListener() { 
    public void onClick(View v) { 
     // Launch or dismiss the map legend popup 
     if (legendIsShown) { 
      mapLegendPopup.dismiss(); 
      mapLegendButton.getBackground().clearColorFilter(); 
      legendIsShown = false; 
     } else { 
      mapLegendPopup.showAtLocation(
        findViewById(R.id.buttonMapLegend), Gravity.TOP 
          | Gravity.LEFT, 8, 
        (int) (0.23 * getApplicationContext().getResources() 
          .getDisplayMetrics().heightPixels)); 
      mapLegendButton.getBackground().setColorFilter(
        new LightingColorFilter(0xFFFFFFFF, 0xFFAA0000)); 
      // mapLegendButton.getBackground().setColorFilter(0xFFFFFF00, 
      // PorterDuff.Mode.MULTIPLY); 
      legendIsShown = true; 
     } 
    } 
}; 

J'espère que cela donne une idée de l'endroit où je suis. Tout fonctionne parfaitement bien sur l'onglet Carte. Ce n'est que lorsque la légende est affichée et que les onglets sont affichés sur d'autres vues.

+0

Fournissez le code, s'il vous plaît. – Cristian

+0

@Cristian: Le code est en hausse! – Rockmaninoff

Répondre

3

Je sais que vous avez dit que la mise en œuvre OnPause() ne fonctionne pas pour vous, mais je l'ai essayé et mettre en œuvre onResume() et OnPause() dans le MapActivity fonctionne pour moi. Je devais faire un View.post (new Runnable() {...}) dans onResume() car je ne pouvais pas recréer popupWindow pendant le onResume(), donc je devais le programmer pour qu'il se produise immédiatement après:

package com.esri.android.tabdemo; 

import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.view.Gravity; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.LinearLayout; 
import android.widget.PopupWindow; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MapActivity extends Activity 
{ 
    private TextView textView = null; 
    private PopupWindow popupWindow = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     textView = new TextView(this); 
     textView.setText("Hello World from MapActivity"); 
     setContentView(textView); 
    } 

    @Override 
    protected void onPause() 
    { 
     super.onPause(); 
     if (popupWindow != null) 
     { 
      popupWindow.dismiss(); 
      popupWindow = null; 
     } 
    } 

    @Override 
    protected void onResume() 
    { 
     super.onResume(); 
     final Context context = this; 
     textView.post(
      new Runnable() 
      { 
       public void run() 
       { 
        popupWindow = new PopupWindow(context); 
        LinearLayout linearLayout = new LinearLayout(context); 
        linearLayout.setOrientation(LinearLayout.VERTICAL); 
        Button button = new Button(context); 
        button.setText("Hello"); 
        button.setOnClickListener(new OnClickListener() 
        { 
         public void onClick(View v) 
         { 
          Toast.makeText(context, "Hello", Toast.LENGTH_SHORT).show(); 
         } 
        }); 
        linearLayout.addView(button); 
        popupWindow.setContentView(linearLayout); 
        popupWindow.showAtLocation(linearLayout, Gravity.LEFT | Gravity.BOTTOM, 10, 10); 
        popupWindow.update(256, 64); 
       } 
      } 
     ); 
    } 
} 
+0

Ça marche pour moi, – arun

1

Vous devriez gérer vos Dialogs en utilisant la méthode onCreateDialog(), tel que recommandé by the framework.

De cette façon, votre dialogue deviendra une partie de votre activité et il le fera lui-même.

Si vous ne voulez vraiment pas utiliser cela (je ne vois pas pourquoi cela serait le cas, mais quand même), vous pouvez utiliser setOwnerActivity() sur votre Dialog pour l'assigner à votre Activity.

+1

Ah, merci pour ce lien. Dans mon application, cependant, une fois la légende affichée, la fenêtre sous-jacente ne perd pas de focus. Pensez-vous que je devrais changer mon code PopupWindow (en utilisant un LayoutInflator) à un AlertDialog? Ou cela va-t-il se concentrer? L'objectif de la légende est de la placer sur la carte afin que l'utilisateur puisse toujours naviguer sur la carte, mais être capable de voir les symboles et ce qu'ils signifient. – Rockmaninoff

2

Vous pouvez initialiser votre popupwindown comme ceci:

mapLegendPopup = new PopupWindow(this); 
mapLegendPopup.setContentView (itemizeView); 
mapLegendPopup.setBackgroundDrawable (new BitmapDrawable()); // key is here 
mapLegendPopup.setWidth ((int) (0.45 * getApplicationContext().getResources() 
        .getDisplayMetrics().widthPixels)); 
mapLegendPopup.setHeight((int) (0.33 * getApplicationContext().getResources() 
        .getDisplayMetrics().heightPixels)); 
mapLegendPopup.setFocusable(false); 
mapLegendPopup.setOutsideTouchable(true); 
+0

Merci cela fonctionne bien – Karthi

Questions connexes