0

我是用手机发帖的,所以请原谅愚蠢的错别字和格式问题。

我有一个活动列出了玩家可以加载的已保存游戏。

我创建了一个简单的布局 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();
                      }
                 });
            }
       }
  }

加载保存的.xml

           <LinearLayout
                android:orientation="vertical"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:id="@+id/load_scroll_view" />

       </ScrollView>
  </LinearLayout>
4

3 回答 3

3

如果你想要任何类型的对齐,为什么不使用RelativeLayout?这基本上旨在将一个视图与另一个视图对齐。android:layout_alignTop 听起来像你想要的东西。

(当然,还要验证所有控件中的填充值是否相同,但我相信你做到了。)

于 2010-07-11T20:42:44.010 回答
2

你为什么不尝试使用ListView那种 gui。

您仍然需要定义行 xml。

于 2010-07-11T21:27:02.253 回答
1

+1 建议 ListView 和 RelativeLayout 的答案。对于这种情况,您可能需要使用 RelativeLayout 的具有项目布局的 ListView。(如果有很多项目,ListView 会更好地扩展,如果这是一个已保存游戏的列表,它似乎会增长很多。)对于这种类型的 UI,建议让整个行/列表项目可点击而不是而不是使用一个小的加载按钮,但这是一个设计问题,最终取决于你。

不要getApplicationContext用于创建视图。Activity 是一个上下文,只需传入this您的案例即可。

默认情况下,LinearLayouts 尝试通过其文本基线对齐子视图(如果存在)。请注意,按钮的加载文本底部与屏幕截图中的 CURRENT_GAME 文本完美对齐。试试gameContainer.setBaselineAligned(false)

通常gameInfo,如果您设置了baselineAlignedChildIndex,您的布局只会报告其中一个子项的基线,但在以编程方式创建LinearLayouts 时,这种行为似乎在cupcake 和eclair 之间发生了变化。(链接到在 AOSP 中更改它的提交。)

于 2010-07-11T22:33:18.623 回答