TextView可以滚动但不显示滚动条

时间:2013-12-30 17:25:51

标签: android textview scroll scrollbar

我有一个带有多个标签的TabHost,其内容定义为FrameLayout,其中包含TextView,其中每个标签都包含大量文字,超出了在屏幕布局中显示,因此我必须为每个选项卡启用垂直滚动。

主要的是这些选项卡是动态创建的(以编程方式),因此我必须以这种方式指定所有选项:

final SoftReference<TabHost> th = new SoftReference<TabHost>((TabHost) ((Activity) globvars.getContext()).findViewById(android.R.id.tabhost));

final TabSpec setContent = th.get().newTabSpec(tag).setIndicator(tabview).setContent(new TabContentFactory() {
  public View createTabContent(String tag) {
    view.setBackground(globvars.getContext().getResources().getDrawable(R.drawable.rounded_edges));
    view.setPadding(25, 25, 25, 25);
    view.setTextColor(Color.WHITE);
    view.setLines(50);
    view.setMaxLines(maxLines);
    view.setEllipsize(TextUtils.TruncateAt.START);
    view.setHorizontalScrollBarEnabled(false);
    view.setVerticalScrollBarEnabled(true);
    view.setMovementMethod(new ScrollingMovementMethod());
    view.setScrollBarStyle(View.SCROLLBARS_INSIDE_INSET);
    view.setVerticalFadingEdgeEnabled(true);
    view.setGravity(Gravity.BOTTOM);
    view.setOverScrollMode(1);
    view.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 11);
    view.setTypeface(Typeface.MONOSPACE);
    return view;
  }
});

使用这种方法,我可以向后和向前滚动,但在视觉上滚动条没有显示。我的意思是这个吧:

Virtual Scroll Bar

我错过了什么吗?滚动条是否必须由命令式自定义绘制定义?

谢谢!

------编辑(12-31-2013)------

我一直在四处寻找,仍然找不到任何解决方案。我尝试了尽可能多的参数组合,但没有结果。特别是,我尝试this并将FrameLayout包裹在ScrollView中,但不是在TextView本身显示滚动条,而是整个TextView被包裹在一个滚动条中,当缓冲区越来越大时增长,这不是我想要的。

任何帮助表示赞赏!

------编辑(01-17-2014)------

那么,在这一点上,我可以保证我已经尝试过任何合乎逻辑的步骤(好吧,至少对我而言)来完成这项工作但仍然不能!我澄清说我有大约7-8个额外的活动,我在滚动其中任何一个都没有问题。不过,我只是在TabHost中使用<LinearLayout xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/fondo_imagen" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <LinearLayout android:id="@+id/TabContainer" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="99" android:orientation="vertical"> <TabHost android:id="@+android:id/tabhost" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:id="@+id/TabLinearLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!-- Horizontal scrolling for the tab widget --> <HorizontalScrollView android:layout_width="fill_parent" android:layout_height="wrap_content" android:fillViewport="true" android:scrollbars="none"> <TabWidget android:id="@+android:id/tabs" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </HorizontalScrollView> <FrameLayout android:id="@+android:id/tabcontent" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="10dp" /> </LinearLayout> </TabHost> </LinearLayout> <!-- Some additional LinearLayouts that don't have anything to do with the tab widget --> ... </LinearLayout> 。所以我开始对此表示赏心悦目,因为这已经危及我的心理健康。

我在下面发布我的布局:

corsair992

------编辑(01-19-2014)------

好的,根据TextView的回答,我终于可以开始工作了。我真正的错误是假设即使是创建选项卡的方法(上面发布)也会收到View作为参数,在TabSpec定义中使用TextView会将其转换为{ {1}}。确实,我不知道我实际上是在View上设置滚动条(不知道View类没有提供公共编程方法来配置滚动条),所以我跟着corsair992的建议,并使用此内容创建了一个单独的布局:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/tabsContent"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="3dp"
    android:background="@drawable/rounded_edges"
    android:gravity="bottom"
    android:padding="8dp"
    android:scrollHorizontally="false"
    android:scrollbarStyle="insideOverlay"
    android:scrollbars="vertical"
    android:textColor="#FFFFFF"
    android:textSize="11sp"
    android:typeface="monospace"
    tools:ignore="SmallSp" />

现在,我只是View这个布局而不是调用将所有这些属性设置为inflate的上述方法,而是设置MovementMethod

final TabSpec setContent = th.get().newTabSpec(tag).setIndicator(tabview).setContent(new TabContentFactory() {
  public View createTabContent(String tag) {
    // tabs_content is the layout above
    final View ll_view = LayoutInflater.from(globvars.getContext()).inflate(R.layout.tabs_content, null);
    final TextView view = (TextView) ll_view.findViewById(R.id.tabsContent);

    view.setMovementMethod(new ScrollingMovementMethod());

    return ll_view;
  }
});

1 个答案:

答案 0 :(得分:2)

如果未在XML布局资源中专门启用滚动条,则基类View类似乎不提供初始化滚动条的公共方法。但是,没有理由不能在XML资源中定义选项卡内容,通过将android:scrollbars属性设置为vertical来启用垂直滚动条,并动态地从TabContentFactory扩展它

在你的情况下是这样的:

public View createTabContent(String tag) {
    Activity activity = (Activity) globvars.getContext();
    TextView view = (TextView) LayoutInflater.from(activity).inflate(R.layout.mytabcontent,
            (ViewGroup) activity.findViewById(android.R.id.tabcontent), false);
    view.setMovementMethod(new ScrollingMovementMethod());
    view.setText("My Text");
    return view;
}