我在programmaticaly活动中创建了按钮,而不是在xml文件中。然后我想在这个链接中设置LayoutParams:How to programmatically set the layout_align_parent_right attribute of a Button in Relative Layout?
但是当我尝试发布时,我有一个例外。
这是我的代码:
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 :(得分:18)
改变这个:
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);
以编程方式创建View时,它没有任何LayoutParams,这就是您获得NullPointerException的原因。如果从XML中扩展视图,那么现在将使用LayoutParams来显示视图。
答案 1 :(得分:1)
从我看来,它看起来像
go.getLayoutParams()
在此行中返回null
RelativeLayout.LayoutParams params1 = (RelativeLayout.LayoutParams)go.getLayoutParams();
因为您没有设置LayoutParams
。这显然会params1
null
,因此您可以NPE
params1.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
当您尝试在其上运行方法(addRule(RelativeLayout.ALIGN_PARENT_RIGHT)
)
getLayoutParams()
适用于已设置View
的{{1}}。因此,您需要先为params
设置它们,然后再尝试将go
用于其他get
答案 2 :(得分:1)
如果此View未附加到父ViewGroup或{@link #setLayoutParams(android.view.ViewGroup.LayoutParams)}未成功调用,则此方法可能返回null。当View附加到父ViewGroup时,此方法不能返回null。
根据View.java中getLayoutParams()
的注释,您的ImageButton是以编程方式创建的,并且在调用方法时不会附加到父ViewGroup,因此它返回null。