2012-05-04 3 views
0

В моем макете деятельности есть 3 основных объекта: название, фотография и статья. Я пытаюсь заставить заголовок быть 15% экрана, картинка должна быть 35% экрана и 50% для текста статьи. По какой-то причине статья иногда занимает гораздо больше места, а иногда и ее изображение. Есть ли способ форсировать размеры?Макет в процентах от размера экрана

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
android:id="@+id/ll" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" 
xmlns:android="http://schemas.android.com/apk/res/android"> 

<TextView 
    android:id="@+id/headline" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_horizontal" 
    android:text="Headline" /> 

<ImageView 
    android:id="@+id/picture" 
    android:layout_width="fill_parent" 
    android:layout_height ="wrap_content" 
    android:layout_weight = "35"/> 
<ScrollView 
    android:id="@+id/scrollView1" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_weight = "50"> 
    <TextView 
    android:id="@+id/storydata" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Story Data" /> 
</ScrollView> 

ответ

2

У меня была почти такая же ситуация, как вы, и, наконец, сдался на попытке использовать макет 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-пиксельных баров. Он оставляет некоторое неиспользуемое пространство на дне экрана если есть только один бар, но он минимальный.

Смежные вопросы