Java 动态添加布局
我试图在RelativeLayout中动态添加框架布局,但出现以下错误: java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void android.widget.RelativeLayout.addView(android.view.view)” 在rl.addView(fl)期间发生Java 动态添加布局,java,android,xml,android-layout,Java,Android,Xml,Android Layout,我试图在RelativeLayout中动态添加框架布局,但出现以下错误: java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void android.widget.RelativeLayout.addView(android.view.view)” 在rl.addView(fl)期间发生 公共类启动页扩展AppCompating活动{ //暂时设置为1 整数计数=1; @凌驾 创建时的公共void(Bundle savedInstanceState){
公共类启动页扩展AppCompating活动{
//暂时设置为1
整数计数=1;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u开始页面);
RelativeLayout rl=(RelativeLayout)findViewById(R.id.main菜单);
FrameLayout.LayoutParams params=新的FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_父项,100,重力。水平中心|重力。垂直中心);
对于(int i=0;i
我的研究似乎得出这样的结论,为什么框架布局fl是空的?我知道LayoutFlater是一个选项,我曾短暂尝试过,但没有效果,但似乎许多人只是能够创建布局和视图,并以这种更简单的方式将它们添加到所需的父级
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:id="@+id/mainMenu"
tools:context="com.marcel.joseph.project.Main_Menu">
</RelativeLayout>
此外,是什么使布局为空?是缺少子项、未定义的属性还是其他原因
谢谢您需要先初始化框架布局。类似这样
// Initialize a new FrameLayout
FrameLayout fl = new FrameLayout(this);
然后可以为FrameLayout创建布局参数
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 100, Gravity.CENTER_HORIZONTAL| Gravity.CENTER_VERTICAL);
有一件事我不清楚为什么您的xml文件名是mainMenu?您是否尝试使用菜单资源文件?检查以下代码:-我认为您没有将layout prams设置为Textview,因为它会产生错误
public class StartingPage extends AppCompatActivity {
//set to 1 temporarily
int count = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_starting_page);
RelativeLayout rl = (RelativeLayout) findViewById(R.id.mainMenu);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 100, Gravity.CENTER_HORIZONTAL| Gravity.CENTER_VERTICAL);
for(int i=0; i < count; i++){
FrameLayout fl = new FrameLayout(this);
fl.setLayoutParams(params);
TextView item = new TextView(this);
RelativeLayout.LayoutParams objParams=new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);
item.setLayoutParams(objParams);
item.setText("test");
fl.addView(item);
rl.addView(fl);
}
}
}
公共类启动页扩展AppCompating活动{
//暂时设置为1
整数计数=1;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u开始页面);
RelativeLayout rl=(RelativeLayout)findViewById(R.id.main菜单);
FrameLayout.LayoutParams params=新的FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_父项,100,重力。水平中心|重力。垂直中心);
对于(int i=0;i
希望它能帮助您。如果代码中有任何错误,请告诉我。检查您的
RelativeLayout rl=(RelativeLayout)findViewById(R.id.main菜单)代码>行。我怀疑对RelativeLayout
的引用为空。也发布XML以进行验证。您的RelativeLayout
是否实际被称为R.id.main菜单
?在调用findViewById()
之前,您是否对布局进行了膨胀?我添加了XML,相对布局的ID是mainMenu。但是,在调用findviewbyd()之前,我没有膨胀布局。这在任何情况下都是必要的吗?请将整个代码放在活动的onCreate()方法中,因为您似乎没有正确调用相对布局,相对布局的实例为空来回答您的问题,是什么使版面为空?
是因为无法找到所附版面上的视图。用户提供的上下文是活动的上下文,提供应用程序的上下文如何使初始化有所不同?我正在以类似的方式初始化FrameLayout,我使用“this”作为上下文。据我所知,这应该足够了。但是不,我没有使用菜单资源文件,我只是在自学,所以命名时没有考虑任何明确的功能。
public class StartingPage extends AppCompatActivity {
//set to 1 temporarily
int count = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_starting_page);
RelativeLayout rl = (RelativeLayout) findViewById(R.id.mainMenu);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 100, Gravity.CENTER_HORIZONTAL| Gravity.CENTER_VERTICAL);
for(int i=0; i < count; i++){
FrameLayout fl = new FrameLayout(this);
fl.setLayoutParams(params);
TextView item = new TextView(this);
RelativeLayout.LayoutParams objParams=new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);
item.setLayoutParams(objParams);
item.setText("test");
fl.addView(item);
rl.addView(fl);
}
}
}