Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:TextView.setLayoutParams有时工作,有时不工作';T_Java_Android - Fatal编程技术网

Java Android:TextView.setLayoutParams有时工作,有时不工作';T

Java Android:TextView.setLayoutParams有时工作,有时不工作';T,java,android,Java,Android,我有一个android应用程序,让用户修改一些布局参数。我的一个功能是让用户决定文本视图是与图片的顶部还是底部对齐 这就是功能: private void setAlign(String align) { /* Get Preferences */ SharedPreferences prefs = getSharedPreferences("prefs", Context.MODE_WORLD_READABLE); SharedPreferences.Editor e

我有一个android应用程序,让用户修改一些布局参数。我的一个功能是让用户决定文本视图是与图片的顶部还是底部对齐

这就是功能:

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个值,所以我将它切换为一个布尔变量,其中false现在相当于“BOTTOM”,true相当于“TOP”,它工作得很好

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

**编辑**


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

是的,它确实是在其他地方初始化的,但为了本例的缘故,它保持简短。我刚刚尝试在setLayoutParams之后添加txtGoal.invalidate(),但仍然不起作用。根视图的布局类型是什么?(linearlayout,relativelayout…)我已经编辑了我的答案,请查看我建议的第二个解决方案。我的朋友不工作。我得说这真的很奇怪。我有两个类似的函数同时执行,它们都在创建对话框时工作,并且都在TextView上运行。我也尝试过改变函数的顺序,但没有什么不同。好吧,小更新:经过一些调试后,我发现当我调用setAlign函数时,R.drawable.btn_toolbar_align_top_up和R.drawable.btn_toolbar_align_bottom_up解析为0。这也许可以解释为什么按钮图像没有改变。现在我不知道它为什么解析为0。我还应该提到它也不会更新按钮图像。