Scrollbar style

I tried to change the style and position of the scroll bar, which is inside the counter, but this will not work.

MainActivity.java:

package com.example.testapp; import android.app.Activity; import android.os.Bundle; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } 

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"> <Spinner android:entries="@array/items" android:verticalScrollbarPosition="left" android:scrollbarThumbVertical="@drawable/scrollbar_style" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" /> </RelativeLayout> 

hoods / scrollbar _style.xml:

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <solid android:color="#FF196C96" /> <corners android:radius="5dp" /> <size android:width="2dp" /> </shape> 

values ​​/strings.xml:

 <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">TestApp</string> <string name="action_settings">Settings</string> <string-array name="items"> <item>Item 1</item> <item>Item 2</item> <item>Item 3</item> <item>Item 4</item> <item>Item 5</item> <item>Item 6</item> <item>Item 7</item> <item>Item 8</item> <item>Item 9</item> <item>Item 10</item> </string-array> </resources> 

AndroidManifest.xml:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.testapp" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="19" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.testapp.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> 

Screenshot:

enter image description here

Please note that android:verticalScrollbarPosition="left" and android:scrollbarThumbVertical="@drawable/scrollbar_style" work fine if I use them with ListView :

enter image description here

This is mistake? or is there any other way to manipulate the style and scrollbar within Spinner ?

+6
source share
2 answers

Spinners in Android does not have a scrollbar, a scrollbar exists in the View list maintained inside Spinner, and does not have public access.

There is a way to reinstall in the link below ..

Resource: fooobar.com/questions/957503 / ...

+3
source

After several hours of work, I got the right solution (thanks to Khaled for pointing me in the right direction). You need your own counter:

 import java.lang.reflect.Field; import java.lang.reflect.Method; import org.holoeverywhere.widget.ListPopupWindow; import org.holoeverywhere.widget.ListView; import org.holoeverywhere.widget.Spinner; import android.content.Context; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.View; public class CustomSpinner extends Spinner { public CustomSpinner(Context context) { super(context); } public CustomSpinner(Context context, AttributeSet attrs) { super(context, attrs); } public CustomSpinner(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public CustomSpinner(Context context, AttributeSet attrs, int defStyle, int mode) { super(context, attrs, defStyle, mode); } public CustomSpinner(Context context, int mode) { super(context, mode); } @Override public boolean performClick() { boolean bClicked = super.performClick(); try { Field mPopupField = Spinner.class.getDeclaredField("mPopup"); mPopupField.setAccessible(true); ListPopupWindow pop = (ListPopupWindow) mPopupField.get(this); ListView listview = pop.getListView(); Field mScrollCacheField = View.class.getDeclaredField("mScrollCache"); mScrollCacheField.setAccessible(true); Object mScrollCache = mScrollCacheField.get(listview); Field scrollBarField = mScrollCache.getClass().getDeclaredField("scrollBar"); scrollBarField.setAccessible(true); Object scrollBar = scrollBarField.get(mScrollCache); Method method = scrollBar.getClass().getDeclaredMethod("setVerticalThumbDrawable", Drawable.class); method.setAccessible(true); method.invoke(scrollBar, getResources().getDrawable(R.drawable.scrollbar_style)); if(VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB) { Field mVerticalScrollbarPositionField = View.class.getDeclaredField("mVerticalScrollbarPosition"); mVerticalScrollbarPositionField.setAccessible(true); mVerticalScrollbarPositionField.set(listview, SCROLLBAR_POSITION_LEFT); } } catch(Exception e) { e.printStackTrace(); } return bClicked; } } 

Note that I used the HoloEveryWhere library, but the same solution will work with android.widget.Spinner .

+8
source

Source: https://habr.com/ru/post/957502/


All Articles