我有一个TextView
包含在 a 中HorizontalScrollView
,并且我希望文本在不可滚动时居中,但是当文本足够大以使其HorizontalScrollView
容器可滚动时,我需要将 的重力更改TextView
为Gravity.LEFT
。如果我不这样做并保持重心居中,HorizontalScrollView
则会显示错误的文本,因为它会切断大部分文本,如果文本保持居中,最后会有空白空间。这是我当前处理此问题的代码:
//make horizontal scroll text center and work
final HorizontalScrollView toTextScrollView = (HorizontalScrollView)parentView.findViewById(R.id.horizScroll);
toTextScrollView.addOnLayoutChangeListener(new OnLayoutChangeListener(){
@Override
public void onLayoutChange(View v, int left, int top,
int right, int bottom, int oldLeft, int oldTop,
int oldRight, int oldBottom) {
//if scrollable, change toNumber layout_gravity to left, else keep it at center
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
if(canScroll(toTextScrollView))
params.gravity=Gravity.LEFT;
else
params.gravity=Gravity.CENTER;
Toast.makeText(getActivity(), "Can scroll: " + canScroll(toTextScrollView), Toast.LENGTH_LONG).show();
toNumber.setLayoutParams(params);
}
});
我的功能canScroll()
正常工作,因为它在 Toast 中正确更新,所以这不是问题。问题是我觉得TextView
一旦调用 setLayoutParams() 就需要“刷新”。这是因为当第一个数字添加到TextView
使其可滚动时,Toast 返回它现在是可滚动的,但 Gravity 保持居中,因此当向左滚动时,数字的第一部分被剪切,如下所示:
但是,每当添加下一个数字时,它都会正确更新,重力设置为 Gravity.LEFT,因此在滚动视图中没有任何文本被截断。如何正确更新 TextView 重力使其立即发生?我尝试在 setLayoutParams() 之后添加 toNumber.invalidate() 和 toTextScrollView.invalidate() ,但它仍然不会按时更新。
这是TextView
:
<HorizontalScrollView
android:id="@+id/horizScroll"
android:layout_height="match_parent"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_gravity="center"
>
<TextView
android:id="@+id/toField"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="35sp"
android:singleLine="true"
android:textColor="@color/lightblue"
android:layout_gravity="center"
android:scrollHorizontally="true"
android:focusable="true"
android:freezesText="true"/>
</HorizontalScrollView>