首先,让我描述一下我要完成的一般想法。我有一组4个数字,它们代表不同的统计数据,我希望在我的UI中以条形图显示这些数据。单击2条,应交换数字值并相应调整条的大小。我认为将这些条形实现为按钮是有意义的,将它们设置为相同的宽度和高度以匹配其值,然后根据需要更改其高度以匹配新的值。但是我遇到了问题。
1)可以说,我无法使条形/按钮在视图组的底部对齐-位于图的x轴上。我尝试使用RelativeLayout和FrameLayout设置gravity =“ bottom”,但是按钮都彼此对齐,就像上下颠倒的条形图一样。 LinearLayout将它们全部排列在中间-似乎无法改变它。我尝试了[此帖子的建议] [1],但没有成功。我最终使用了一个约束组,并将它们约束到最底端,并且彼此之间相互约束,这种约束最初是可行的,但是在调整按钮的大小时就中断了,这将导致下一个问题。
2)调整按钮大小时,我一直遇到问题。首先,我尝试了不执行任何操作的mButton.setHeight()。然后,我读到我应该制作一个LayoutParams对象,并使用该对象,该对象确实发生了变化,但大小没有改变,但是确实发生了变化。同样,调整按钮的大小似乎打破了限制。我尝试过回到LinearLayout,但是现在我崩溃了。
我想第三个问题可能是,我只是想解决这个错误?我不应该这样尝试使用按钮吗?感谢您提供的所有帮助。
这是xml的剪辑。为简便起见,我只是发布单个按钮的代码,而不是四个相同的块。 (我读过的最后一句话是,建议将具有不同高度的按钮无法对齐,并建议将每个按钮包装在一个视图组中以将其隔离,但无法正常工作)
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="bottom">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom">
<Button
android:id="@+id/butt_attack"
android:layout_width="20dp"
android:layout_height="70dp"
android:layout_marginBottom="5dp"
android:layout_marginStart="5dp"
android:background="@color/YellowHigh"
android:text="7"
android:textSize="10sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</RelativeLayout>
来自活动Java文件
mReadySwap = false; //Used to signify if one of the buttons has already been pressed
mAttackButt = (Button)findViewById(R.id.butt_attack);
mSleazeButt = (Button)findViewById(R.id.butt_sleaze);
mDataProcButt = (Button)findViewById(R.id.butt_dataproc);
mFirewallButt = (Button)findViewById(R.id.butt_firewall);
mAttackButt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(!mReadySwap){ //note the first button to be pressed and copy necessary values
mButt1 = mAttackButt;
mHeight1 = mAttackButt.getHeight();
mAttNum1 = mAttackButt.getText().toString();
mReadySwap = true;
}else{ //make the swap
mButt1.setLayoutParams(new LinearLayout.LayoutParams(20, mAttackButt.getHeight()));
// mButt1.setHeight(mAttackButt.getHeight());
mButt1.setText(mAttackButt.getText());
mAttackButt.setLayoutParams(new LinearLayout.LayoutParams(20, mHeight1));
// mAttackButt.setHeight(mHeight1);
mAttackButt.setText(mAttNum1);
mReadySwap = false;
}
}
});