Create a composite view from an XML layout

I am trying to create a composite control from an XML layout. Here 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 values ​​that I predefined in the XML layout, so I can say for sure that the constructor is called. However, the screen looks blank, it does not show anything, and I have no idea why this is so.

I would be grateful if you could help with this problem.

(FYI, I follow this guide: http://www.vogella.com/articles/AndroidCustomViews/article.html )

+4
source share
2 answers

Use all three View constructors to ensure that attribute initialization is always encountered.

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(); } } 
+1
source

I created a Compound view that has several buttons and that animates like Drawer. I created an xml file and inflated it in a class. the difference between your and my code is bloating.

here is my code for this.

  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 } }; } 
+2
source

Source: https://habr.com/ru/post/1481168/


All Articles