Android 线性布局?重量和重量?尺寸的总和?

Android 线性布局?重量和重量?尺寸的总和?,android,android-layout,android-layout-weight,Android,Android Layout,Android Layout Weight,我有5个直线布局。为了便于编写和理解,我将它们称为视图A-E 视图A是视图B、C、D和E的父视图 我已将视图A的布局权重设置为8.0f,视图B-E的权重分别设置为1.0f、3.0f、1.0f和3.0f 我知道这是为了管理父视图中的空白空间,但我希望调整视图和子视图的大小以拥有屏幕的百分比,而不仅仅是为了争夺空闲空间 但是,这都是通过编程完成的,所以我应该将LinearLayouts的高度设置为其父级(视图a)的getHeight()方法/访问器的系数吗?如果是这样,那么如果视图尚未添加到父视图中

我有5个直线布局。为了便于编写和理解,我将它们称为视图A-E

视图A是视图B、C、D和E的父视图

我已将视图A的布局权重设置为8.0f,视图B-E的权重分别设置为1.0f、3.0f、1.0f和3.0f

我知道这是为了管理父视图中的空白空间,但我希望调整视图和子视图的大小以拥有屏幕的百分比,而不仅仅是为了争夺空闲空间

但是,这都是通过编程完成的,所以我应该将LinearLayouts的高度设置为其父级(视图a)的
getHeight()
方法/访问器的系数吗?如果是这样,那么如果视图尚未添加到父视图中,如何获取父视图的高度,这将使用MATCH_parent设置其高度


由于
getHeight()
方法对于
onCreate
onStart
,以及第一个
onResume
,将返回0,因此我不得不继续寻找答案。我找到了
ViewTreeObserver
OnGlobalLayoutListener
,这将让我知道
布局的设置时间。然而,我真的很感激在任何绘图之前有高度。这不可能吗?

不幸的是,在绘制视图之前不可能获得视图的大小(除非有我不知道的黑客攻击)。视图在准备进行布局之前不会保存任何有关其大小的信息。如果在将来的版本中,他们设计的系统在绘制视图之前保留视图尺寸,那就太好了

可以创建自定义类,扩展视图类,然后重写系统调用的方法,并将维度返回到活动中的对象引用。然而,这可能是一个头痛,而不是一个帮助,并没有真正给你任何真正的优势


我建议使用ViewTreeObserver和OnGlobalLayoutListener。

不幸的是,在绘制视图之前无法获得视图的大小(除非有我不知道的漏洞)。视图在准备进行布局之前不会保存任何有关其大小的信息。如果在将来的版本中,他们设计的系统在绘制视图之前保留视图尺寸,那就太好了

可以创建自定义类,扩展视图类,然后重写系统调用的方法,并将维度返回到活动中的对象引用。然而,这可能是一个头痛,而不是一个帮助,并没有真正给你任何真正的优势


我建议您使用ViewTreeObserver和OnGlobalLayoutListener。

如果您不需要通过编程实现这一点,可以使用xml实现。要使子线性布局占父线性布局(线性布局a)的百分比,则需要设置父线性布局的权重总和=(子线性布局的总布局重量),然后将子线性布局的宽度/高度属性设置为“0dip”,并将其布局重量设置为所需的百分比

垂直方向的示例代码为:

<LinearLayout
     android:id="@+id/A"
     android:layout_height="fill_parent"
     android:layout_width="fill_parent"
     android:weightSum="8.0"
     android:orientation="vertical">
     <LinearLayout
          android:id="@+id/B"
          android:layout_height="0dip"
          android:layout_width="fill_parent"
          android:layout_weight="1.0"/>
     <LinearLayout
          android:id="@+id/C"
          android:layout_height="0dip"
          android:layout_width="fill_parent"
          android:layout_weight="3.0"
</LinearLayout>


如果您不需要以编程的方式来实现这一点,那么可以用xml来实现。要使子线性布局占父线性布局(线性布局a)的百分比,则需要设置父线性布局的权重总和=(子线性布局的总布局重量),然后将子线性布局的宽度/高度属性设置为“0dip”,并将其布局重量设置为所需的百分比

垂直方向的示例代码为:

<LinearLayout
     android:id="@+id/A"
     android:layout_height="fill_parent"
     android:layout_width="fill_parent"
     android:weightSum="8.0"
     android:orientation="vertical">
     <LinearLayout
          android:id="@+id/B"
          android:layout_height="0dip"
          android:layout_width="fill_parent"
          android:layout_weight="1.0"/>
     <LinearLayout
          android:id="@+id/C"
          android:layout_height="0dip"
          android:layout_width="fill_parent"
          android:layout_weight="3.0"
</LinearLayout>


下面是如何处理上面提到的片段

首先,在onAttach方法中保存对上下文的引用(您可能仍然希望设置对活动的回调:

Context context;

@Override
public void onAttach(Activity activity){
    super.onAttach(activity);

    context = activity;


} 
然后在onViewCreate中,进行测量并使用它们:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    Display display = ((WindowManager)
        context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
    DisplayMetrics metrics = new DisplayMetrics();
    display.getMetrics(metrics);

    float pixHeight = metrics.heightPixels;
    float pixWidth = metrics.widthPixels;
    float density  = context.getResources().getDisplayMetrics().density;
    float dpHeight = pixHeight / density;
    float dpWidth  = pixWidth / density;

    // make various layouts using your measurements, send the
    // measure of each parent to each custom drawn child, or 
    // send the bounds of each child as determined by the size of each parent

    return someView;
}

下面是如何处理上面提到的片段

首先,在onAttach方法中保存对上下文的引用(您可能仍然希望设置对活动的回调:

Context context;

@Override
public void onAttach(Activity activity){
    super.onAttach(activity);

    context = activity;


} 
然后在onViewCreate中,进行测量并使用它们:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    Display display = ((WindowManager)
        context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
    DisplayMetrics metrics = new DisplayMetrics();
    display.getMetrics(metrics);

    float pixHeight = metrics.heightPixels;
    float pixWidth = metrics.widthPixels;
    float density  = context.getResources().getDisplayMetrics().density;
    float dpHeight = pixHeight / density;
    float dpWidth  = pixWidth / density;

    // make various layouts using your measurements, send the
    // measure of each parent to each custom drawn child, or 
    // send the bounds of each child as determined by the size of each parent

    return someView;
}

我已经成功地在onViewCreated中测量了片段中的屏幕。因此,您可以用片段填充父对象,然后在片段中绘制布局。我已经成功地在onViewCreated中测量了片段中的屏幕。因此,您可以用片段填充父对象,然后在片段中绘制布局。我已经完成了这项工作从编程的角度来说,除了将LayoutParams中的高度设置为0dp之外,我还必须尝试一下,然后再与您联系,因为这只是调整自由空间,而不是总空间。这通常是创建基于百分比展开的布局的方式。哇。所以,差异恰恰是我需要将高度设置为0,versus wrap_内容。谢谢!我已经通过编程完成了这项工作,而不是将LayoutParams中的高度设置为0dp。我必须尝试一下,然后再与您联系,因为这只是调整可用空间,而不是总空间。这通常是您创建基于百分比展开的布局的方式。哇。因此,差异是exa很明显,我需要将高度设置为0,而不是wrap_内容。谢谢!谢谢你的回答!我必须尝试所有方法,看看什么表现最好,因为在很短的时间内有很多绘图要做。在其中一种方法中通过测量可能是一个好主意:这是一个很好的参考,但是会降低性能,因为它是一个
对象
子类,而不是原始数据类型。我只需要传递一个高度参数,但感谢您提供的链接!:)当我进行自定义绘制时,我会将边界发送给每个需要绘制自身的子类(我使用的对象比RectF更轻).你确定你没有过早优化吗?如果你真的很担心