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>

4

1 回答 1

2

我和你的情况几乎一样,最后放弃了尝试使用资源文件中的 xml 布局。不知道我花了多少时间摆弄 xml,试图让百分比正确排列,取得了一些成功,但不是我真正想要的。

所以我最终决定在主要活动中以编程方式自己创建布局,结果非常好......

我的布局是 3 个部分。我在顶部有一个公司徽标/图像,我想占据屏幕的 20%。

在中间部分,我有一个滚动区域,里面有文件名。文件列表可以上下滚动,也可以从左到右滚动。我希望这个区域占屏幕的 75%。

第三部分只是一个单独的提交按钮,它会异步调用刷新中间部分的文件列表,它应该是屏幕的 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 像素的栏。如果只有一个,它会在屏幕底部留下一些未使用的空间酒吧,但它是最小的。

于 2012-10-16T01:04:57.043 回答