2017-04-09 45 views
0

好了,所以这里的东西。我试图做类似钢琴的Android应用程序,也是我从来没有真正与Java多少经验或编程为Android所以这一切是相当新的给我。我已经设法在XML中做到这一点,但我想让它成为编程语言,所以我可以轻松地添加更多也取决于屏幕大小的白色和黑色键。在XML它看起来像这样动态添加按钮旁边的对方 - RelativeLayout的

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="wrap_content"> 

<Button 
    android:id="@+id/white1" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:background="#fff" /> 
<Button 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:background="#fff" 
    android:id="@+id/white2" 
    android:layout_toRightOf="@+id/white1"/> 
<Button 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:background="#fff" 
    android:id="@+id/white3" 
    android:layout_toRightOf="@+id/white2"/> 
<Button 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:background="#fff" 
    android:id="@+id/white4" 
    android:layout_toRightOf="@+id/white3"/> 
<Button 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:background="#fff" 
    android:id="@+id/white5" 
    android:layout_toRightOf="@+id/white4"/> 
<Button 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:background="#fff" 
    android:id="@+id/white6" 
    android:layout_toRightOf="@+id/white5"/> 
<Button 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:background="#fff" 
    android:id="@+id/white7" 
    android:layout_toRightOf="@+id/white6"/> 
<Button 
    android:layout_width="wrap_content" 
    android:layout_height="100dp" 
    android:layout_marginStart="-10dp" 
    android:layout_marginEnd="-6dp" 
    android:background="#000" 
    android:id="@+id/black1" 
    android:layout_toRightOf="@+id/white1"/> 
<Button 
    android:layout_width="wrap_content" 
    android:layout_height="100dp" 
    android:layout_marginLeft="-6dp" 
    android:layout_marginRight="-10dp" 
    android:background="#000" 
    android:id="@+id/black2" 
    android:layout_toRightOf="@+id/white2"/> 
<Button 
    android:layout_width="wrap_content" 
    android:layout_height="100dp" 
    android:layout_marginLeft="-10dp" 
    android:layout_marginRight="-6dp" 
    android:background="#000" 
    android:id="@+id/black3" 
    android:layout_toRightOf="@+id/white4"/> 
<Button 
    android:layout_width="wrap_content" 
    android:layout_height="100dp" 
    android:layout_marginLeft="-8dp" 
    android:layout_marginRight="-8dp" 
    android:background="#000" 
    android:id="@+id/black4" 
    android:layout_toRightOf="@+id/white5"/> 
<Button 
    android:layout_width="wrap_content" 
    android:layout_height="100dp" 
    android:layout_marginLeft="-6dp" 
    android:layout_marginRight="-10dp" 
    android:background="#000" 
    android:id="@+id/black5" 
    android:layout_toRightOf="@+id/white6"/> 

现在我想programmaticaly重建它,在我第一次尝试了线性方法,但首先我无法使超过7个键,和我并不知道如何制作黑键。所以,现在我已经使用了RelativeLayout,只要创建两个按钮,一切都很好,然后它可以正常工作,一个接近另一个。但是,当我尝试创建两个以上的按钮时,他们有点堆叠起来。

我试图让某种按钮的排列,所以我可以很容易使一个循环来创建按钮的数量注定。另外我想改变按钮的宽度,所以如果我创建8个按钮,宽度将为screen_width/8,但我不太确定它是否有意义,因为它在未注释时实际上没有做任何事情。

我任何提示感激:)

public class MainActivity extends AppCompatActivity { 

final int[] whitelist = {R.id.whitebt1,R.id.whitebt2,R.id.whitebt3,R.id.whitebt4,R.id.whitebt5, 
     R.id.whitebt6,R.id.whitebt7,R.id.whitebt8}; 
Button[] whiteKeys = new Button[whitelist.length]; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
    Display display = getWindowManager().getDefaultDisplay(); 
    Point size = new Point(); 
    display.getSize(size); 
    int width = size.x; 
    int height = size.y; 



    final RelativeLayout pianoLayout = new RelativeLayout(this); 
    RelativeLayout.LayoutParams whiteKeyParams1 = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 


    whiteKeys[0] = new Button(this); 
    whiteKeys[0].setId(View.generateViewId()); 
    //whiteKeys[0].setHeight(height); 
    //whiteKeys[0].setWidth(width/8); 
    whiteKeys[0].setLayoutParams(whiteKeyParams1); 
    pianoLayout.addView(whiteKeys[0]); 


    whiteKeys[1] = new Button(this); 
    whiteKeys[1].setId(View.generateViewId()); 
    //whiteKeys[i].setHeight(height); 

    RelativeLayout.LayoutParams whiteKeyParams2 = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
    whiteKeyParams2.addRule(RelativeLayout.RIGHT_OF, whiteKeys[0].getId()); 
    whiteKeys[1].setLayoutParams(whiteKeyParams2); 
    pianoLayout.addView(whiteKeys[1]); 

    //HERE'S IS THE MOMENT WHERE I TRY TO ADD THIRD BUTTON AND THE BUTTONS START TO PILE UP 
    /* 
    whiteKeys[2] = new Button(this); 
    whiteKeys[2].setId(View.generateViewId()); 
    //whiteKeys[i].setHeight(height); 

    //RelativeLayout.LayoutParams whiteKeyParams2 = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
    whiteKeyParams2.addRule(RelativeLayout.END_OF, whiteKeys[1].getId()); 
    whiteKeys[2].setLayoutParams(whiteKeyParams2); 
    pianoLayout.addView(whiteKeys[2]);*/ 

    this.setContentView(pianoLayout); 
    } 
} 

回答

0

您可以添加使用weightsumlayoutweight 8楼相同大小的按钮与LienarLayout与水平方向。

看看下面的代码,它可以帮助你动态地添加相同大小的按钮。

/* Add a new Linearlayout as a container for the buttons */ 
      LinearLayout linearLayout = new LinearLayout(this); 
      linearLayout.setOrientation(LinearLayout.HORIZONTAL); 
      //Added Weight Sum 8 in LinearLayout 
      linearLayout.setWeightSum(8); 
      /* Create a new Buttons in this container, for the status bar */ 
      //below LayoutParams define with weight 1 for buttons. 
      LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f); 
      Button button1 = new Button(linearLayout.getContext()); 
      button1.setLayoutParams(param); 

      Button button2 = new Button(linearLayout.getContext()); 
      button2.setLayoutParams(param); 

      Button button3 = new Button(linearLayout.getContext()); 
      button3.setLayoutParams(param); 

      Button button4 = new Button(linearLayout.getContext()); 
      button4.setLayoutParams(param); 

      Button button5 = new Button(linearLayout.getContext()); 
      button5.setLayoutParams(param); 

      Button button6 = new Button(linearLayout.getContext()); 
      button6.setLayoutParams(param); 

      Button button7 = new Button(linearLayout.getContext()); 
      button7.setLayoutParams(param); 

      Button button8 = new Button(linearLayout.getContext()); 
      button8.setLayoutParams(param); 
+0

这是伟大的:)。但我确实有一个问题,我如何在其上添加其他密钥?我的意思是像钢琴一样,是否可以按照我在XML中使用LinearLayout的方式进行操作?或者,也许我必须创建一个相对布局,并在里面放置两个线性布局,一个是底部的白键,另一个是顶部的黑键。 – Danmcrea

0

你的方法添加视图父布局之前,你必须添加利润率为每个新的密钥也将防止堆叠在另一个关键。

params.setMargins(左,上,右,下);

+0

它并不适合我。我的意思是,只要有两个按钮,它就会工作。但是,当我尝试添加第三个全部堆叠。 – Danmcrea