我有一个 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 没有指定开始的重力。
我在这里想念什么?