0

我有一个 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 没有指定开始的重力。

我在这里想念什么?

4

2 回答 2

0

所以,这就是我发现的以及我为解决我的问题所做的事情。

显然条件

align == "TOP"

活动开始时没有测试真实,尽管日志转储会告诉我当时它实际上是真实的。现在为什么这样做我不知道。这似乎是一个奇怪的错误。一旦活动运行,该条件测试为真。

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

这实际上可能需要研究,因为在启动时应该测试为真。

** 编辑 **

您不能使用“==”运算符比较 java 中的 2 个字符串。您必须改用 .equals() 。

于 2012-08-05T17:49:59.693 回答
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" )
于 2012-08-05T16:47:58.503 回答