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

4

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

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)
это происходит на всех уровнях API? nandeesh
@nandeesh Я точно знаю, что это происходит после API 15. Не уверен насчет второстепенных уровней. Renato Lochetti
Можем ли мы увидеть LogCat? Спасибо. pablisco

Ваш Ответ

3   ответа
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); }
}
7

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

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

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

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

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

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

Error: User Rate Limit Exceeded Dmitry
Error: User Rate Limit Exceededstackoverflow.com/a/19820350/597657
0

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

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

cache.scrollBar.setAlpha(255);

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

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

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

Похожие вопросы