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>
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.
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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With