Andy Res
Andy Res

Reputation: 16043

Creating a compound view from an XML layout

I'm trying to create a compound control from an XML layout. This is how I do it:

public class CustomButton extends LinearLayout {

    private TextView title;
    private TextView subTitle;

    public CustomButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomButton, 0, 0);

        String titleStr = a.getString(R.styleable.CustomButton_title);
        String subTitleStr = a.getString(R.styleable.CustomButton_subTitle);
        a.recycle();

        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.custom_button, this, true);

        title = (TextView)findViewById(R.id.title);
        title.setText(titleStr);

        subTitle = (TextView)findViewById(R.id.subtitle);
        subTitle.setText(subTitleStr);

        //invalidate();
        //requestLayout();
    }
}

If I run in debug mode I see that titleStr, and subTitleStr have the values that I predefined in the XML layout, so I can say for sure that the constructor is called. However the screen appears blank, it does not show anything and I don't have idea why is this so.

Would appreciate if you could help with this issue.

(FYI, I'm following this tutorial: http://www.vogella.com/articles/AndroidCustomViews/article.html)

Upvotes: 4

Views: 2115

Answers (2)

NaserShaikh
NaserShaikh

Reputation: 1576

i have created a Compound view which has several buttons and which is animated like Drawer. i have created xml file and inflate it in class. what is difference between your and mine code is inflating view.

here's my code for that.

 public class ViewDashboard  extends LinearLayout {
    private Button openCloseButton;
    private Button mBtnViewMyLoction, mBtnViewPhotos, mBtnViewFreeStuff, mBtnViewHotspot, mBtnViewMyTeams,
                   mBtnViewLeaderboard, mBtnViewLiveAction, mBtnViewHome, mBtnViewAppStats;
    private Context mContext;
    private boolean isVisible = false;
    private RelativeLayout relLayTwo;
    private int h;

    public ViewDashboard(Context context , AttributeSet attr) {
        super(context , attr);
        mContext = context;     

        DisplayMetrics metric = new DisplayMetrics();               
        ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(metric);
        h = metric.heightPixels;

        View.inflate(context, R.layout.dashboard_drawer, this);

        relLayTwo           =       (RelativeLayout) findViewById(R.id.relLayTwo);
        openCloseButton     =       (Button) findViewById(R.id.btnDashboard); 
        mBtnViewPhotos      =       (Button) findViewById(R.id.btnDrawerPhotos); 
        mBtnViewFreeStuff   =       (Button) findViewById(R.id.btnDrawerFreeStuff); 
        mBtnViewLeaderboard =       (Button) findViewById(R.id.btnDrawerLeaderboard); 
        mBtnViewLiveAction  =       (Button) findViewById(R.id.btnDrawerLiveAction);
        mBtnViewHome        =       (Button) findViewById(R.id.btnDrawerHome);
        mBtnViewAppStats    =       (Button) findViewById(R.id.btnDrawerAppStats);
        mBtnViewHotspot     =       (Button) findViewById(R.id.btnDrawerHotspot);
        mBtnViewMyTeams     =       (Button) findViewById(R.id.btnDrawerMyTeams);    
        View line           =       findViewById(R.id.line);


        RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) relLayTwo.getLayoutParams();
        Log.d("test", "height "+params.height);
        params.height = h*40/100;
        relLayTwo.setLayoutParams(params);
        relLayTwo.setVisibility(View.GONE);

        RelativeLayout.LayoutParams paramsLine = (RelativeLayout.LayoutParams) line.getLayoutParams();
        paramsLine.height = h*80/100;

        openCloseButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                LogMsg.d("USerID "+new UserID(mContext).getUserID());
                if (  new UserID(mContext).getUserID().equals("")){ 
                    ToastMsg.showToast(mContext, "Please Login First");
                }else{
                    toggle();
                }
            }
        });

       /* mBtnViewMyLoction.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                toggle();
                mContext.startActivity(new Intent(mContext, ActivityMyLocation.class).setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP).setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));

            }
        });*/

        mBtnViewHotspot.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                toggle();
                //mContext.startActivity(new Intent(mContext, ActivityHotspots.class).setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP).setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
                mContext.startActivity(new Intent(mContext, ActivityHotspots.class));
            }
        });

        mBtnViewMyTeams.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                toggle();
                //mContext.startActivity(new Intent(mContext, ActivityMyTeams.class).setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP).setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
                mContext.startActivity(new Intent(mContext, ActivityMyTeams.class));
            }
        });

        mBtnViewFreeStuff.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                toggle();
                //ToastMsg.showToast(mContext, "Not Available");
                //mContext.startActivity(new Intent(mContext, ActivityFreeStuff.class).setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP).setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
                mContext.startActivity(new Intent(mContext, ActivityFreeStuff.class));
            }
        });

        mBtnViewAppStats.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                toggle();
                //mContext.startActivity(new Intent(mContext, ActivityAppStats.class).setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP).setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
                mContext.startActivity(new Intent(mContext, ActivityAppStats.class));
            }
        });

        mBtnViewPhotos.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                toggle();
                //mContext.startActivity(new Intent(mContext, ActivityPhotos.class).setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP).setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
                mContext.startActivity(new Intent(mContext, ActivityPhotos.class));
            }
        });

        mBtnViewHome.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                toggle();
                mContext.startActivity(new Intent(mContext, ActivityHome.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
            }
        });

        mBtnViewLeaderboard.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                toggle();
                //mContext.startActivity(new Intent(mContext, ActivityLeaderborad.class).setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP).setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
                mContext.startActivity(new Intent(mContext, ActivityLeaderborad.class));
            }           
        });

        mBtnViewLiveAction.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                toggle();
                //mContext.startActivity(new Intent(mContext, ActivityLiveAction.class).setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP).setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
                mContext.startActivity(new Intent(mContext, ActivityLiveAction.class));
            }
        });



    }

    public void toggle() {
        TranslateAnimation anim = null;
        isVisible = !isVisible;

        if (isVisible) {
            relLayTwo.setVisibility(View.VISIBLE);
            anim = new TranslateAnimation(0.0f, 0.0f,  h*40/100, 0.0f);
            LogMsg.d(" rel Height "+relLayTwo.getHeight());
        } else {
            anim = new TranslateAnimation(0.0f, 0.0f, 0.0f, relLayTwo.getHeight());
            anim.setAnimationListener(collapseListener);
        }

        anim.setDuration(300);
        anim.setInterpolator(new AccelerateInterpolator(1.0f));
        startAnimation(anim);
    }

    Animation.AnimationListener collapseListener = new Animation.AnimationListener() {
        public void onAnimationEnd(Animation animation) {
            relLayTwo.setVisibility(View.GONE);
        }

        public void onAnimationRepeat(Animation animation) {
            // not needed
        }

        public void onAnimationStart(Animation animation) {
            // not needed
        }
    };

}

Upvotes: 2

Fred Medlin
Fred Medlin

Reputation: 850

Use all three View constructors to make sure that attribute initialization always occurs.

Eliminate the call to context.getTheme()

public class CustomButton extends LinearLayout {

    private TextView title;
    private TextView subTitle;

    public CustomButton(Context context) {
        this(context, null);
    }

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

    public CustomButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomButton);

        String titleStr = a.getString(R.styleable.CustomButton_title);
        String subTitleStr = a.getString(R.styleable.CustomButton_subTitle);

        LayoutInflater.from(context).inflate(R.layout.custom_button, this, true);
        title = (TextView)findViewById(R.id.title);
        title.setText(titleStr);

        subTitle = (TextView)findViewById(R.id.subtitle);
        subTitle.setText(subTitleStr);

        a.recycle();
    }
}

Upvotes: 1

Related Questions