繁体   English   中英

Android:TextView.setLayoutParams有时可以工作,有时则不行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM