Android 添加时视图不可见 layout_weight
Android view not visible when adding layout_weight
我正在尝试在一个线性布局中使用四个线性布局将我的屏幕分成不同的尺寸。当我向我的项目添加权重时,它在屏幕上显示布局在布局预览中被分成 4 个偶数部分。但是当我 运行 设备或模拟器上的应用程序时,不会显示视图。但是当我删除权重属性时,视图就会显示出来。
我使用了成功使用权重 属性 但不适用于我的程序的代码示例。我还以编程方式获取了代码中所有子视图的宽度和高度。它们不是空的,所以它们在那里但只是不可见。我试过添加 visibility = true 和 focusable = true 之类的属性,但无济于事。我使用此代码向视图添加了一个 drawView
DrawView drawView = new DrawView();
ViewGroup mainLayout = (ViewGroup) findViewById(R.id.main);
mainLayout.addView(drawView);
DrawView 是一个扩展 View 的 class,我调用方法 canvas.drawLine() 和 canvas.drawText() 来绘制到屏幕上
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:weightSum="4">
<LinearLayout
android:visibility="visible"
android:focusable="true"
android:id="@+id/l1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="@color/colorAccent"
android:orientation="horizontal"></LinearLayout>
<LinearLayout
android:visibility="visible"
android:id="@+id/l2"
android:orientation="horizontal"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="@color/colorBtnText"></LinearLayout>
<LinearLayout
android:id="@+id/l3"
android:orientation="horizontal"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="@color/colorBtnBackground"></LinearLayout>
<LinearLayout
android:id="@+id/l4"
android:orientation="horizontal"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="@color/colorLbl"></LinearLayout>
</LinearLayout>
以上我试过的都没有用。我在这方面花了很多时间,非常感谢您的反馈。
我认为 DrawView
需要 setLayoutParams(LinearLayout.LayoutParams)
在添加到 LinearLayout 之前,通过 LayoutParams 设置固定的高度或重量。如果不这样做,DrawView
高度为 MATCH_PARENT
,这将使其他视图的高度为 0。
你可以试试这个:
DrawView drawView = new DrawView();
LinearLayout mainLayout = (LinearLayout) findViewById(R.id.main);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,0, 1); // or new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,100); to set fixed height
mainLayout.addView(drawView, params);
如果可行,我认为最好的方法是 DrawView
覆盖 onMeasure
方法,并自行计算高度。
如您所见,您在 xml 文件中将 "android:weightSum" 设置为 4。虽然它在主线性布局下仍然有 4 个孩子,但代码没有显示错误。但是,当您 运行 您的代码时,您以编程方式将另一个视图添加到您的主线性布局中,该视图超过了您的主布局的权重总和。
因此,我的建议是,您可以尝试从 xml 布局中删除 android:weightSum="4" 属性,这样它会根据权重自动计算布局大小。
我正在尝试在一个线性布局中使用四个线性布局将我的屏幕分成不同的尺寸。当我向我的项目添加权重时,它在屏幕上显示布局在布局预览中被分成 4 个偶数部分。但是当我 运行 设备或模拟器上的应用程序时,不会显示视图。但是当我删除权重属性时,视图就会显示出来。
我使用了成功使用权重 属性 但不适用于我的程序的代码示例。我还以编程方式获取了代码中所有子视图的宽度和高度。它们不是空的,所以它们在那里但只是不可见。我试过添加 visibility = true 和 focusable = true 之类的属性,但无济于事。我使用此代码向视图添加了一个 drawView
DrawView drawView = new DrawView();
ViewGroup mainLayout = (ViewGroup) findViewById(R.id.main);
mainLayout.addView(drawView);
DrawView 是一个扩展 View 的 class,我调用方法 canvas.drawLine() 和 canvas.drawText() 来绘制到屏幕上
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:weightSum="4">
<LinearLayout
android:visibility="visible"
android:focusable="true"
android:id="@+id/l1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="@color/colorAccent"
android:orientation="horizontal"></LinearLayout>
<LinearLayout
android:visibility="visible"
android:id="@+id/l2"
android:orientation="horizontal"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="@color/colorBtnText"></LinearLayout>
<LinearLayout
android:id="@+id/l3"
android:orientation="horizontal"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="@color/colorBtnBackground"></LinearLayout>
<LinearLayout
android:id="@+id/l4"
android:orientation="horizontal"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="@color/colorLbl"></LinearLayout>
</LinearLayout>
以上我试过的都没有用。我在这方面花了很多时间,非常感谢您的反馈。
我认为 DrawView
需要 setLayoutParams(LinearLayout.LayoutParams)
在添加到 LinearLayout 之前,通过 LayoutParams 设置固定的高度或重量。如果不这样做,DrawView
高度为 MATCH_PARENT
,这将使其他视图的高度为 0。
你可以试试这个:
DrawView drawView = new DrawView();
LinearLayout mainLayout = (LinearLayout) findViewById(R.id.main);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,0, 1); // or new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,100); to set fixed height
mainLayout.addView(drawView, params);
如果可行,我认为最好的方法是 DrawView
覆盖 onMeasure
方法,并自行计算高度。
如您所见,您在 xml 文件中将 "android:weightSum" 设置为 4。虽然它在主线性布局下仍然有 4 个孩子,但代码没有显示错误。但是,当您 运行 您的代码时,您以编程方式将另一个视图添加到您的主线性布局中,该视图超过了您的主布局的权重总和。
因此,我的建议是,您可以尝试从 xml 布局中删除 android:weightSum="4" 属性,这样它会根据权重自动计算布局大小。