Reputation: 16043
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
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
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