Wie kann ich die Schriftfarbe des ausgewählten Elements in einem Spinner ändern?
Ich kann die Hintergrundfarbe des ausgewählten Elements, die Farbe des Dropdown-Elements usw. ändern, nicht jedoch die Textfarbe des ausgewählten Elements. Wie kann ich das tun?
mein Code lautet: Dies ist ein Spinner, den ich benutze--:
<Spinner
Android:id="@+id/spinner1"
Android:layout_width="wrap_content"
Android:layout_height="32dip"
Android:background="@drawable/mybg"
Android:divider="@drawable/list_divider"
Android:drawSelectorOnTop="true"
Android:popupBackground="#D3D5D3"
Android:Prompt="@string/activityy_Prompt"
/>
das ist mybg.xml
<!-- <item Android:drawable="@drawable/blue" Android:state_pressed="false"/> -->
<!-- <item Android:drawable="@drawable/back11"/> -->
<item Android:drawable="@drawable/greenyellow1" Android:state_focused="true" Android:state_pressed="false"/>
<item Android:drawable="@drawable/greenyellow1" Android:state_focused="true" Android:state_pressed="true"/>
<item Android:drawable="@drawable/greenyellow1" Android:state_focused="false" Android:state_pressed="true"/>
<item Android:drawable="@drawable/greenyellow1" Android:state_selected="true"/>
<item Android:drawable="@drawable/back11"/>
mit diesen kann ich die Textfarbe des ausgewählten Elements nicht ändern ...
zeichnend/mybg:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_activated="true">
<color Android:color="@color/black" />
</item>
</layer-list>
Dadurch wird die Farbe des ausgewählten Elements im Popup geändert.
Definiere OnItemSelectedListener
so:
private AdapterView.OnItemSelectedListener listener = new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
((TextView) parent.getChildAt(0)).setTextColor(0x00000000);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
};
und dann OnItemSelectedListener
wie folgt auf spinner
setzen:
spinner.setOnItemSelectedListener(listener);
versuchen Sie, onItemSelected in Ihrem OnItemSelectedListener zu implementieren, um die Textfarbe des ausgewählten Spinner-Elements zu ändern
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
int index = adapterView.getSelectedItemPosition();
((TextView) spinner.getSelectedView()).setTextColor(getResources().getColor(R.color.Blue)); //<----
verwenden des Selektors als Textfarbe.
erstellen Sie color_selector.xml in drawable like
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_pressed="true"
Android:color="#000000" /> <!-- pressed -->
<item Android:state_focused="true"
Android:color="#000000" /> <!-- focused -->
<item Android:color="#FFFFFF" /> <!-- default -->
</selector>
und in der Textansicht
<TextView
Android:textColor="@drawable/color_selector"/>
Sie können die ausgewählte Textfarbe ändern, indem Sie OnItemSelectedListener
zur spinner
hinzufügen.
qtySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
((TextView) view).setTextColor(Color.BLACK); //Change selected text color
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
verwenden Sie einfach diese Zeile onItemSelected Listner -
public void onItemSelected(AdapterView<?> parent, View arg1, int arg2,long arg3)
{
item = (String) parent.getItemAtPosition(arg2);
((TextView) parent.getChildAt(0)).setTextColor(0x00000000);
}
Ich weiß, dass dies eine alte Frage ist, aber ich hatte große Probleme beim Ändern der Farbe des ausgewählten Elements in TabLayout und dies hat wirklich für mich funktioniert:
spinner.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
((TextView) spinner.getSelectedView()).setTextColor(Color.WHITE); //change to your color
}
});
Das Setzen von ((TextView) view).setTextColor(getResources().getColor(R.color.black));
in der onItemSelected(...)
listener-Methode wird funktionieren.
Sie benötigen keinen Java-Code für die Hintergrundfarbänderung in Android 2.3v. Fügen Sie einfach Android:background="#F0F8FF"
zu Ihrem Spinner in der XML-Datei hinzu.
Wenn Ihr Spinner einen ArrayAdapter verwendet, können Sie einfach ein benutzerdefiniertes Layout für Ihre Spinnerelemente übergeben. Dieses Layout kann eine einfache Textansicht sein, jedoch mit dem Attribut Android: textColor.
MainActivity.Java onCreate ()
adapter = new ArrayAdapter<>(this, R.layout.spinner_custom_textcolor, data);
spinner.setAdapter(adapter);
spinner_custom_textcolor.xml
<TextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@Android:id/text1"
style="?android:attr/spinnerItemStyle"
Android:textColor="@color/YOUR_COLOR_HERE"
Android:singleLine="true"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:ellipsize="Marquee"
Android:textAlignment="inherit"/>
* Alles aus dem obigen Layout außer für Android: textColor ist eine direkte Kopie von Android.R.layout.simple_spinner_item
mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {
((TextView) adapterView.getChildAt(0)).setTextColor(Color.WHITE);
}
Die Lösung, die für mich funktionierte, bestand darin, eine CheckedTextView
für die Dropdown-Ressourcensicht zu verwenden und dann die Farbe des markierten Elements mithilfe einer Farbauswahl zu ändern.
spinner_dropdown_item.xml
im layout
-Ordner:
<?xml version="1.0" encoding="utf-8"?>
<!-- A `CheckedTextView` allows the color of the text to be changed when it is selected (checked). -->
<CheckedTextView
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/spinner_item_textview"
Android:layout_height="wrap_content"
Android:layout_width="match_parent"
Android:maxLines="1"
Android:ellipsize="end"
Android:paddingStart="20dp"
Android:paddingEnd="20dp"
Android:paddingTop="8dp"
Android:paddingBottom="8dp"
Android:textSize="18sp"
Android:textColor="@color/spinner_color_selector"
Android:background="@color/spinner_background" />
spinner_color_selector
im color
-Ordner:
<?xml version="1.0" encoding="utf-8"?>
<!-- Highlight the selected (checked) item when the spinner is open. -->
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<item Android:state_checked="true" Android:color="@color/white" />
<item Android:color="@color/blue_100" />
</selector>
spinner_dropdown_item.xml
muss als DropDownResourceView
für die Adapter
eingestellt sein. In meinem Fall verwende ich eine ResourceArrayAdapter
, die Informationen aus mehreren Quellen bezieht.
// Setup a `MatrixCursor` for the static entries.
String[] matrixCursorColumnNames = {DatabaseHelper._ID, DatabaseHelper.NAME};
MatrixCursor matrixCursor = new MatrixCursor(matrixCursorColumnNames);
matrixCursor.addRow(new Object[]{-2, getString(R.string.first_spinner_item)});
matrixCursor.addRow(new Object[]{-1, getString(R.string.second_spinner_item)});
// Get a `Cursor` with the list of additional items from the database.
Cursor cursor = DatabaseHelper.getCursor();
// Combine `matrixCursor` and `cursor`.
MergeCursor mergeCursor = new MergeCursor(new Cursor[]{matrixCursor, foldersCursor});
// Create a `ResourceCursorAdapter` for the spinner with `this` context. `0` specifies no flags.;
ResourceCursorAdapter resourceCursorAdapter = new ResourceCursorAdapter(this, R.layout.spinner_item, mergeCursor, 0) {
@Override
public void bindView(View view, Context context, Cursor cursor) {
// Get a handle for the spinner item `TextView`.
TextView spinnerItemTextView = (TextView) view.findViewById(R.id.spinner_item_textview);
// Set the `TextView` to display the name.
spinnerItemTextView.setText(cursor.getString(cursor.getColumnIndex(DatabaseHelper.NAME)));
}
};
// Set the `ResourceCursorAdapter` drop drown view resource.
resourceCursorAdapter.setDropDownViewResource(R.layout.spinner_dropdown_item);
// Get a handle for the `Spinner`.
Spinner spinner = (Spinner) findViewById(R.id.spinner);
// Set the adapter for the folder `Spinner`.
spinner.setAdapter(resourceCursorAdapter);
Da ResourceCursorAdapter
die gleiche bindView
verwendet, um den Spinner zu füllen, wenn er geöffnet und geschlossen ist, muss die ID der TextView
in spinner_dropdown_item.xml
und spinner_item.xml
identisch sein.
spinner_item.xml
im layout
-Ordner:
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/spinner_item_textview"
Android:layout_height="wrap_content"
Android:layout_width="match_parent"
Android:maxLines="1"
Android:ellipsize="end"
Android:paddingStart="10dp"
Android:paddingEnd="10dp"
Android:textSize="18sp"
Android:textColor="@color/primaryTextColor" />
einige von Ihnen verwenden MaterialBetterSpinner und binden Ihre Layouts All das oben genannte hilft nicht, probiere es aus, hoffe es hilft dir:
public class MyAdapter extends ArrayAdapter<String> {
public MyAdapter(Context context, int textViewResourceId, List<String> objects) {
super(context, textViewResourceId, objects);
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
return getCustomView(position, convertView, parent);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return getCustomView(position, convertView, parent);
}
public View getCustomView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final YourXMLBinding rowBinding = DataBindingUtil.inflate(inflater, R.layout.yourXML, parent,false);
rowBinding.tv1.setText(mMy.getValues().get(position));
if(position == mMy.getCurrentIndex()) {
rowBinding.tv1.setTypeface(Typer.set(getContext()).getFont(Font.ROBOTO_BOLD));//change font
rowBinding.tv1.setTextColor(ContextCompat.getColor(getContext(), R.color.yourColor));//change color
}
return rowBinding.getRoot();
}
}
yourXML ist ungefähr so:
<?xml version="1.0" encoding="utf-8"?>
<layout>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:orientation="horizontal"
Android:background="@color/colorBackgroundStart">
<TextView
Android:id="@+id/tv1"
Android:layout_width="0dp"
Android:layout_weight="0.7"
Android:layout_height="30dp"
Android:textColor="#fff"
Android:textSize="16dp"
Android:layout_marginTop="8dp"
Android:layout_marginBottom="10dp"
Android:layout_marginLeft="8dp"/>
</layout>
erstellen Sie einen Spinner mit diesem Adapter und Ihrem XML:
final MyAdapter adapter = new MyAdapter(getContext(), R.layout.yourXML, s.getValues());
final MaterialBetterSpinner spinner = new MaterialBetterSpinner(getContext());
spinner.setAdapter(adapter);
Siehe meine Antwort auf eine ähnliche Frage hier . Meine Antwort ist der von Priya ähnlich, mit der Ausnahme, dass die Textfarbe des ausgewählten Elements korrekt festgelegt wird. Es gibt also keine Verzögerung mit der falschen Farbe, wenn gewartet wird, dass der Spinner automatisch das Standardelement auswählt. Dies geschieht, nachdem die Benutzeroberfläche bereits aktiviert ist. Bildschirm).