Java 动态添加布局

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){

我试图在RelativeLayout中动态添加框架布局,但出现以下错误:

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void android.widget.RelativeLayout.addView(android.view.view)”

在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
我的研究似乎得出这样的结论,为什么框架布局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);
            }
        }

        }