Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to put a custom view inside of a custom viewGroup / Layout

custom view inside of a custom viewGroup not visible, how can I get it to show up? or is there a better way to do this that would work?

no compile or runtime errors but the view does not show up in the viewGroup, it is supposed to fill the area with color like the other views but it is white and the color for the view is not showing up inside of the CustomLayout

xml code, the first 2 views show up with no problems but the 3rd view that is nested inside of the CustomLayout does not show up, just white color area, the view inside not visible

CustomViewOne is a separate class file, CustomViewTwo and CustomViewThree are both nested inside the MainActivity class as static inner classes, and CustomLayout is a separate file

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >

<com.example.customviewexample.CustomViewOne
    android:layout_width="100dp"
    android:layout_height="50dp" />

<view 
    class="com.example.customviewexample.MainActivity$CustomViewTwo"
    android:layout_width="100dp"
    android:layout_height="50dp" />

<com.example.customviewexample.CustomLayout
    android:layout_width="100dp"
    android:layout_height="50dp">

    <view 
        class="com.example.customviewexample.MainActivity$CustomViewThree"
           android:layout_width="match_parent"
           android:layout_height="match_parent" />

</com.example.customviewexample.CustomLayout>

</LinearLayout>

here is the code for the CustomViewThree, vary simple like the other custom Views it just fills the area with color, it is nested inside of the MainActivity so you have to use MainActivity$CustomViewThree to access it.

public static class CustomViewThree extends View {

public CustomViewThree(Context context) {
    super(context);

}

public CustomViewThree(Context context, AttributeSet attrs) {
    super(context, attrs);

}

public CustomViewThree(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);

}

@Override
protected void onDraw(Canvas canvas) {

    super.onDraw(canvas);

    canvas.drawColor(Color.GREEN);
}

}

and here is the code for the CustomLayout class

public class CustomLayout extends FrameLayout {

public CustomLayout(Context context) {
    super(context);
   init(context);
}

public CustomLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
   init(context);
}

public CustomLayout(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
   init(context);
}

public void init(Context context) {

}

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {

}

}
like image 355
Kevik Avatar asked Oct 02 '22 11:10

Kevik


1 Answers

custom view inside of a custom viewGroup not visible, how can I get it to show up?

Your parent CustomLayout which wraps the child has a empty onLayout() method which makes the child to not appear. This method is important in a ViewGroup because it's used by the widget to place its children in it. So, you need to provide an implementation for this method to place the children(by calling the layout() method on each of them with the proper positions). As CustomLayout extends FrameLayout you could just call the super method to use FrameLayout's implementation or even better remove the overridden method(is there a reason for implementing it?).

like image 158
user Avatar answered Oct 17 '22 13:10

user