我正在尝试从XML布局创建复合控件。 我就是这样做的:
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();
}
}
如果我在调试模式下运行,我看到titleStr
和subTitleStr
具有我在XML布局中预定义的值,所以我可以肯定地说,构造函数被调用了。然而,屏幕显示为空白,它没有显示任何内容,我不知道为什么会这样。
如果您能帮助解决这个问题,我们将不胜感激。
(仅供参考,我正在学习本教程:http://www.vogella.com/articles/AndroidCustomViews/article.html)
答案 0 :(得分:2)
我创建了一个复合视图,它有几个按钮,像Drawer一样动画。 我已经创建了xml文件并在课堂上给它充气。你和我的代码之间的区别在于膨胀视图。
这是我的代码。
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
}
};
}
答案 1 :(得分:1)
使用所有三个View构造函数来确保始终发生属性初始化。
取消对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();
}
}