[英]Android: TextView.setLayoutParams sometimes work, sometimes doesn't
我有一个Android应用程序,让用户修改一些布局参数。 我的功能之一是让用户决定TextView是与图片的顶部还是底部对齐。
这是功能:
private void setAlign(String align) {
/* Get Preferences */
SharedPreferences prefs = getSharedPreferences("prefs", Context.MODE_WORLD_READABLE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString("align", align);
editor.commit();
Log.d("ALIGN", align);
paramAlign = align;
FrameLayout.LayoutParams floLP = new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.WRAP_CONTENT,
FrameLayout.LayoutParams.WRAP_CONTENT,
(align == "TOP") ? Gravity.TOP : Gravity.BOTTOM);
txtGoal.setLayoutParams(floLP);
int res = paramAlign == "TOP" ? R.drawable.btn_toolbar_align_top_up : R.drawable.btn_toolbar_align_bottom_up ;
btnAlign.setImageResource(res);
}
现在,一旦开始活动,此功能就可以正常工作。 但是,当我初始化活动时,我在获取对齐方式首选项后在onGlobalLayout方法中调用setAlign()函数。
这是相关代码:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.personalize);
/* Get Preferences */
SharedPreferences prefs = getSharedPreferences("prefs", Context.MODE_WORLD_READABLE);
paramAlign = prefs.getString("align", "BOTTOM");
Log.d("ALIGN", paramAlign);
// Get screen dimensions and initialize preview
ViewTreeObserver vto = rootView.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
setAlign(paramAlign);
ViewTreeObserver obs = rootView.getViewTreeObserver();
obs.removeGlobalOnLayoutListener(this);
}
});
}
现在,如果您注意到日志记录功能,则在我开始活动时它们都将返回“ TOP”。 并且setAlign()函数显然被调用。 但是,TextView在底部对齐。 这是TextView的XML:
<TextView
android:id="@+id/txtGoal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dip"
android:textColor="@color/color_white"
android:textSize="8sp"
android:shadowColor="@color/color_black"
android:shadowDx="1.2"
android:shadowDy="1.2"
android:shadowRadius="1.2"
/>
知道为什么创建活动时未发生setLayoutParams吗? 绘制完布局后,该函数将被触发,因此这里不应该成为问题。 而且XML没有指定开始的重力。
我在这里想念什么?
首先,我看到变量txtGoal没有初始化(甚至没有声明),所以我假设您在其他地方做了(这没有在问题中发布)。
您遇到的行为几乎是正常的:该功能仅在启动时才起作用,这是因为一旦更改了文本视图的布局,您必须通过添加以下内容来表示将其重绘:
txtGoal.invalidate ();
在这之后 :
txtGoal.setLayoutParams(floLP);
编辑:
您还可以尝试以其他方式更改重力:
txtGoal.setGravity ( Gravity.TOP );
编辑:
我的道歉,我的建议(第二个解决方案)是错误的,因为它改变了文本视图内文本的重力(而不是根视图内文本视图的重力)。
请尝试以下操作:
请勿尝试使用侦听器修改文本视图的重力,而是可以在设置活动的内容视图后直接应用所需的重力(因为这样便创建了文本视图)。 我建议以下几点:
检索共享的首选项后,将新布局直接应用于文本视图(而不是通过侦听器)。
您的onCreate方法应类似于以下内容:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.personalize);
/* Get Preferences */
SharedPreferences prefs = getSharedPreferences("prefs", Context.MODE_WORLD_READABLE);
paramAlign = prefs.getString("align", "BOTTOM");
setAlign(paramAlign);
}
您应该使用equals方法比较两个字符串:
替换为:
(align == "TOP")
通过那个
align.equals ( "TOP" )
和这个 :
paramAlign == "TOP"
这样 :
paramAlign.equals ( "TOP" )
因此,这就是我发现的问题以及为解决问题所做的事情。
显然情况
align == "TOP"
当活动开始时,如果没有测试正确,日志转储会告诉我实际上当时是正确的。 现在为什么这样做,我一无所知。 这似乎是一个奇怪的错误。 活动运行后,该条件即为真。
由于该参数只能有2个值,我把它切换到一个布尔变量,其中虚假现在是“底”和“顶”的真实等同等效,它是可以正常使用。
由于在启动时必须对条件进行测试,因此实际上可能需要对此进行检查。
**编辑**
您不能使用“ ==”运算符在Java中比较2个字符串。 您必须改用.equals()。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.