Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android: How to dynamically add a "Custom View" into a linear layout

I am a newer on building up Android application. I want to add a new "custom view", which is composed of buttons and imageView, when i click the button in the MainActivity. I have followed some of the website list below to build a custom view.

javatechig developer.android.com

They work perfect. However, if i want to dynamically add a custom view with

 sView sview = new sView(MainActivity.this);

nothing happen later on...

Or if I want to new a custom view by

sView sview = new sView(MainActivity.this, attrs); 

Where can i find and set the attrs????

Here is my Code, in the MainActivity,

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    myDraw = (RelativeLayout) findViewById(R.id.myDraw);
    btnAddRect = (Button) findViewById(R.id.btnAdd);

    mfView = (sView) findViewById(R.id.draw);
    btnAdd.setOnClickListener(new OnClickListener() {       

        @Override
        public void onClick(View v) {
            SingleFingerView sFingerView = new sView(MainActivity.this);
            myDraw.addView(sFingerView);
        }
    });
}

in the Custom View,

public class sView extends LinearLayout{

public sView(Context context) {
    this(context, null, 0);
}

public sView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

public sView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    this._1dp = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, context.getResources().getDisplayMetrics());
    this.parseAttr(context, attrs);
    View mRoot = View.inflate(context, R.layout.test_image_view, null);
    addView(mRoot, -1, -1);
    mView = (ImageView) mRoot.findViewById(R.id.view);
    mPushView = (ImageView) mRoot.findViewById(R.id.pview);
    mFirmView = (ImageView) mRoot.findViewById(R.id.fview);
    mRemoveView = (ImageView) mRoot.findViewById(R.id.rview);
}

private void parseAttr(Context context, AttributeSet attrs) {    
if (attrs == null)  return;
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.sView);
    if (a != null) {
        int n = a.getIndexCount();
        for (int i = 0; i < n; i++) {
            int attr = a.getIndex(i);

            if (attr == R.styleable.sView_centerInParent) {
                this.mCenterInParent = a.getBoolean(attr, true);
            }  ...
              with some attributes set setting
        }
    }
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    setParamsForView(widthMeasureSpec, heightMeasureSpec); // some params are set here
}

and the xml file main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:pushtouch="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
    android:id="@+id/tv_touch"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="abc"
    android:singleLine="false" 
    />
    <Button
        android:id="@+id/btnAdd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:text="ADD IMAGE" />
<RelativeLayout
    android:id="@+id/myDraw"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

<com.example.sView
        android:id="@+id/draw"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        pushtouch:centerInParent="true"

        pushtouch:image="@drawable/image"
        pushtouch:image_width="120dp"
        pushtouch:image_height="100dp"

        pushtouch:push_image="@drawable/p_btn"
        pushtouch:push_image_width="50dp"
        pushtouch:push_image_height="50dp"

        pushtouch:firm_image="@drawable/ok"
        pushtouch:firm_image_width="50dp"
        pushtouch:firm_image_height="50dp"

        pushtouch:remove_image="@drawable/remove"
        pushtouch:remove_image_width="50dp"
        pushtouch:remove_image_height="50dp"

        android:scaleType="centerInside"
        android:layout_alignLeft="@id/result"
        android:layout_alignTop="@id/result"
        android:layout_alignRight="@id/result"
        android:layout_alignBottom="@id/result"
        />
</RelativeLayout>
</LinearLayout>

and corresponding view t_view.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
         android:id="@+id/drawLayout"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent">
<ImageView
        android:id="@+id/view"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:focusableInTouchMode="true"
        android:focusable="true"/>
<ImageView
        android:id="@+id/push_view"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:clickable="true"
        android:focusable="true"
        android:focusableInTouchMode="true"
        />
<ImageView
        android:id="@+id/firm_view"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:clickable="true"
        android:focusable="true"
        android:focusableInTouchMode="true"
        />
<ImageView
        android:id="@+id/remove_view"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:clickable="true"
        android:focusable="true"
        android:focusableInTouchMode="true"
        />
</FrameLayout>
like image 317
Anthony Avatar asked Sep 28 '15 09:09

Anthony


People also ask

Is this possible to add views in a layout dynamically in Android?

You may have to adjust the index where you want to insert the view. Additionally, set the LayoutParams according to how you would like it to fit in the parent view. e.g. with FILL_PARENT , or MATCH_PARENT , etc. it's where ever you want to put the dynamically generated layout in your main view.

Is linear layout a view?

LinearLayout is a view group that aligns all children in a single direction, vertically or horizontally. You can specify the layout direction with the android:orientation attribute. Note: For better performance and tooling support, you should instead build your layout with ConstraintLayout.


1 Answers

Use the LayoutInflator to create a view based on your layout template, and then inject it into the view where you need it.

LayoutInflater vi = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = vi.inflate(R.layout.your_layout, null);

// fill in any details dynamically here
TextView textView = (TextView) v.findViewById(R.id.a_text_view);
textView.setText("your text");

// insert into main view
ViewGroup insertPoint = (ViewGroup) findViewById(R.id.insert_point);
insertPoint.addView(v, 0, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));

You may have to adjust the index where you want to insert the view.

Source : Android - Dynamically Add Views into View

like image 144
KishuDroid Avatar answered Oct 11 '22 19:10

KishuDroid