Android - 视图未正确对齐

时间:2014-08-05 11:26:29

标签: android object alignment views center

这是我的代码:

  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

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

2 个答案:

答案 0 :(得分:3)

您需要setId()一些标识符,以便ALIGN_TOP, view.getId()规则实际执行某些操作。

虽然ALIGN_TOP仅对齐视图的顶部,但使视图相互叠加。请改用LAYOUT_BELOW规则或LinearLayout

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

对于Android Studio的“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。

答案 1 :(得分:0)

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

rtb以下的txt1示例代码

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必须是正数,否则是任意的 - 它可以是你想要的任何东西(如果这是可怕的话,请继续阅读。)
  • 例如,如果创建和编号表示项目的多个视图,则可以使用其项目编号。