2014-09-04 129 views
1

我正在开发一个应用程序,其中我有一个button并点击那个button我正在创建一个button动态。但buttons重叠。我想要的是避免dynamicallyoverlapping创建views动态添加的视图在相关布局中重叠

在我的情况下,必须使用RelativeLayout,因为我必须为这些动态创建的视图添加拖放功能。所以没有LinearLayout本身。

activity_main.xml中

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/linear_layout" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <Button 
     android:id="@+id/btnAdd" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:onClick="AddButton" 
     android:text="Button" /> 

    <RelativeLayout 
     android:id="@+id/relative_layout" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentTop="true" 
     android:layout_toRightOf="@+id/btnAdd" > 

    </RelativeLayout> 

</RelativeLayout> 

MainActivity类别

public class MainActivity extends FragmentActivity { 
    Button btnAddButton; 
    RelativeLayout rl1; 
    int i = 0; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     btnAddButton = (Button) findViewById(R.id.btnAdd); 
     final RelativeLayout.LayoutParams layoutParam = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
     rl1 = (RelativeLayout) findViewById(R.id.relative_layout); 

     btnAddButton.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       i++; 
       Button btn = new Button(getApplicationContext()); 
        btn.setId(i); 

        if(i>0){ 
         layoutParam.addRule(RelativeLayout.RIGHT_OF, (i-1)); 
        } 
        btn.setText("Button" + i); 
        rl1.addView(btn, layoutParam); 


      } 
     }); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 
} 
+0

由于它是一个相对布局,因此您需要使用LayoutParams将新元素放置在视图中。 HTTP://开发商。android.com/guide/topics/ui/layout/relative.html – brwngrldev 2014-09-04 14:12:45

+0

只需要一个LinearLayout并将其方向设置为水平..new元素将在另一个的右侧,如果发生了某种情况,请添加规则。 – Nepster 2014-09-04 14:35:47

+0

@Nepster,the事情是,我们需要使用'RelativeLayout',因为我们稍后想要将'Drag''和''Drop'应用于这些视图。 LinearLayout将允许我们垂直或水平移动,否则不会。 – 2014-09-04 18:24:28

回答

2

您应该添加规则,以你的相对布局的参数为:

btnAddButton.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     i++; 
     Button btn = new Button(getApplicationContext()); 
     btn.setId(i); 
     if(i>0){ 
      layoutParam.addRule(RelativeLayout.RIGHT_OF, (i-1)); 
     } 
     btn.setText("Button" + i); 
     rl1.addView(btn, layoutParam); 

    } 
}); 

这样,您的按钮将被放置在最后一个按钮的右侧。

希望这会有所帮助。

编辑:

试着把你的LayoutParams内循环。 对我来说这是工作的罚款:

RelativeLayout rl1 = (RelativeLayout) findViewById(R.id.rl); 
for (int i = 0; i < 4; i++) { 

    Button btn = new Button(getApplicationContext()); 
    btn.setId(i); 
    RelativeLayout.LayoutParams layoutParam = new RelativeLayout.LayoutParams(
      LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
    if (i > 0) { 
     layoutParam.addRule(RelativeLayout.RIGHT_OF, (i - 1)); 
    } 

    btn.setText("Button" + i); 
    rl1.addView(btn, layoutParam); 
} 

截图:

enter image description here

编辑

即使你不使用循环,并添加按钮点击,它应该工作:

int i = 1; 
//this is a method being called on button's click: 
public void add(View v) { 
    Button btn = new Button(getApplicationContext()); 
    btn.setId(i); 
    RelativeLayout.LayoutParams layoutParam = new RelativeLayout.LayoutParams(
      LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
    if (i > 1) { 

     layoutParam.addRule(RelativeLayout.RIGHT_OF, (i - 1)); 
    } 

    btn.setText("Button" + i); 
    rl1.addView(btn, layoutParam); 
    i++; 
} 

希望这会有所帮助。

+0

LayoutParams layoutParam; 我用它与您的代码,但仍然出现错误 – 2014-09-05 05:17:22

+0

RelativeLayout.LayoutParams layoutParam = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); 我已经使用它,但仍然按钮重叠。 – 2014-09-05 05:22:13

+0

使用'layoutParam.addRule(RelativeLayout.RIGHT_OF,(i-1));'? @hanishsharma – 2014-09-05 05:23:48

0

有多种方法可以解决问题。

隐藏按钮,并显示在点击

无需动态添加的按钮。只需添加两个按钮一个是可见的和其他不可见的。而就btnAddButton的点击简单地表现出来..

 otherBtn.setVisibility(View.GONE); 
     otherBtn.setVisibility(View.VISIBLE);// you can also set it in xml by visiblity="true" 

使用的LinearLayout代替

乘坐LinearLayout instead of RelativeLayout它会自动将其设置方向后,将其添加到右侧,如果没有设置,那么addRule正如@Dhruti所建议的

+0

检查更新的问题。 – 2014-09-04 18:34:30

+0

**隐藏按钮并单击显示** < - 这不会解决我们的主要动机。我们必须动态地制作所有的视图,否则将会过于沉重,因为我们几乎需要这些视图来处理几乎所有的小部件。 – 2014-09-04 18:36:08