2012-08-05 71 views
0

我有一个android应用程序,让我们的用户修改一些布局参数。我的一个功能让用户决定TextView是否与图片的顶部或底部对齐。Android:TextView.setLayoutParams有时工作,有时不工作

这是函数:

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

我还要提到的是它没有任何更新的按钮图像。 – ReX357 2012-08-05 16:57:02

回答

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") 
+0

是的,它的确在其他地方初始化了,但为了这个例子,它保持简短。我刚刚尝试在setLayoutParams之后添加txtGoal.invalidate(),但它仍然不起作用。 – ReX357 2012-08-05 16:50:30

+0

什么是根视图的布局类型? (的LinearLayout,RelativeLayout的...) – Leeeeeeelo 2012-08-05 17:04:45

+0

它是一个FrameLayout里 – ReX357 2012-08-05 17:06:01

0

所以,这里是我发现了,我做了什么来解决我的问题。

显然条件

align == "TOP" 

当活动开始本书虽然日志转储会告诉我,这是在事实上也确实如此,在当时是不是测试真实。现在为什么这样做,我不知道。这看起来像一个奇怪的错误。一旦活动运行,该条件就会被验证。

由于这个参数只能有2个值,我把它切换到一个布尔变量,其中虚假现在是“底”和“顶”的真实等同等效,它是可以正常使用。

这是一些可能确实需要加以研究的条件应在启动测试真实。

**编辑**

你不能比较使用 “==” 操作符在Java 2串。您必须改用.equals()。