Zastanawiam się, jak mogę zrobić przycisk/menu rozwijane, takie jak te, które widzimy w specyfikacjach projektów od Google i na zdjęciu poniżej, więc lista rozszerza się w prawo poniżej przycisku. Czy muszę ustawić dla niego niestandardowy układ zamiast R.layout.support_simple_spinner_dropdown_item
?Przyciski rozwijania/Spinner, jak te w specyfikacji projektu z Google
Odpowiedz
Technicznie to tylko Spinner z widoków niestandardowych i stylów.
Próbowałem zrobić taki, który wygląda podobnie do tego, który opublikowałeś, używając AppCompat, pracując z niestandardowymi rysunkami iz właściwością elewacji widoku, dlatego może nie działać całkowicie dla wersji Androida starszych niż 5.0.
Najpierw niech nam określić nasze Spinner
ze swoich właściwości rozwijanych:
<your.package.CustomSpinner
android:id="@+id/spinner"
style="@style/Widget.AppCompat.Spinner"
android:layout_margin="10dp"
android:layout_width="200dp"
android:dropDownWidth="200dp"
android:layout_height="?attr/dropdownListPreferredItemHeight"
android:dropDownVerticalOffset="?attr/dropdownListPreferredItemHeight"
android:background="@drawable/spinner_bg"
android:popupBackground="@android:color/white"
android:paddingRight="14dp"
android:stateListAnimator="@drawable/spinner_sla"
android:popupElevation="3dp" />
Ważne: Używamy CustomSpinner
class from this post, ponieważ potrzebujemy wywołania zwrotne wiedzieć kiedy spinner otwiera zamyka (dla celów stylizacji).
Następnie konfigurujemy pokrętło: używamy niestandardowego widoku dla wybranego elementu (układ zdefiniowany poniżej), aby zastosować nasze style, oraz domyślnego ustawienia AppCompat R.layout.support_simple_spinner_dropdown_item
, ale możemy użyć innego układu, aby jeszcze bardziej dostosować stylizację.
String[] data = {"Arial", "Calibri", "Helvetica", "Roboto", "Veranda"};
ArrayAdapter adapter = new ArrayAdapter<>(getContext(), R.layout.spinner_item_selected, data);
adapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
final CustomSpinner spinner = (CustomSpinner) view.findViewById(R.id.spinner);
spinner.setAdapter(adapter);
spinner.setSpinnerEventsListener(new CustomSpinner.OnSpinnerEventsListener() {
public void onSpinnerOpened() {
spinner.setSelected(true);
}
public void onSpinnerClosed() {
spinner.setSelected(false);
}
});
I tu spinner_item_selected.xml
układ:
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
style="?attr/spinnerDropDownItemStyle"
android:singleLine="true"
android:layout_width="match_parent"
android:layout_height="?attr/dropdownListPreferredItemHeight"
android:background="@drawable/abc_spinner_mtrl_am_alpha"
android:ellipsize="marquee" />
Dalsze potrzebujemy kanału alfa używane powyżej:
spinner_bg.xml
jak turbinki w tle:
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:exitFadeDuration="@android:integer/config_mediumAnimTime">
<item android:state_pressed="true" android:drawable="@android:color/white" />
<item android:state_selected="true" android:drawable="@android:color/white" />
<item>
<inset android:insetLeft="-1dp" android:insetRight="-1dp">
<shape android:shape="rectangle">
<stroke android:width="1dp" android:color="#cccccc" />
<solid android:color="#f0f0f0" />
</shape>
</inset>
</item>
</selector>
spinner_sla.xml
animować spinner na wysokość:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<set>
<objectAnimator
android:duration="@android:integer/config_mediumAnimTime"
android:propertyName="translationZ"
android:valueTo="3dp" />
</set>
</item>
<item android:state_selected="true">
<set>
<objectAnimator
android:duration="@android:integer/config_shortAnimTime"
android:propertyName="translationZ"
android:valueTo="3dp" />
</set>
</item>
<item>
<set>
<objectAnimator
android:duration="@android:integer/config_shortAnimTime"
android:propertyName="translationZ"
android:valueTo="0" />
</set>
</item>
</selector>
To daje nam wynik takiego (z lewej zawalił, tuż otwarty):
Jeśli chcemy użyć tarczy z obrazami, to musimy także zdefiniować niestandardową listę rozwijaną widok przedmiotu.
Można użyć PopupMenu http://developer.android.com/intl/es/reference/android/widget/PopupMenu.html
PopupMenu popup = new PopupMenu(context, view);
for (Element e: elementsList) {
popup.getMenu().add(e.id).setTitle(e.title);
}
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
return true;
}
});
popup.show();