android-自定义控件中的一些问题

呵呵  一直想坚持写自己的blog 可惜始终比较懒惰/迟迟不肯更新  

 最近一直在学习android。 成果不大吧。 主要没有什么java基础 。以前在学校学的j2ee ,出来工作之后做了.net 一年没碰也忘干净了。

  好了 言归正传 。今天写这个blog是记录一下android项目中一个bug. 

 由于有部分布局都是展示一个model的详细信息 ,出于重用的考虑 就把这部分做成了一个自定义控件 继承自LinearLayout

  1  public  class MealInfoDescLayout  extends LinearLayout {
  2      private Context mContext;
  3      private LayoutInflater inflater;
  4     
  5      private TextView tv_mealId;
  6      private TextView tv_mealTitle;
  7      private TextView tv_mealPrice;
  8      private ImageButton img_btn_add;
  9      private ImageButton img_btn_sub;
 10      private EditText et_mealCount; 
 11      private ImageButton img_btn_buy;
 12      /**
 13       * 應對不同的佈局文件(詳情页和列表页的item項)
 14        */
 15      private ImageView img_defImg;
 16      /**
 17       * 默认菜品数量
 18        */
 19      private   int mealcount=1;
 20     
 21      public MealInfoDescLayout(Context context){
 22          super(context);
 23          // inflater =LayoutInflater.from(context);
 24          mContext = context;
 25     }
 26      public MealInfoDescLayout(Context context, AttributeSet attrs) {
 27          super(context, attrs);
 28          // inflater =LayoutInflater.from(context);                
 29          mContext = context;        
 30     }
 31      /**
 32       * 推荐該构造函数  进行默认实例化
 33       *  @param  context
 34       *  @param  attrs
 35       *  @param  resId
 36       *  @param  imgId
 37        */
 38      public MealInfoDescLayout(Context context,AttributeSet attrs, int resId, int imgId){    
 39          super(context, attrs);
 40          // inflater = LayoutInflater.from(context);
 41          inflater =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);        
 42         
 43         mContext = context;        
 44         initView(resId, imgId);
 45     }
 46      private  void initView( int resId, int imgId){
 47          // 加載佈局文件
 48          inflater.inflate(resId,  this);
 49         Log.e( this.getClass().getName(), "Res:"+resId);
 50          // 加載固定佈局
 51          tv_mealId = (TextView)findViewById(R.id.tv_mealId);
 52         tv_mealPrice = (TextView)findViewById(R.id.tv_mealPrice);
 53         tv_mealTitle = (TextView)findViewById(R.id.tv_mealTitle);
 54         img_btn_add = (ImageButton)findViewById(R.id.img_btn_add);
 55         img_btn_sub = (ImageButton)findViewById(R.id.img_btn_sub);
 56         img_btn_buy = (ImageButton)findViewById(R.id.img_btn_buy);
 57         et_mealCount = (EditText)findViewById(R.id.et_mealCount);
 58          // 加載動態佈局
 59          img_defImg = (ImageView)findViewById(imgId);
 60     }
 61      public  void setViewValue(MealModel model)
 62     {
 63         tv_mealId.setText(model.meal_id);
 64         tv_mealPrice.setText("¥"+model.meal_price);
 65         tv_mealTitle.setText(model.meal_title);
 66         et_mealCount.setText(mealcount);    
 67         
 68     }
 69     @Override
 70      public  void draw(Canvas canvas) {
 71          //  TODO Auto-generated method stub
 72           super.draw(canvas);
 73     }
 74      /**
 75       * 添加默认添加按钮监听器
 76       *  @author  lip
 77       *
 78        */
 79       class addListener  implements OnClickListener{
 80 
 81          public  void onClick(View v) {            
 82             mealcount++;
 83             et_mealCount.setText("¥"+mealcount);
 84         }         
 85      } 
 86       /**
 87        * 添加默认删除按钮监听器
 88        *  @author  lip
 89        *
 90         */
 91       class subListener  implements OnClickListener{
 92 
 93          public  void onClick(View v) {            
 94              if(mealcount>0){
 95                 mealcount--;                
 96             }
 97             et_mealCount.setText(mealcount);
 98         }         
 99      }
100

      101 } 

好吧。 不太会用这个东西。。诶   接着说 。  其中 在主界面动态添加

 LinearLayout layout = (LinearLayout)findViewById(R.id.layout_main);

        descLayout =  new MealInfoDescLayout( thisnull, R.layout.meal_info_item, R.id.img_defImg);
        
        descLayout.setLayoutParams( new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
        
        layout.addView(descLayout);

这是主界面调用的代码

其中不太明白的是 

inflater = LayoutInflater.from(context);

inflater =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

 这两种写法  很不理解吖。 用第一个方法实例inflater之后  这个控件在界面就不显示了。

 

 后来又琢磨  既然别的控件可以用inflater实例 为什么自定义的就不可以呢 于是 就把MealInfoDescLayout类中的私有变量inflater删除掉 然后在调用的activity中 直接用MealInfoDescLayout.inflater()方法加载布局

MealInfoDescLayout.inflate(this, R.layout.meal_info_item, null);    但是发现这样子加载布局文件 依旧不能正常显示 很费解。。。

 

 有理解的高手 给解释解释。。

转载于:https://www.cnblogs.com/peng-li/archive/2012/02/29/2374752.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值