繁体   English   中英

在垂直定向的LinearLayout中将按钮和水平定向的LinearLayout垂直对齐的问题

[英]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父级)在顶部有一些我无法摆脱的恶意填充。 有关详细信息,请参见屏幕截图。

alt

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM