有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java微调器的滚动条样式

我试图更改微调器中滚动条的样式和位置,但它不起作用

主要活动。java:

package com.example.testapp;

import 安卓.app.Activity;
import 安卓.os.Bundle;

public class MainActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

主要活动。xml:

<RelativeLayout xmlns:安卓="http://schemas.安卓.com/apk/res/安卓"
    xmlns:tools="http://schemas.安卓.com/tools"
    安卓:layout_width="match_parent"
    安卓:layout_height="match_parent">

    <Spinner
        安卓:entries="@array/items"
        安卓:verticalScrollbarPosition="left"
        安卓:scrollbarThumbVertical="@drawable/scrollbar_style"
        安卓:layout_width="wrap_content"
        安卓:layout_height="wrap_content"
        安卓:layout_centerHorizontal="true"
        安卓:layout_centerVertical="true" />

</RelativeLayout>

可绘制/滚动条样式。xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:安卓="http://schemas.安卓.com/apk/res/安卓" >

    <solid 安卓:color="#FF196C96" />
    <corners 安卓:radius="5dp" />
    <size 安卓:width="2dp" />

</shape>

值/字符串。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:安卓="http://schemas.安卓.com/apk/res/安卓"
    package="com.example.testapp"
    安卓:versionCode="1"
    安卓:versionName="1.0" >

    <uses-sdk
        安卓:minSdkVersion="8"
        安卓:targetSdkVersion="19" />

    <application
        安卓:allowBackup="true"
        安卓:icon="@drawable/ic_launcher"
        安卓:label="@string/app_name"
        安卓:theme="@style/AppTheme" >
        <activity
            安卓:name="com.example.testapp.MainActivity"
            安卓:label="@string/app_name" >
            <intent-filter>
                <action 安卓:name="安卓.intent.action.MAIN" />
                <category 安卓:name="安卓.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

屏幕截图:

enter image description here

请注意,如果我将安卓:verticalScrollbarPosition="left"安卓:scrollbarThumbVertical="@drawable/scrollbar_style"ListView一起使用,它们的效果很好:

enter image description here

是虫子吗?或者有没有其他方法可以在Spinner中操纵滚动条样式和位置


共 (5) 个答案

  1. # 1 楼答案

    经过数小时的工作,我找到了正确的解决方案(感谢Khaled为我指引了正确的方向)。您需要一个自定义微调器:

    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;
        }
    }
    

    请注意,我使用了HoloEveryWhere库,但相同的解决方案适用于android.widget.Spinner

  2. # 2 楼答案

    我需要在下拉列表中的滚动条的末尾添加边距,并更改其颜色、宽度和半径。这就是我的工作原理:

    在drawable文件夹下创建XML:下拉菜单\u滚动条。xml

    <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:right="8dp" android:bottom="8dp" android:top="8dp"> <!-- Margins -->
            <shape>
                <solid android:color="#594165" /> <!-- Scrollbar Color -->
                <corners android:radius="41dp" /> <!-- Scrollbar Radius -->
                <size android:width="4dp"/> <!-- Scrollbar Width -->
            </shape>
        </item>
    </layer-list>
    

    样式中创建样式。xml

    <style name="customScrollbar">
         <item name="android:scrollbarThumbVertical">@drawable/dropdown_scrollbar</item>
    </style>
    

    在布局文件的ur微调器中添加主题属性:

    android:theme="@style/csScrollbar"
    

    我通过扩展微调器类使用了自定义微调器类。尚未使用默认微调器类尝试上述解决方案

  3. # 3 楼答案

    在你的应用程序主题或活动中:

      <item name="android:dropDownListViewStyle">@style/SpinnerStyle1</item>
    

    声明喷丝头样式1:

    <style name="SpinnerStyle1" parent="Widget.AppCompat.ListView.DropDown">
            <item name="android:divider">@color/blackText</item>
            <item name="android:dividerHeight">1px</item>
            <item name="android:scrollbars">none</item>
    </style>
    
  4. # 4 楼答案

    Android中的微调器没有滚动条,滚动条存在于微调器中维护的listView中,并且没有公共访问权限

    在下面的链接中有一种运行时方法可以覆盖它

    资源:https://stackoverflow.com/a/12644532/2128327

  5. # 5 楼答案

    您可以在样式中创建以下样式。xml

    <style name="SpinnerScrollBar" parent="Widget.AppCompat.ListView.DropDown">
        <item name="android:scrollbarThumbVertical">@color/scrollbar_color</item>
    </style>
    

    然后将其设置为微调器主题

    <Spinner
        ...
        android:theme="@style/SpinnerScrollBar"/>
    

    如果你想有一些渐变色,你也可以使用可绘制的颜色来代替颜色