【问题标题】:Android - Views are not aligned correctlyAndroid - 视图未正确对齐
【发布时间】:2014-09-28 01:06:22
【问题描述】:

这是我的代码:

  rl=(RelativeLayout)findViewById(R.id.ScoreLayout);


    rtb=new RatingBar(this);
    rl.addView(rtb);
    rtb.setNumStars(5);
    rtb_params=new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);
    rtb_params.addRule(RelativeLayout.CENTER_HORIZONTAL);
    rtb_params.addRule(RelativeLayout.ALIGN_PARENT_TOP);
    rtb.setLayoutParams(rtb_params);


    txt1=new TextView(this);
    rl.addView(txt1);
    txt1.setSingleLine();
    txt1.setTextSize(TypedValue.COMPLEX_UNIT_PX,15);
    txt1.setText("Best Score: ");
    txt1_params=new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);
    txt1_params.addRule(RelativeLayout.ALIGN_TOP, rtb.getId());
    txt1_params.addRule(RelativeLayout.CENTER_HORIZONTAL);
    txt1.setLayoutParams(txt1_params);


    txt2=new TextView(this);
    rl.addView(txt2);
    txt2.setSingleLine();
    txt2.setTextSize(TypedValue.COMPLEX_UNIT_PX,30);
    txt2.setText(String.valueOf(DataBase.HighScore));
    txt2_params=new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);
    txt2_params.addRule(RelativeLayout.ALIGN_TOP, txt1.getId());
    txt2_params.addRule(RelativeLayout.CENTER_HORIZONTAL);
    txt2.setLayoutParams(txt1_params);


    txt3=new TextView(this);
    rl.addView(txt3);
    txt3.setSingleLine();
    txt3.setTextSize(TypedValue.COMPLEX_UNIT_PX,15);
    txt2.setText("Current Score: ");
    txt3_params=new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);
    txt3_params.addRule(RelativeLayout.ALIGN_TOP, txt2.getId());
    txt3_params.addRule(RelativeLayout.CENTER_HORIZONTAL);
    txt3.setLayoutParams(txt1_params);


    txt4=new TextView(this);
    rl.addView(txt4);
    txt4.setSingleLine();
    txt4.setTextSize(TypedValue.COMPLEX_UNIT_PX,30);
    txt4.setText(String.valueOf(DataBase.score));
    txt4_params=new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);
    txt4_params.addRule(RelativeLayout.ALIGN_TOP, txt3.getId());
    txt4_params.addRule(RelativeLayout.CENTER_HORIZONTAL);
    txt4.setLayoutParams(txt1_params);


    btn1=new Button(this);
    rl.addView(btn1);
    btn1_params=new RelativeLayout.LayoutParams(150,40);
    btn1_params.addRule(RelativeLayout.CENTER_HORIZONTAL);
    btn1_params.topMargin=DataBase.Layout_Height-80-80;//first 80 for the advertisment Bar and second for the two 40-height-buttons
    btn1.setLayoutParams(btn1_params);


    btn2=new Button(this);
    rl.addView(btn2);
    btn2_params=new RelativeLayout.LayoutParams(150,40);
    btn2_params.addRule(RelativeLayout.CENTER_HORIZONTAL);
    btn2_params.addRule(RelativeLayout.ALIGN_TOP, btn1.getId());
    btn2.setLayoutParams(btn2_params);

虽然这些视图应该水平居中且具有战术性,但它们看起来像这样:

http://postimg.org/image/peqhzw0uh/

我希望每个视图都位于另一个视图下,并且所有视图都应该水平居中! RatingBar(rtb) 应该在顶部,下面应该是

txt1-->txt2-->txt3-->txt4-->btn1-->btn2

我花了很多时间来查询这个问题,但我找不到为什么会发生这种情况的答案 谢谢你的帮助:)

【问题讨论】:

    标签: android object alignment views center


    【解决方案1】:

    您需要为您的视图添加setId() 一些标识符,以便ALIGN_TOP, view.getId() 规则真正发挥作用。

    虽然ALIGN_TOP 只对齐视图的顶部,使视图彼此重叠。请改用LAYOUT_BELOW 规则或LinearLayout。

    对于视图 id,任何大于 0 的整数都可以。只需确保 id 是不同的,以便 RelativeLayout 可以找到您所指的正确视图。

    对于 Android Studio 的“Expected resource of type Id”错误,使用@IdRes 注解将整数注解为资源标识符。例如,

    @android.support.annotation.IdRes int id = 1;
    view.setId(id); // no error
    
    id++; // next id
    view2.setId(id); // and so on
    

    ...虽然在这种情况下 LinearLayout 会避免首先生成 id 的需要。

    【讨论】:

    • 但我以编程方式添加所有视图!我应该如何 setid() ?谢谢你:)
    • 您设置的 id 可以是任何数字 > 0。只要确保RelativeLayout 可以在给定 id 时引用您想要的视图。
    • 不,我不能 android studio 说:Id 类型的预期资源
    • 您可以使用@IdRes 注释来解决这个问题。 stackoverflow.com/questions/24716385/…
    【解决方案2】:

    由于您使用的是 RelativeLayout,因此请使用 txt1_params.addRule(RelativeLayout.BELOW, rtb.getId()); 这应该可以解决问题..

    txt1 rtb 以下的示例代码

    txt1_params=new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);
    txt1_params.addRule(RelativeLayout.BELOW, rtb.getId());
    txt1_params.addRule(RelativeLayout.CENTER_HORIZONTAL);
    txt1.setLayoutParams(txt1_params);
    

    您可以对其余视图使用相同的代码。

    通过代码分配 id(以编程方式)

    • 使用 someView.setId(int) 手动设置 ID;
    • int 必须是正数,否则是任意的 - 它可以是您想要的任何值(如果这很可怕,请继续阅读。)
    • 例如,如果创建多个表示项目的视图并为其编号,则可以使用它们的项目编号。

    【讨论】:

    • 好吧,我已经尝试过了,结果是一样的!可能是我没有设置每个视图的 id,但 android studio 不允许我:/
    • 检查编辑后的答案,让我知道.. 每次添加视图时,都会增加每个视图的 id 的 int 值..
    猜你喜欢
    • 1970-01-01
    • 2013-06-15
    • 2020-03-16
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多