ColonD
ColonD

Reputation: 1034

cannot dynamically add views android

I'm trying to implement a custom view with textview children added dynamically. But it isn't showing any result. there are no error, just nothing shows up:

My Class:

public class CustomPasscodeEntryView extends LinearLayout {

private Context mContext;
private CustomPasscodeEntryView thisView;

public CustomPasscodeEntryView(Context context) {
    super(context);
    /* same as below */
}

public CustomPasscodeEntryView(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    /*same as below*/
}

public CustomPasscodeEntryView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    mContext = context;
    LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    thisView = (CustomPasscodeEntryView) inflater.inflate(R.layout.view_passcode_entry,this);

}

public void addDigit(int digit){
    LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    final pinView pin = (pinView) inflater.inflate(R.layout.password_bullet_view,null);
    pin.setDigit(digit);
    thisView.addView(pin, thisView.getChildCount());
    pin.setVisibility(VISIBLE);


}
public void deleteDigit(){
    if(getChildCount() > 0)
        thisView.removeView(thisView.getChildAt(getChildCount()-1));
}


}

class pinView extends TextView {

int digit;

public pinView(Context context) {
    super(context);
}

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

public pinView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    setText('•');
}

public void setDigit(int digit) {
    this.digit = digit;
    this.setText(Integer.toString(digit));
}
}

and my XMLs: view_passcode_entry:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:animateLayoutChanges="true">
</LinearLayout>

password_bullet_view:

  <com.github.lockpin.lollipin.lib.views.pinView
xmlns:android="http://schemas.android.com/apk/res/android"
android:textColor="@android:color/white"
android:text="•"
android:textSize="20sp"
android:gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2.5dp"
/>

EDIT: the view in my activity:

    <com.github.lockpin.lollipin.lib.views.CustomPasscodeEntryView
        android:id="@+id/custom_passcode_entry_view"
        android:layout_width="300dp"
        android:layout_below="@id/pin_code_text_view"
        android:layout_centerHorizontal="true"
        android:layout_height="40dp"/>

I cant see what's wrong, and I've followed tutorials online and made a few changes. Am I missing something here? Or is this plainly wrong?

Upvotes: 0

Views: 97

Answers (2)

Zamrony P. Juhara
Zamrony P. Juhara

Reputation: 5262

You use wrong view id view_passcode_entry when inflating view, which is instance of LinearLayout, and typecast it to CustomPasscodeEntryView.

You only need to use this when call addView() in addDigit() because CustomPasscodeEntryView is also instance of LinearLayout. So layout view_passcode_entry can be removed because it is not needed anymore.

this.addView(pin, this.getChildCount());

But if you want to add view view_passcode_entry as child of CustomPasscodeEntryView instance then you need to add thisView also

private ViewGroup thisView;
...
thisView = (ViewGroup) inflater.inflate(R.layout.view_passcode_entry, this);
this.addView(thisView, 0);

and then if you want to use view_passcode_entry as parent of pinView then you can use

 thisView.addView(pin, thisView.getChildCount());

Upvotes: 1

Is it because of you have already mentioned the height of CustomPasscodeEntryView in the xml (android:layout_height="40dp")?

Can you try wrap_content instead?

Upvotes: 0

Related Questions