4

Вопрос по android – Не удается сделать полосу прокрутки счетчика всегда видимой (Android)

У меня такая проблема - я хочу, чтобы полоса прокрутки блесны всегда была видимой. Но для функции счетчика

setScrollbarFadingEnabled(false);

вызывает сбой с NullExceptionPointer во время рисования GUI.

XML-теги также не могут решить эту проблему - кажется, что счетчик просто игнорирует их.

Может быть, есть другие способы перемещения? Например, использование пользовательской полосы прокрутки? Если да, как я могу это сделать?

Спасибо за ваши ответы, Дмитрий.

Как меня уже просили, вот сообщение об ошибке LogCat для простого проекта с только блесной в нем:

AndroidRuntime(2252): FATAL EXCEPTION: main
AndroidRuntime(2252): java.lang.NullPointerException
AndroidRuntime(2252): at android.view.View.onDrawScrollBars(View.java:5836)
AndroidRuntime(2252): at android.view.View.draw(View.java:6799)
AndroidRuntime(2252): at android.view.ViewGroup.drawChild(ViewGroup.java:1640)
AndroidRuntime(2252): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
AndroidRuntime(2252): at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
AndroidRuntime(2252): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
AndroidRuntime(2252): at android.view.View.draw(View.java:6796)
AndroidRuntime(2252): at android.widget.FrameLayout.draw(FrameLayout.java:352)
AndroidRuntime(2252): at android.view.ViewGroup.drawChild(ViewGroup.java:1640)
AndroidRuntime(2252): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
AndroidRuntime(2252): at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
AndroidRuntime(2252): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
AndroidRuntime(2252): at android.view.View.draw(View.java:6796)
AndroidRuntime(2252): at android.widget.FrameLayout.draw(FrameLayout.java:352)
AndroidRuntime(2252): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2078)
AndroidRuntime(2252): at android.view.ViewRoot.draw(ViewRoot.java:1433)
AndroidRuntime(2252): at android.view.ViewRoot.performTraversals(ViewRoot.java:1175)
AndroidRuntime(2252): at android.view.ViewRoot.handleMessage(ViewRoot.java:1753)
AndroidRuntime(2252): at android.os.Handler.dispatchMessage(Handler.java:99)
AndroidRuntime(2252): at android.os.Looper.loop(Looper.java:123)
AndroidRuntime(2252): at android.app.ActivityThread.main(ActivityThread.java:4632)
AndroidRuntime(2252): at java.lang.reflect.Method.invokeNative(Native Method)
AndroidRuntime(2252): at java.lang.reflect.Method.invoke(Method.java:521)
AndroidRuntime(2252): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)
AndroidRuntime(2252): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
AndroidRuntime(2252): at dalvik.system.NativeStart.main(Native Method)
  • Error: User Rate Limit Exceededstackoverflow.com/a/19820350/597657

    от
  • Error: User Rate Limit Exceeded

    от Dmitry
  • @nandeesh Я точно знаю, что это происходит после API 15. Не уверен насчет второстепенных уровней.

    от Renato Lochetti
  • это происходит на всех уровнях API?

    от nandeesh
  • Можем ли мы увидеть LogCat? Спасибо.

    от pablisco
  • 1

    Поблагодарить@nandeesh 

    за его / ее ответ, а также@Eng.Fouad заего / ее ответ на другой странице.

    public class VisibleScrollbarSpinner extends Spinner {
        @Override public boolean performClick() {
            final boolean superResult = super.performClick();
    
            try {
                final Field mPopupField = Spinner.class.getDeclaredField("mPopup");
                mPopupField.setAccessible(true);
                //noinspection ConstantConditions
                ((ListPopupWindow) mPopupField.get(this)).getListView().setScrollbarFadingEnabled(false);
                mPopupField.setAccessible(false);
            } catch (NoSuchFieldException | IllegalAccessException e) {
                Log.e(TAG, e.toString(), e);
            }
    
            return superResult;
        }
    
        public VisibleScrollbarSpinner(Context context) { super(context); } 
        public VisibleScrollbarSpinner(Context context, int mode) { super(context, mode); } 
        public VisibleScrollbarSpinner(Context context, AttributeSet attrs) { super(context, attrs); } 
        public VisibleScrollbarSpinner(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } 
        public VisibleScrollbarSpinner(Context context, AttributeSet attrs, int defStyleAttr, int mode) { super(context, attrs, defStyleAttr, mode); }
    }
    

  • 0

    После первоначального расследования я думаю, что невозможно позвонить

    setScrollbarFadingEnabled(false); в спиннер.

    Я прочитал реализацию классаSpinner.java а такжеView.java (этот последний реализуетsetScrollbarFadingEnabled(boolean) API16 и проблема заключается в строке:

    cache.scrollBar.setAlpha(255);
    

    Наверноеcache.scrollBar в данный момент имеет значение null, и я не нашел способа принудительно инициализировать этот атрибут.

    Большинство методов, которые управляют этим атрибутом, являются защищенными или частными, поэтому мы не можем просто вызывать их.

    Я продолжу исследовать эту проблему, чтобы найти возможное решение, но пока, и, учитывая, что никто еще не ответил на этот вопрос, я думаю, что это невозможно.

  • 7

    У Spinner нет полосы прокрутки

    поэтому вы получаете исключение NullPointerException.

    У всплывающего окна, отображаемого spinner, есть полоса прокрутки. Таким образом, вам нужно изменить свойства ListView, показанного spinner. Но сам по себе ListView не предоставляется Spinner никакими открытыми методами.

    Даже если вы получаете ListPopupWindow по отражению, возникает еще одна проблема - ListView ListPopupWindow создается только после нажатия на Spinner.

    Но OnClickListener Spinner не может быть зарегистрирован, чтобы установить свойства ListView после шоу.

    Вы можете создать пользовательский Spinner с перенаправленным executeClick, а затем получить mPopup по отражению. и использоватьmPopup.getListView().setScrollbarFadingEnabled(false)

    Но если вы собираетесь создать собственный Spinner, я считаю, что проще реализовать весь всплывающий экран в соответствии с вашими потребностями, чем с помощью рефлексии.