How to add views to a custom view?

I have such a class, and there are about 10 of them

public class DataItemPlainView extends View{ public DataItemPlainView(Context context) { super(context); // TODO Auto-generated constructor stub }} 

Now I need to place TextView, ImageView, etc. inside this view. And when I call it from somewhere, I want to get my customView. setting a view for a custom layout is also relevant.

thanks

+9
source share
3 answers

In your custom view, you need to extend the ViewGroup or one of the other classes that extends the ViewGroup . For example, you can switch from RelativeLayout or LinearLayout if these layouts match what your custom view needs to do.

Remember that even layout classes are another View . They just have methods for adding other representations as children and for their recursive dimension and drawing.

+8
source

I would try to expand some kind of layout. Remember that (for the most part) they are also considered as Views. For more information / decisions about which layout to choose, try looking here:

http://developer.android.com/guide/topics/ui/layout-objects.html

+1
source

It is wrong to use margin to achieve absolute positioning. This will not increase if you ever need fields.

Steal the code from Android, change it, and then use your "non-deprecated" absolute layout.

AbsoluteLayout is deprecated because they do not want to support it, and not because it does not work.

Screw this, their layouts do not do what we need, so what do they recommend? custom view.

So here (refactoring, without style support (puke)):

 /* * Copyright (C) 2006 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.RemoteViews.RemoteView; /** * A layout that lets you specify exact locations (x/y coordinates) of its * children. Absolute layouts are less flexible and harder to maintain than * other types of layouts without absolute positioning. * */ @RemoteView public class DCAbsoluteLayout extends ViewGroup { int mPaddingLeft, mPaddingRight, mPaddingTop, mPaddingBottom; public DCAbsoluteLayout(Context context) { super(context); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int count = getChildCount(); int maxHeight = 0; int maxWidth = 0; // Find out how big everyone wants to be measureChildren(widthMeasureSpec, heightMeasureSpec); // Find rightmost and bottom-most child for (int i = 0; i < count; i++) { View child = getChildAt(i); if (child.getVisibility() != GONE) { int childRight; int childBottom; DCAbsoluteLayout.LayoutParams lp = (DCAbsoluteLayout.LayoutParams) child.getLayoutParams(); childRight = lp.x + child.getMeasuredWidth(); childBottom = lp.y + child.getMeasuredHeight(); maxWidth = Math.max(maxWidth, childRight); maxHeight = Math.max(maxHeight, childBottom); } } // Account for padding too maxWidth += mPaddingLeft + mPaddingRight; maxHeight += mPaddingTop + mPaddingBottom; // Check against minimum height and width maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight()); maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth()); setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, 0), resolveSizeAndState(maxHeight, heightMeasureSpec, 0)); } /** * Returns a set of layout parameters with a width of * {@link ViewGroup.LayoutParams#WRAP_CONTENT}, * a height of {@link ViewGroup.LayoutParams#WRAP_CONTENT} * and with the coordinates (0, 0). */ @Override protected ViewGroup.LayoutParams generateDefaultLayoutParams() { return new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 0, 0); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { int count = getChildCount(); for (int i = 0; i < count; i++) { View child = getChildAt(i); if (child.getVisibility() != GONE) { DCAbsoluteLayout.LayoutParams lp = (DCAbsoluteLayout.LayoutParams) child.getLayoutParams(); int childLeft = mPaddingLeft + lp.x; int childTop = mPaddingTop + lp.y; child.layout(childLeft, childTop, childLeft + child.getMeasuredWidth(), childTop + child.getMeasuredHeight()); } } } // Override to allow type-checking of LayoutParams. @Override protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { return p instanceof DCAbsoluteLayout.LayoutParams; } @Override protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { return new LayoutParams(p); } @Override public boolean shouldDelayChildPressedState() { return false; } public static class LayoutParams extends ViewGroup.LayoutParams { /** * The horizontal, or X, location of the child within the view group. */ public int x; /** * The vertical, or Y, location of the child within the view group. */ public int y; /** * Creates a new set of layout parameters with the specified width, * height and location. * * @param width the width, either {@link #MATCH_PARENT}, {@link #WRAP_CONTENT} or a fixed size in pixels * @param height the height, either {@link #MATCH_PARENT}, {@link #WRAP_CONTENT} or a fixed size in pixels * @param x the X location of the child * @param y the Y location of the child */ public LayoutParams(int width, int height, int x, int y) { super(width, height); this.x = x; this.y = y; } /** * {@inheritDoc} */ public LayoutParams(ViewGroup.LayoutParams source) { super(source); } } } 

In general, the Android user interface is a nightmare. Consider using web browsing for your entire project. As for working with the system, "everything is in order", but this interface is a train wreck.

HTML has always been an approach to styles and dynamic user interface content. Nothing beats it except the user interface (in terms of performance).

0
source

All Articles