2013-07-31 22 views
9

ausblenden Ich möchte Spinner Prompt Popup auf außen klicken. Wenn das Aufforderungs-Popup geöffnet ist und der Benutzer die Home-Tasten-Aktivität drückt, wird dies minimiert, wenn der Benutzer die Anwendung erneut öffnet, sollte das Aufforderungs-Popup verschwinden.
Gibt es eine Möglichkeit, dies zu erreichen. Vielen DankWie Spinner DropDown Android

Bearbeiten: - Aufforderung Popup ist nicht angepasst. So kann ich sie in oder onResume Methoden nicht verstecken.

+0

Blinde Vermutung zu schließen (so geht es nicht als Antwort): würde Fokus aus dieser Sicht auf 'onResume()' löst das Problem nicht zu nehmen? –

+0

Sie benötigen die Methode onStart() oder onResume(). – saravanan

Antwort

12

Nun, es ist ein wenig kompliziert, als ich dachte.

Ich füge die Schritt für Schritt Details hier hinzu. Versuch es zu folgen. Ich konnte dies in API 10 erreichen.

Und diese Lösung setzt voraus, dass Sie den Eingabeaufforderungsdialog programmatisch schließen sollen, wenn der Benutzer auf die Home-Taste klickt oder wenn Sie zur nächsten Aktivität ohne Benutzerinteraktion wechseln mussten

Der erste Schritt besteht darin, einen benutzerdefinierten Spinner durch Erweitern der Spinner-Klasse zu erstellen. Lassen Sie uns sagen, ich geschaffen habe eine Klasse CustomSpinner im Paket com.bts.sampleapp

Meine CustomSpinner Klasse wie folgt aussieht genannt,

package com.bts.sampleapp; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.widget.Spinner; 

    public class CustomSpinner extends Spinner{ 
     Context context=null; 

     public CustomSpinner(Context context) { 
      super(context); 
      this.context=context; 
     } 

     public CustomSpinner(Context context, AttributeSet attrs, int defStyle) { 
      super(context, attrs, defStyle); 
     } 

     public CustomSpinner(Context context, AttributeSet attrs) { 
      super(context, attrs); 
     } 

     @Override 
     public void onDetachedFromWindow() { 
      super.onDetachedFromWindow(); 
     } 
    } 

nun in der XML-Datei, ersetzen Spinner Element von diesem Brauch Spinner,

 <com.bts.sampleapp.CustomSpinner 
     android:id="@+id/spin" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

Der nächste Schritt ist zu initialisieren und setzen Adapter auf diese Spinner in Ihrer Aktivitätsklasse,

Der letzte Schritt ist das Schließen des Dialogfelds, wenn der Benutzer auf HomeButton klickt oder wenn die Aktivität in den Hintergrund wechselt. Um dies zu tun, außer Kraft setzen wir die onPause() wie diese,

@Override 
    protected void onPause() { 
     Log.i("Life Cycle", "onPause"); 
     spin.onDetachedFromWindow(); 
     super.onPause(); 
    } 

Jetzt im onPause() rufen Sie die Methode spin.onDetachedFromWindow();, die den Job von für die Aufforderung Dialog zu schließen.

Wenn Sie von einer beliebigen Stelle innerhalb der Aktivitätsliste ausaufrufen, sollte das Dialogfeld der Spinner-Eingabeaufforderung geschlossen werden, wenn es geöffnet ist.

+0

Es funktioniert ... Noch eine Sache, können wir das gleiche Element zweimal in Spinner auswählen .. Ich denke, wir müssen Customspinner Klasse dafür ändern? –

+0

Sie meinen wie eine Mehrfachauswahl? Ich bin nicht sicher. Ich habe es nicht ausprobiert. Sorry dafür .. –

+0

Nicht multiple Auswahl nehmen Sie an, Ihr Spinner hat 5 Elemente, die Sie Element 2 ausgewählt haben, dann erneut, wenn Sie Element 2 Spinner nicht onArtSelection Methode –

0
  • Sie können Popup Aktivität als Dialog Theme.
  • Überschreiben onPause Methode.

    geschützt void onPause() { super.onPause(); this.finish(); }

12

Basierend auf der Antwort von Andro, bevorzugen Sie möglicherweise Reflektion, um die geschützte Methode onDetachedFromWindow aufrufen zu können. Dann müssen Sie Spinner nicht unterteilen, das Layout anpassen usw.

/** 
* Hides a spinner's drop down. 
*/ 
public static void hideSpinnerDropDown(Spinner spinner) { 
    try { 
     Method method = Spinner.class.getDeclaredMethod("onDetachedFromWindow"); 
     method.setAccessible(true); 
     method.invoke(spinner); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
-1

spinner.clearFocus();

ist diese einfache Linie Spinner programitically