Android:TextView.setLayoutParams有时有效,有时不起作用



我有一个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"

当活动启动时,测试结果不是真的,尽管日志转储会告诉我当时事实上是真的。现在我不知道为什么会这样。这似乎是一个奇怪的bug。活动运行后,该条件测试为真。

由于这个参数只能有2个值,我将其切换到一个布尔变量,其中false现在相当于"BOTTOM",true相当于"TOP",它运行得很好。

这可能是真正需要考虑的问题,因为条件应该在启动时测试为真。

**编辑**

在java中,不能使用"=="运算符比较两个字符串。您必须使用.equals()。

相关内容

最新更新