19

想象一个完整的 Android 设备屏幕,我希望它分为两个部分:

  1. 上半部分有文本,可能大于可用空间(或不可用),因此文本将滚动(即 ScrollView 内的 TextView)
  2. 下半部分包含一个 MapView 控件。

具体看一些场景:

  1. 如果文本很小,我希望地图占用更多空间,即超过 50%。所以也许 20% 的文字,80% 的地图。
  2. 如果文本较大,则最多只占用 50% 的屏幕空间,然后滚动。所以 50% 的地图,50% 的文字。

目前我已经为这两个部分分配了权重,这还不错,但是如果文本很小,则地图不会扩展以占用空间,并且布局会浪费地图可以有用的使用。

我已经尝试了很多组合,但不知道如何实现这一点。对我来说,我知道自己想要什么似乎是一种常见的体验,但看不到如何获得可用的视图来交付它。我希望有一个很好的简单方法来做到这一点。

请随意让我看起来像个傻瓜,并指出我错过的明显属性:-)

==================================================== =====================

据我所知,仅在声明性 XML 中无法做到这一点,它需要在代码中完成。我将文本部分的高度设置为 wrap_content,将权重设置为 0(不调整大小),并将地图设置为 weight=1(即占用剩余空间)。然后我检查文本部分(在 ScrollView 中)是否占用了太多空间,如果是,则将其缩小。此代码需要更改以支持不同的布局方向。

private void fixLayoutProportions()
{
    float maxPercentageOfScreenForText = 50/100;
    LinearLayout container = (LinearLayout)findViewById(R.id.container);
    ScrollView eventText = (ScrollView)findViewById(R.id.text_scroller);
    int heightAvailable = container.getHeight();
    int scrollerHeight = eventText.getHeight();
    if ( scrollerHeight>(heightAvailable*maxPercentageOfScreenForText) )      // Text section using too much space
    {
        eventText.getLayoutParams().height = (int)(heightAvailable*maxPercentageOfScreenForText) ;
        eventText.invalidate();
    }
}
4

7 回答 7

11

您可以通过将所有内容放入 LinearLayout 并更改以下参数来做到这一点:

于 2010-11-30T16:48:48.047 回答
3

您是否尝试在运行时测量屏幕高度:

Display display = ((WindowManager) 
      getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
int width = display.getHeight();

然后,将您的顶视图 max_height 设置为 width*0.5,将 min_height 设置为 width*0.2。您的顶视图必须是具有 min_height 和 max_height 属性的控件(如 TextView)。此外,将 layout_weight 设置为 0 或将其留空。在您的底视图上,将布局权重设置为 1。

于 2010-11-30T16:05:07.487 回答
2

在 XML 中实现 50/50 的最简单方法是使用 LinearLayout 权重。基本上将两个视图放入一个 LinearLayout 中,将两个子视图上的 android:layout_weight 设置为相同的值,例如将两者都设置为 0.5、1 或 42。然后将 layout_width 设置为 0px 或 fill_parent/match_parent。

较小的部分变得更复杂。幸运的是,您可以在 Java 中关闭称重。一种方法是等到窗口被绘制(如果它们是预先填充的)并测量它们。这可以在我认为它被称为 onWindowFocusChanged 上完成

于 2012-09-19T15:42:32.030 回答
0

我没有对此进行测试,但我会尝试将您的 ScrollView 设置为 haveandroid:layout_weight="1"和您的MapViewto haveandroid:layout_weight="0"android:minHeight="240dp". 希望 minHeight 将优先于 layout_weight。

于 2010-11-30T15:35:15.863 回答
0

如果你觉得这很琐碎,我很抱歉。但我建议它以防万一它没有击中你。如何使用相对布局并保持 textview 始终位于地图顶部。使 textview 的重力为顶部,其宽度为 match_parent,其高度为 wrap_content,其权重为 1(与您的地图相同)。这样,您的 textview 将根据文本的大小而变化,而由于重量而不会超过 50%。至于地图,用户可以把地图往下拉,看到textview下隐藏的部分。就好像textview下没有地图(你知道,除非你想让textview背景透明,我认为这看起来很酷:))。我不知道地图视图。但我假设它会类似于 iphone 上的谷歌地图,就像您可以使用多点触控来改变大小并使用单点触控来滚动。

于 2011-01-12T16:15:17.980 回答
0

我认为您必须将 mapviews 高度设置为填充父级并将 textviews 高度设置为 wrap contetn,而对于滚动,您必须为文本视图设置垂直滚动为真,并且当您需要不超过 50% 的空间 textview 时,您可以设置 textview 的 maxheight 属性。

于 2011-01-10T11:36:09.327 回答
0

好的,因为我看到它就像你将屏幕的最大一半保留给 TextView,如果它更多,它必须滚动。我有一个解决方案,但为此您必须修复 TextView 的最大行数,计算这可能会很痛苦:P 但有一个解决方案永远不会少。

main.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:scrollbars="vertical"
    android:maxLines="5"
    android:id="@+id/tv1"
    android:text="wsdvsv sjdgv jsdvn ksdjbn skjdb ksdnbk snbk snbjksn fkbj sfkbjn dfkjbndkjfbn kdjfnb kjdfnbkjdnfbk ndf bjkndf bndfjbn dfkbn jdfnbjdfnbjdfn bjdf nbkjdnf bkjdfnb kjdnfbkjdfn bkjndfbjndfjbndkjfbn dkfjbn kdjfnb kjdfnbkjdfnbjkd nfkjbndf"
    />
 <TextView 
    android:layout_width="fill_parent" 
    android:layout_below="@id/tv1"
    android:layout_height="wrap_content" 
    android:scrollbars="vertical"
    android:maxLines="5"
    android:text="Does it work ???"
    />
</RelativeLayout>

Java 文件:

package com.android;

import android.app.Activity;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.widget.TextView;

public class TestActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView tv = (TextView) findViewById(R.id.tv1);
        tv.setMovementMethod(new ScrollingMovementMethod());
    }
}

如果文本仅在 2 行中说“它有效吗?” 会自动升档。但我在这里看到的唯一问题是 5 的最大行数是你可以为 ui 设置一个最大值,这可能会很好:)

BR,J

PS我之前没有回答很多问题所以我不知道如何附加文件:(

于 2011-01-03T17:34:16.807 回答