![](/img/trans.png)
[英]Android LinearLayout horizontally or vertically oriented items fill remaining space
[英]Problems vertically aligning a Button and horizontally oriented LinearLayout within a vertcally oriented LinearLayout
我从手机上发帖,所以请原谅愚蠢的错别字和格式问题。
我有一个活动,列出了玩家可以加载的已保存游戏。
我创建了一个简单的布局xml文件,该文件定义了ScrollView。 在加载时,我抓取了所有保存的游戏,并以编程方式将每个保存的游戏的视图添加到ScrollView的垂直定向的LinearLayout子级中。
每个游戏的视图都包含一个水平方向的LinearLayout,该水平布局又包含一个Button和一个垂直方向的LinearLayout。 该LinearLayout依次包含一些TextViews和ImageViews(以及另外一个LinearLayout,为清楚起见,在此省略)。
层次结构看起来像这样(省略了一些详细信息)。
ScrollView
LinearLayout - vertical
Each saved game:
LinearLayout - horizontal
Button - load game
LinearLayout - vertical
TextView - game name
TextView - date string
我的问题:
我希望按钮的顶部和“游戏名称” texview垂直对齐,但TextView(或者它可能是LinearLayout父级)在顶部有一些我无法摆脱的恶意填充。 有关详细信息,请参见屏幕截图。
LoadSaved类:注意:mScrollView的名称不正确。 它引用ScrollView的子级LinearLayout。
public class LoadSaved extends Activity {
public LinearLayout mScrollView;
private MinerDb mDb;
public void onCreate(Bundle b) {
super.onCreate(b);
setContentView(R.layout.loadsaved);
mDb = new MinerDb(this);
mScrollView = (LinearLayout) findViewById(R.id.load_scroll_view);
Bundle[] savedGames = mDb.getSavedGames();
for (int i = 0; i < savedGames.length; i++) {
Bundle game = savedGames[i];
final int gameId = game.getInt("gameId");
String name = game.getString("name");
String date = game.getString("date");
Bundle player = game.getBundle("player");
int playerMoney = player.getInt("money");
int playerHealth = player.getInt("health");
LinearLayout gameContainer = new LinearLayout(getApplicationContext());
gameContainer.setPadding(5, 5, 5, 5);
gameContainer.setGravity(Gravity.TOP);
gameContainer.setOrientation(LinearLayout.HORIZONTAL);
gameContainer.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
Button loadButton = new Button(getApplicationContext());
loadButton.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
loadButton.setText("Load");
LinearLayout gameInfo = new LinearLayout(getApplicationContext());
gameInfo.setOrientation(LinearLayout.VERTICAL);
gameInfo.setPadding(10,0,10,10);
gameInfo.setGravity(Gravity.TOP);
gameInfo.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
TextView nameView = new TextView(getApplicationContext());
nameView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
nameView.setGravity(Gravity.TOP);
nameView.setText(name);
TextView dateView = new TextView(getApplicationContext());
dateView.setPadding(5,0,0,0);
dateView.setGravity(Gravity.TOP);
dateView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
dateView.setText(date);
LinearLayout playerView = new LinearLayout(getApplicationContext());
playerView.setOrientation(LinearLayout.HORIZONTAL);
playerView.setPadding(5,0,0,0);
playerView.setGravity(Gravity.TOP);
playerView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
TextView playerMoneyView = new TextView(getApplicationContext());
playerMoneyView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
playerMoneyView.setPadding(0,0,10,0);
playerMoneyView.setTextColor(Color.GREEN);
playerMoneyView.setText("$" + playerMoney);
TextView playerHealthView = new TextView(getApplicationContext());
playerHealthView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
playerHealthView.setPadding(0,0,10,0);
playerHealthView.setTextColor(Color.RED);
playerHealthView.setText(playerHealth + "%");
playerView.addView(playerMoneyView);
playerView.addView(playerHealthView);
gameInfo.addView(nameView);
gameInfo.addView(dateView);
gameInfo.addView(playerView);
gameContainer.addView(loadButton);
gameContainer.addView(gameInfo);
mScrollView.addView(gameContainer);
loadButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Log.e("LoadSaved", "LoadSaved::onCreate: Clicking: " + gameId);
Intent loadGameIntent = new Intent(LoadSaved.this, Miner.class);
loadGameIntent.putExtra("load_game", gameId);
startActivity(loadGameIntent);
finish();
}
});
}
}
}
loadsaved.xml
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/load_scroll_view" />
</ScrollView>
</LinearLayout>
如果要进行任何对齐,为什么不使用RelativeLayout? 这基本上是为了使一个视图与另一个视图对齐。 android:layout_alignTop听起来像您想要的东西。
(并且,当然,请确认所有控件中的填充值都相同,但是我确定您已经做到了。)
您为什么不尝试将ListView
用于这种gui。
您仍然需要定义行xml。
+1对建议ListView和RelativeLayout的答案。 对于这种情况,您可能需要使用RelativeLayout的具有项目布局的ListView。 (如果有很多项目,ListView的缩放效果会更好,并且如果这是用于保存的游戏列表,则看起来可能会增长很多。)对于这种类型的UI,建议整个行/列表项都可单击,而不是而不是使用小的“加载”按钮,但这是设计问题,最终要取决于您。
不要使用getApplicationContext
创建视图。 活动是一个上下文,只需在您的情况下传递this
。
默认情况下,LinearLayouts尝试按子视图的文本基线(如果存在)对齐。 请注意,按钮的“加载”文本的底部与屏幕快照中的CURRENT_GAME文本完全对齐。 尝试gameContainer.setBaselineAligned(false)
。
通常,如果您设置了baselineAlignedChildIndex,您的gameInfo
布局将仅报告其子项之一的基线,但是当以编程方式创建LinearLayouts时,此行为看起来像是在纸杯蛋糕和小饼之间。 (在此处链接到更改了AOSP中的提交的提交。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.