我有一个带有多个标签的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;
}
});
使用这种方法,我可以向后和向前滚动,但在视觉上滚动条没有显示。我的意思是这个吧:
我错过了什么吗?滚动条是否必须由命令式自定义绘制定义?
谢谢!
------编辑(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;
}
});
答案 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;
}