0

携帯電話から投稿しているため、愚かなタイプミスやフォーマットの問題はご容赦ください。

プレイヤーがロードできる保存済みゲームを一覧表示するアクティビティがあります。

ScrollView を定義する単純なレイアウト xml ファイルを作成しました。ロード時に、保存されたすべてのゲームを取得し、プログラムによって、保存された各ゲームのビューを ScrollView の垂直方向の LinearLayout の子に追加します。

各ゲームのビューは、水平方向の LinearLayout で構成され、これには Button と垂直方向の LinearLayout が含まれます。その LinearLayout には、いくつかの TextViews と ImageViews (および、わかりやすくするためにここでは省略しているもう 1 つの 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>
4

3 に答える 3

3

なんらかの配置が必要な場合は、RelativeLayout を使用してみませんか? これは基本的に、あるビューを別のビューに合わせるように設計されています。android:layout_alignTop は、あなたが望むもののように聞こえます。

(もちろん、パディング値がすべてのコントロールで同じであることを確認してください。

于 2010-07-11T20:42:44.010 に答える
2

ListViewそういうGUIにはa を使ってみてはいかがでしょうか。

行 xml を定義する必要があります。

于 2010-07-11T21:27:02.253 に答える
1

ListView と RelativeLayout を提案する回答に +1 します。このような状況では、RelativeLayout を使用したアイテム レイアウトを備えた ListView が必要になるでしょう。(ListView は、多くのアイテムがある場合にはるかに適切にスケーリングされます。これが保存されたゲームのリストの場合、これはかなり大きくなる可能性があります。) このタイプの UI では、行/リスト アイテム全体をクリック可能にすることをお勧めします。小さなロード ボタンを使用するよりも、それは設計上の問題であり、最終的にはユーザー次第です。

getApplicationContextビューの作成には使用しないでください。アクティビティはコンテキストthisです。ケースを渡すだけです。

デフォルトでは、LinearLayouts は、存在する場合、テキスト ベースラインによって子ビューを整列させようとします。ボタンの Load テキストの下部が、スクリーンショットの CURRENT_GAME テキストと完全に一致していることに注意してください。試してみてくださいgameContainer.setBaselineAligned(false)

通常gameInfo、baselineAlignedChildIndex を設定した場合、レイアウトはその子の 1 つのベースラインのみを報告しますが、プログラムで LinearLayouts を作成すると、cupcake と eclair の間でこの動作が変わったようです。(AOSP で変更したコミットへのリンクはこちら)。

于 2010-07-11T22:33:18.623 に答える