Ich kann nicht scheinen, um die gepresste Zustand Ripple auf einem Spinner zu arbeiten. Die einzelnen Dropdown-Elemente haben die Welligkeit, aber nicht den Spinner selbst. Ich dachte, dass dies vielleicht erwartetes Verhalten war, aber diese Animation aus den Material-Design-Richtlinien zeigt deutlich den Kreisel mit einem gedrückten Zustand, bevor das Drop-Down-Menü der Optionen erscheint.Android Spinner hat keine Ripple auf Knopf selbst, nur seine Optionen
Antwort
habe ich ein neues Spinner
in einem Activity
und wie Sie beschrieben, wird die RippleDrawable
nicht auf die Spinner
mit der v7 Kompatibilitätsbibliothek oder auf Android 5.0 und höher verwendet. Das ist nicht überraschend für mich; Google implementiert oft nicht sein eigenes Design.
Um den Effekt zu haben, war alles, was ich tat, ein RippleDrawable
in Res/Werte-v21/zu erstellen und das auf dem Spinner
spinner.setBackgroundResource(R.drawable.spinner_background);
Hintergrund zu sein. Ich bin sicher, dass Sie dies auch in Ihrem Thema festlegen können.
Ich fange an zu denken, dass Google absichtlich nicht implementieren Es ist ein eigenes Design, weil das Popup/Dropdown so schnell auftaucht. Es ist immer noch sehr frustrierend für mich, aber vielleicht bin ich die einzige Person, die das wirklich stört. Durch Einstellen des Hintergrunds wird der vorhandene Hintergrund entfernt, der einen gedrückten Zustand und einen getönten Indikator aufweist. Es ist auch nicht abwärtskompatibel. –
setzen diese Spinner Eigenschaften in xml
android:background="@drawable/ripple_effect"
android:dropDownSelector="@drawable/ripple_effect"
und ripple_effect.xml ähnliche Es
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="?android:colorControlHighlight" >
<item android:id="@android:id/mask">
<shape android:shape="rectangle" >
<solid android:color="?android:colorAccent" />
</shape>
</item>
</ripple>
Durch Einstellen des Hintergrunds wird der vorhandene Hintergrund mit einem gedrückten Status und einem getönten Indikator entfernt. Es ist auch nicht abwärtskompatibel. –
aussehen wird eine Bibliothek auf Github ist, das heißt Material Ripple Layout. Diese Bibliothek unterstützt Pre-Lollipop- und Lollipop-Geräte. Außerdem können Sie Ihre eigene Farbe für die Welligkeit erstellen. Hier ist die Verwendung:
Spinner spinner = (Spinner) findViewById(R.id.spinner);
MaterialRippleLayout.on(spinner)
.rippleColor(Color.BLACK)
.create();
Aber ich benutze diese Bibliothek nicht. Ich benutze die Standardwelligkeit Spinner
, die in Support-Bibliothek rev 23.0.1 eingeführt wird, indem kompiliert: compile 'com.android.support:appcompat-v7:23.0.1'
in build.gradle
des Moduls app
.
So, hier ist meine komplette Code für das Spinner
Layout:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Spinner
android:id="@+id/spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:dropDownVerticalOffset="@dimen/dropDown_spinner"
style="@style/SpinnerStyle"/> <!-- apply the ripple style -->
</RelativeLayout>
Der Stil in res/values/styles.xml
definiert:
<style name="SpinnerStyle" parent="Widget.AppCompat.Light.Spinner.DropDown.ActionBar">
<item name="android:background">?android:selectableItemBackground</item>
<item name="android:dropDownSelector">?android:selectableItemBackground</item>
<item name="android:divider">@null</item>
<item name="overlapAnchor">true</item>
</style>
Danach wird der Welleneffekt sollte wie erwartet funktionieren.
Durch Einstellen des Hintergrunds wird der vorhandene Hintergrund entfernt, der einen gedrückten Zustand und einen getönten Indikator aufweist. –
Ich habe diese coole Bibliothek verwendet, um einige Ansichten mit Welleneffekten zu versehen. Ich mag es, weil Sie jede Ansicht in der XML-Datei umschließen können und es wird der Welleneffekt angewendet.
https://github.com/balysv/material-ripple
Hoffe, es hilft.
Tut mir leid, ich bin nicht daran interessiert, eine Third-Party-Bibliothek zu verwenden, ich möchte diese Komponente nur richtig darstellen. –
Hope unterhalb Code wird Sinn machen, Ripple-Effekt auf Spinner.
ripple_spinner.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<ripple android:color="?android:attr/colorControlHighlight">
<item>
<shape>
<solid android:color="@android:color/white" />
</shape>
</item>
</ripple>
</item>
Ihre XML: -
your_acitivity.xml
<Spinner
android:id="@+id/spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:dropDownSelector="@drawable/ripple_spinner"
android:popupBackground="@drawable/popup_spinner_item_background"
/>
Im Folgenden wird der Hintergrund der Drop-down ändern.
popup_spinner_item_background.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="2dp" />
<solid android:color="@android:color/white" />
</shape>
In Ihrer res/Werte/styles.xml: -
styles.xml
<resources>
<style name="AppTheme" parent="android:Theme.Material.Light">
<!--Workaround for the Android bug-->
<item name="android:dropDownListViewStyle">@style/Theme.MyListView</item>
</style>
<style name="Theme.MyListView" parent="@android:style/Widget.Material.ListView.DropDown">
<item name="android:listSelector">@drawable/spinner_ripple</item>
</style>
</resources>
Hoffe, dass es Ihnen helfen.
Das Popup/Dropdown funktioniert bereits korrekt. Was ich versuche zu beheben, ist der gedrückte Zustand des Spinners selbst. –
Es gibt keine Welligkeit für den Spinner, da der Hintergrund nicht ripplable ist. Ich mache es wie folgt in einem selectableItemBackgroundBorderless
Layout (https://developer.android.com/training/material/animations.html#Touch):
ein
0
-widthSpinner
, und entfernen Sie den Pfeil nach unten Hintergrund (@null
verwenden ok sein), auch entferne ich den Hintergrund eines normalen Spinner, Es hat keinen Ripper, also verwende ich TextView und ImageView wie Google Kalender.ein
TextView
+ImageView
(für den Pfeil nach unten)
Wenn der Benutzer das Textview/Image klickt, es Ripple-Animationen hat, dann Spinner nennen. performClick
. Und ich möchte es als das normale Dropdown, also mache ich einen 0
-Brenner, da der gone
Spinner onItemSelected
nicht aufrufen wird.
für den versteckten Adapter, kann es dies mag:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
((TextView) view).setText("");
return view;
}
Das Layout klicken Zuhörer:
layout.setOnClickListener(() -> {
spinner.performClick();
});
Für Zuhörer Spinner Artikel:
spinner.setOnItemSelectedListener(() -> {
// this requires spinner's visiblity is not gone
});
Sie, was Sie Beiträge verfassen können versucht bis jetzt? Vielleicht kann dies helfen http://stackoverflow.com/questions/27860815/ripple-effect-on-spinner-dropdown-items-colored-background-appcompat-v7-v21 – bonnyz