2013-08-29 58 views
3

我在活动programmaticaly中创建按钮,而不是在xml文件中。然后,我想在此链接中设置LayoutParams:How to programmatically set the layout_align_parent_right attribute of a Button in Relative Layout?空指针异常设置LayoutParams

但是,当我尝试启动时,出现异常。

这里是我的代码:

RelativeLayout ll2 = new RelativeLayout(this); 
    //ll2.setOrientation(LinearLayout.HORIZONTAL); 

    ImageButton go = new ImageButton(this); 
    go.setId(cursor.getInt(cursor.getColumnIndex("_id"))); 
    go.setClickable(true); 
    go.setBackgroundResource(R.drawable.go); 
    RelativeLayout.LayoutParams params1 = (RelativeLayout.LayoutParams)go.getLayoutParams(); 
    params1.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); // LogCat said I have Null Pointer Exception in this line 
    go.setLayoutParams(params1); 
    go.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent i3 = new Intent(RecipesActivity.this, MedicineActivity.class); 
      i3.putExtra(ShowRecipe, v.getId()); 
      i3.putExtra("Activity", "RecipesActivity"); 
      RecipesActivity.this.startActivity(i3); 
     } 
    }); 
    ll2.addView(go); 

为什么我的应用程序抛出一个异常?谢谢。

+0

大概LogCat行上面的那一行指向空指针会变为null,但是为了帮助您更好地更新发布错误的问题。 – groff07

回答

14

更改此:

RelativeLayout.LayoutParams params1 = (RelativeLayout.LayoutParams)go.getLayoutParams(); 
params1.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
go.setLayoutParams(params1); 

为:

RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 
params1.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
go.setLayoutParams(params1); 

当您创建一个视图编程它没有任何的LayoutParams,这就是为什么你得到NullPointerException异常。如果您从XML扩充视图,现在将使用LayoutParams显示视图。

+0

'LayoutParams.MATCH_PARENT'需要设置为'RelativeLayoutParams.MATCH_PARENT',因为'LayoutParams'有多种类型 – anurupr

1

从我所看到的,它看起来像

go.getLayoutParams() 

回报null在这一行

RelativeLayout.LayoutParams params1 = (RelativeLayout.LayoutParams)go.getLayoutParams(); 

,因为你自己也没有LayoutParams集。这显然让params1null等你拿NPE这里

params1.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 

当您尝试它(addRule(RelativeLayout.ALIGN_PARENT_RIGHT)

getLayoutParams()是对于已经设置params一个View运行的方法。所以,你需要尝试get他们使用另一个View

0

此方法可能返回null如果这种观点是不附加到父ViewGroup中或{@link #setLayoutParams(android.view之前设置他们go .ViewGroup.LayoutParams)}未被成功调用。当View被附加到父ViewGroup时,该方法不能返回null。

getLayoutParams()在View.java注释,是programly创建您的ImageButton并没有连接到当你调用该方法的父ViewGroup中,所以它返回null。