Search code examples
androidandroid-linearlayoutandroid-layout-weight

Android view not visible when adding layout_weight


I'm trying to split my screen into different sizes using four Linear layouts within a linear layout. When I add weights to my project, it shows on the screen that the layout is split into 4 even parts on the layout preview. But when I run the app on a device or emulator, the views are not shown. But when I remove the weight attributes, the views are shown.

I've used code samples which successfully used the weight property but don't work on my program. I've also programmatically got the width and height of all the sub-views on the code. They are not null so they are there but just not visible. I've tried adding properties like visibility = true and focusable = true but to no avail. I've added a drawView to the view using this code

DrawView drawView = new DrawView();
ViewGroup mainLayout = (ViewGroup) findViewById(R.id.main);
mainLayout.addView(drawView);

DrawView is a class that extends View and I call the methods canvas.drawLine() and canvas.drawText() to draw to the screen


<?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>

Nothing I tried above worked. I've spent quite a bit of time on this and would really appreciate some feedback.


Solution

  • I think the DrawView need setLayoutParams(LinearLayout.LayoutParams) before add to LinearLayout, set fixed height or weight by LayoutParams. if you don't, DrawView height is MATCH_PARENT, that will make other view's height is 0.

    you can try this:

    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);
    

    If it work, i think the best way is DrawView override onMeasure method, and calculate height itself.