Spinner does not wrap text -- is this an Android bug?
In holo theme spinner by default uses dropdown mode. And all moves with overriding default styles just move to switching spinner mode to dialog mode which succesfully wraps multiline text as in api 11. Instead you can create spinner with new Spinner(context, Spinner.MODE_DIALOG)
or in xml: android:spinnerMode="dialog"
. But it's not resolve the problem, because it's dialog, not dropdown.
I have found another solution for this trouble: Override getDropDownView
method in ArrayAdapter
and put setSingleLine(false)
in post method of view. So when view completely created it wraps the text to appropriate lines.
@Override
public View getDropDownView(final int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = new TextView(_context);
}
TextView item = (TextView) convertView;
item.setText("as ddd");
final TextView finalItem = item;
item.post(new Runnable() {
@Override
public void run() {
finalItem.setSingleLine(false);
}
});
return item;
}
UPDATE:
And here is another answer.
Manually wrap listview in PopupWindow and show it under TextView on click and hide it on listItem click.
Simple implementation just to show idea:
public class MySpinner extends TextView {
private PopupWindow _p;
private ListView _lv;
public MySpinner(Context context) {
super(context);
init();
}
public MySpinner(Context context, AttributeSet attributeSet){
super(context, attributeSet);
init();
}
private void init(){
setBackgroundResource(R.drawable.spinner_background);
final List<String> list = new ArrayList<String>();
list.add("Very long text AAAAAAAAAAAAAAAA");
list.add("1 Very long text AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
list.add("2 Very long text A");
list.add("3 Very long text AAAAAAAAA");
setMinimumWidth(100);
setMaxWidth(200);
_lv = new ListView(getContext());
_lv.setAdapter(new ArrayAdapter<String>(getContext(), R.layout.simple_list_item_1, list));
_lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
_p.dismiss();
setText(list.get(i));
}
});
setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
_p = new PopupWindow(getContext());
_p.setContentView(_lv);
_p.setWidth(getWidth());
_p.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
_p.setTouchable(true);
_p.setFocusable(true);
_p.setOutsideTouchable(true);
_p.showAsDropDown(view);
}
});
}
}
Wrapping text in spinner android
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
style="?android:attr/spinnerItemStyle"
android:singleLine="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:textColor="#ffffff"/>
Use this textview in your spinner adapter in place of the android default textview you are using in .setAdapter method of the Spinner. see below R.layout.spinner_textview textview is this textview i have posted above.
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getApplicationContext(),
R.array.Array,
R.layout.spinner_textview);
adapter.setDropDownViewResource (android.R.layout.simple_spinner_dropdown_item);
Spinner with long text not working fine
For my problem I found this solution :
Spinner language = (Spinner) findViewById(com.Orange.R.id.current_language_text);
ArrayAdapter adapter = new ArrayAdapter(this,
com.Orange.R.layout.my_spinner_textview, languages);
adapter.setDropDownViewResource(com.Orange.R.layout.multiline_spinner_dropdown_item);
language.setAdapter(adapter);
where languages is a String[]
and my_spinner_textview.xml
is :
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/textview_spinner"
style="?android:attr/spinnerItemStyle"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="@drawable/textorange_selected"
android:paddingLeft="5dp"
android:singleLine="true"
android:ellipsize="end"
/>
Spinner Text do not wrap
You can create a layout with root element a TextView
and use android:singleLine="false"
. Then use this layout instead of android.R.layout.simple_spinner_item_1
.
How to fix text length in Android Spinner
Instead of using wrap content for the width , specify the width (say 120dp or..)based on your requirement.
Related Topics
How to Do Circular Scrolling on Viewpager
Android Activity Has Leaked Window Com.Android.Internal.Policy.Impl.Phonewindow$Decorview Issue
Android Screen Lock/ Unlock Programmatically
How to Execute Something Just Once Per Application Start
Com.Google.Android.Gsf Package Couldn't Be Found
How to Remove a Contact Programmatically in Android
Cannot Start Activity Background in Android 10 [ Android Q ]
Message "Error: Resource Android:Attr/Lstar Not Found"
Convert Time Value to Format "Hh:Mm Am/Pm" Using Android
Immersive Mode Navigation Becomes Sticky After Volume Press or Minimise-Restore
Libz.So.1: Cannot Open Shared Object File
How to Get Each Device's Ip Address in Wi-Fi Direct Scenario
How to Get Free and Total Size of Each Storagevolume
How to Show Progress Dialog in Android