У меня была почти такая же ситуация, как вы, и, наконец, сдался на попытке использовать макет XML из файла ресурсов. Не знаю, сколько часов я провел во время игры с xml, пытаясь добиться того, чтобы проценты выстраивались правильно, с некоторым успехом, но не с тем, что я действительно хотел.
Так что я, наконец, решил просто создать макет самостоятельно, программно, в основной деятельности, и это оказалось очень хорошо ...
Моя раскладка 3 части. У меня есть логотип/изображение компании наверху, на котором я хочу занять 20% экрана.
В средней части у меня есть scrollarea с именами файлов внутри. Список файлов прокручивается как вверх, так и вниз, а слева направо. Я хочу, чтобы эта область составляла 75% экрана.
3-й раздел - это только одна кнопка отправки, которая делает асинхронный вызов для обновления списка файлов в средней части, и это должно быть 5% экрана.
Итак, вот код ...
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Resources res = this.getResources(); // Load the resources
// Get available screen size
Display display = getWindowManager().getDefaultDisplay();
int screenWidth = display.getWidth();
int screenHeight = display.getHeight();
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
layout.setId(topLayout);
layout.setBackgroundColor(0xff000000);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);
layout.setLayoutParams(lp);
double logoHeight = screenHeight * .20;
logoHeight = Math.round(logoHeight);
Bitmap logoImg = BitmapFactory.decodeResource(res, R.drawable.standardlogo);
logoImg = Bitmap.createScaledBitmap(logoImg, screenWidth, (int)logoHeight, true);
ImageView imageView = new ImageView(this);
imageView.setImageBitmap(logoImg);
imageView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
layout.addView(imageView);
double bottomHeight = screenHeight * .05;
bottomHeight = Math.round(bottomHeight);
int scrollAreaHeight = screenHeight - (int)logoHeight - (int)bottomHeight - topHeight;
ScrollView scroll = new ScrollView(this);
scroll.setBackgroundColor(0xffd8d8d8);
LinearLayout.LayoutParams slp = new LinearLayout.LayoutParams(screenWidth, scrollAreaHeight);
scroll.setLayoutParams(slp);
layout.addView(scroll);
HorizontalScrollView hScroll = new HorizontalScrollView(this);
hScroll.setBackgroundColor(0xffd8d8d8);
LinearLayout.LayoutParams hlp = new LinearLayout.LayoutParams (LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
hScroll.setLayoutParams(hlp);
scroll.addView(hScroll);
TextView tv = new TextView(this);
tv.setId(textArea);
LayoutParams lparams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
tv.setLayoutParams(lparams);
tv.setTypeface(Typeface.MONOSPACE);
tv.setText("");
hScroll.addView(tv);
Button btn = new Button(this);
btn.setId(sendButton);
btn.setOnClickListener(sendBtnListener);
ViewGroup.LayoutParams blp = new ViewGroup.LayoutParams(screenWidth, LayoutParams.WRAP_CONTENT);
btn.setLayoutParams(blp);
btn.setText("List Import Directory");
layout.addView(btn);
setContentView(layout);
}
Это совсем немного кода, но это именно то, что я хочу, чтобы это сделать, и он работает на всех размеров экрана я проверил его на , У меня есть только один логотип компании png для приложения, который представляет собой большое изображение, предназначенное для 10-дюймового планшета.
Примечание: Значение topHeight жестко запрограммировано на 100, которое работает на всех устройствах, которые у меня есть протестировал его. Это высота баров действия или состояния в верхней части экрана и варьируется между устройствами, поэтому я установил его на 100 для обработки до двух 48-пиксельных баров. Он оставляет некоторое неиспользуемое пространство на дне экрана если есть только один бар, но он минимальный.