Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:在自定义视图中启用滚动条_Java_Android_Scrollbar - Fatal编程技术网

Java Android:在自定义视图中启用滚动条

Java Android:在自定义视图中启用滚动条,java,android,scrollbar,Java,Android,Scrollbar,我已经实现了一个扩展RelativeLayout的自定义布局。它显示在运行时创建的许多不同元素,并且可以使用scrollTo()和scrollBy()在两个维度上滚动。滚动工作,现在我想添加标准的Android滚动条 使用Scrollviews列表是不可能的,因为我需要在2维空间中滚动布局,所以我尝试按此处所述操作: 我已经用一些(伪造的)值实现了所有compute*方法,并启用了滚动条。但我还是不能让他们出现。你知道有什么问题吗 在各种邮件列表等中有很多这样的问题,但答案似乎都是“1.调用se

我已经实现了一个扩展RelativeLayout的自定义布局。它显示在运行时创建的许多不同元素,并且可以使用scrollTo()和scrollBy()在两个维度上滚动。滚动工作,现在我想添加标准的Android滚动条

使用Scrollviews列表是不可能的,因为我需要在2维空间中滚动布局,所以我尝试按此处所述操作:

我已经用一些(伪造的)值实现了所有compute*方法,并启用了滚动条。但我还是不能让他们出现。你知道有什么问题吗

在各种邮件列表等中有很多这样的问题,但答案似乎都是“1.调用setHorizontalScrollbarEnabled(true),2.实现所有compute*方法,3.调用awakeScrollbars()”。据我所知,我已经做了所有这些,甚至尝试使用initializeScrollbars(),但什么都没有发生,文档也没有提供任何帮助

public NodeLayout(Context context) {
    super(context);

    setVerticalScrollBarEnabled(true);
    setHorizontalScrollBarEnabled(true);

    TypedArray a = context.obtainStyledAttributes(R.styleable.View);
    initializeScrollbars(a);
    a.recycle();
}

@Override
protected int computeHorizontalScrollExtent() {
    return 5;
}

@Override
protected int computeHorizontalScrollOffset() {
    return 10;
}

@Override
protected int computeHorizontalScrollRange() {
    return 50;
}

@Override
protected int computeVerticalScrollExtent() {
    return getHeight() / 2;
}

@Override
protected int computeVerticalScrollOffset() {
    return getHeight() / 2;
}

@Override
protected int computeVerticalScrollRange() {
    return getHeight();
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    awakenScrollBars();
    invalidate();
    return true;
}
下面是我的attrs.xml文件的外观:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="View">
<attr name="android:background"/>
<attr name="android:clickable"/>
<attr name="android:contentDescription"/>
<attr name="android:drawingCacheQuality"/>
<attr name="android:duplicateParentState"/>
<attr name="android:fadeScrollbars"/>
<attr name="android:fadingEdge"/>
<attr name="android:fadingEdgeLength"/>
<attr name="android:fitsSystemWindows"/>
<attr name="android:focusable"/>
<attr name="android:focusableInTouchMode"/>
<attr name="android:hapticFeedbackEnabled"/>
<attr name="android:id"/>
<attr name="android:isScrollContainer"/>
<attr name="android:keepScreenOn"/>
<attr name="android:longClickable"/>
<attr name="android:minHeight"/>
<attr name="android:minWidth"/>
<attr name="android:nextFocusDown"/>
<attr name="android:nextFocusLeft"/>
<attr name="android:nextFocusRight"/>
<attr name="android:nextFocusUp"/>
<attr name="android:onClick"/>
<attr name="android:padding"/>
<attr name="android:paddingBottom"/>
<attr name="android:paddingLeft"/>
<attr name="android:paddingRight"/>
<attr name="android:paddingTop"/>
<attr name="android:saveEnabled"/>
<attr name="android:scrollX"/>
<attr name="android:scrollY"/>
<attr name="android:scrollbarAlwaysDrawHorizontalTrack"/>
<attr name="android:scrollbarAlwaysDrawVerticalTrack"/>
<attr name="android:scrollbarDefaultDelayBeforeFade"/>
<attr name="android:scrollbarFadeDuration"/>
<attr name="android:scrollbarSize"/>
<attr name="android:scrollbarStyle"/>
<attr name="android:scrollbarThumbHorizontal"/>
<attr name="android:scrollbarThumbVertical"/>
<attr name="android:scrollbarTrackHorizontal"/>
<attr name="android:scrollbarTrackVertical"/>
<attr name="android:scrollbars"/>
<attr name="android:soundEffectsEnabled"/>
<attr name="android:tag"/>
<attr name="android:visibility"/>
</declare-styleable>
</resources>


我正在为Android 3.0开发。

也遇到了同样的问题,最终解决了

“问题”是您正在扩展
RelativeLayout
,它是
ViewGroup
的一个子类。我发现,按照您在问题中所述,我可以获得一个自定义的
视图
来显示滚动条,但当我扩展
视图组
或其子类时,没有滚动条出现

我终于想起,默认情况下,
ViewGroup
s不会自己绘制。我在自定义
视图组中添加了一行
构造函数:
setWillNotDraw(false)

你知道吗,滚动条出现了


希望能有所帮助。

仅供参考,在Android 3.2/Google TV和Android 3.2.1/Tablet上,扩展ViewGroup时,解决方案的一部分不是可选的。问题似乎是,视图用于绘制滚动条的滚动条可绘制内容和大小都没有加载,除非设置了中所有相应的滚动条属性。在3.2上的布局期间,如果未能设置这些属性中的某些重要数量,则会导致空指针异常。我还怀疑GridView/ListView/AbsListView/AdapterView系列的类没有设置水平滚动条属性,如果您恰好在追求这个属性的话

一般步骤似乎是:

  • 使用a(如上所述)
  • 在构造函数的早期调用initScrollbars(如上所述)
  • 调用initScrollbars后调用setHorizontalScrollbarEnabled/setServerTicalScrollBarEnabled
  • 根据需要实现三个computeHorizontalScrollXXX和computeVerticalScrollXXX
  • 根据需要频繁调用awakeScrollbars(),以显示滚动条
  • 很可能,必须在构造函数中调用setWillNotDraw(false)。在视图中实现滚动条绘制;但事实上我自己也把这个方法称为
  • 考虑调用setScrollBarStyle来控制滚动条的位置。滚动的最有用的自定义视图最终会剪切到填充边距,如果滚动条位于填充矩形之外,则会破坏视图的滚动条图形,因为我们无法访问与android股票视图相同的视图隐藏方法

我想就是这样。所有这些在安卓6.0上运行的可能性。。。几乎没有-/

我也有同样的问题。到目前为止,我已经完成了您在问题中描述的所有操作,并获得了相同的结果(没有出现滚动条)。我也在>3.0上开发…发布问题后你有没有运气?没有,对不起。最后我放弃了滚动条。好吧,如果你还感兴趣的话,我终于明白了。我在下面补充了一个答案。我简直不敢相信我找不到其他人有同样的问题/解决方案…一定会有更多的人制作需要滚动条的自定义视图组。哇。。。setWillNotDraw(错误)。你是怎么发现的?现在(通过compute*methodes的实现),我可以看到滚动条,但它没有移动,现在我需要真正实现methodes(我只使用上面的硬编码值)。。。谢谢你,我希望我现在就能拿到