从XML布局创建复合视图

时间:2013-05-16 12:21:08

标签: android

我正在尝试从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();
    }
}

如果我在调试模式下运行,我看到titleStrsubTitleStr具有我在XML布局中预定义的值,所以我可以肯定地说,构造函数被调用了。然而,屏幕显示为空白,它没有显示任何内容,我不知道为什么会这样。

如果您能帮助解决这个问题,我们将不胜感激。

(仅供参考,我正在学习本教程:http://www.vogella.com/articles/AndroidCustomViews/article.html

2 个答案:

答案 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();
    }
}