2016-04-07 12 views
8

I m lavorando sul design erano filatore sembra personalizzato quello che voglio è quando filatore popup discesa al di sotto del filatore voglio usato immagine popupbackground diversa e quando pop-up al di sopra del filatore voglio usare pop-up di sfondo diversocome rilevare se il menu a discesa è mostrato sopra o sotto lo spinner in Android?

ecco il mio codice Xml:

<Spinner 
    android:id="@+id/spinner1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:spinnerMode="dropdown" 
    android:popupBackground="@drawable/spinnerbottombg" 
    android:overlapAnchor="false" 
    android:drawSelectorOnTop="false" 

    /> 

ora domanda è: come faccio a sapere filatore aprire l'elenco a discesa di sopra o al di sotto di essa

+0

Stai chiedendo come applicare lo stile personalizzato in filatrice? o come sapere se il menu a discesa è visualizzato sopra o sotto lo spinner? Chiarire perché il tuo titolo confonde lo – Anonymous

+1

come rilevare se il menu a tendina è mostrato sopra o sotto lo spinner? – Nawaf

+0

usa android: spinnerMode = "dialog" nel tuo file xml –

risposta

10

I scavare in profondità nel PopupWindow e ha scoperto che il vostro requisito potrebbe essere raggiunto attraverso

StateListDrawable

seguenti codici spiegare tutto-

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.mmbarno.dummyalertdialog.MainActivity"> 

    <Spinner 
     android:id="@+id/spinner" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:spinnerMode="dropdown" 
     android:overlapAnchor="false" 
     android:drawSelectorOnTop="false" /> 
</RelativeLayout> 

popup_bg_above.xml

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <solid android:color="#FF4081" /> 
</shape> 

popup_bg_below.xml

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <solid android:color="#3F51B5" /> 
</shape> 

Infine in MainActivity.java

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Spinner spinner = (Spinner) findViewById(R.id.spinner); 
    spinner.setPopupBackgroundDrawable(getPopupBg()); 
    populateSpinner(); 
} 

private void populateSpinner() { 
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, 
      R.array.planets_array, android.R.layout.simple_spinner_item); 
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    spinner.setAdapter(adapter); 
} 

private StateListDrawable getPopupBg() { 
    StateListDrawable states = new StateListDrawable(); 
    int identifier = Resources.getSystem().getIdentifier("state_above_anchor", "attr", "android"); 
    states.addState(new int[] {identifier}, ContextCompat.getDrawable(this, R.drawable.popup_bg_below)); 
    states.addState(new int[]{}, ContextCompat.getDrawable(this, R.drawable.popup_bg_above)); 
    return states; 
} 

Spero che la vostra esigenza sarà soddisfatta. L'ho provato in diversi scenari insieme a ScrollView. E funziona perfettamente.

Popup Below

Popup Above

+0

@Andreyua Ho dato tutti i codici sorgente. Hai solo bisogno di mettere un array di stringhe (matrice_pianeti) in strings.xml ed eseguire questo codice. Spero che funzionerà. – MMBarno

+0

Ok, cosa succederà. Come determinare "ottenere lo stato attuale o qualcosa del genere"? – Andreyua

+1

@Andreyua Non in realtà. PopupWindow gestisce se stesso durante l'impostazione dello sfondo. Segui https://developer.android.com/reference/android/widget/PopupWindow.html e in particolare il metodo "setBackgroundDrawable (Drawable background)". Spero tu capisca chiaramente il meccanismo. – MMBarno

Problemi correlati