我有一个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没有指定重力开始。
我在这里缺少什么?
答案 0 :(得分:0)
首先,我看到变量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" )
答案 1 :(得分:0)
所以,这是我发现的以及我为解决问题所做的工作。
显然是条件
align == "TOP"
当活动开始时,测试结果不正确,而Log转储会告诉我当时确实是真的。为什么它这样做我不知道。这似乎是一个奇怪的错误。一旦活动开始,该条件就会测试为真。
由于此参数只能有2个值,我将其切换为布尔变量,其中false现在相当于“BOTTOM”,相当于“TOP”,它完全正常工作。
这可能实际上需要调查,因为条件应该在启动时测试为真。
**编辑**
您无法使用“==”运算符比较java中的2个字符串。你必须改用.equals()。