动态添加布局

时间:2016-11-22 04:03:51

标签: java android xml android-layout

我试图在RelativeLayout中动态添加FrameLayouts但是收到以下错误:

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

发生在rl.addView(fl)

期间
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);
       fl.addView(item);

       rl.addView(fl);
    }
}

}

我的研究似乎得出结论,这可行,为什么FrameLayout fl为null?我知道LayoutInflater是一个选项,我曾经简单地尝试过无效,但似乎很多人只是能够创建布局和视图,并以这种更简单的方式将它们添加到所需的父级。

<?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>

此外,什么使布局为null?是缺少孩子,未定义的属性还是其他什么?

由于

2 个答案:

答案 0 :(得分:1)

使用以下代码检查: - 我认为您没有将布局设置为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);
            }
        }

        }

希望它可以帮助你。让我知道代码是否有任何错误。

答案 1 :(得分:0)

你需要首先初始化你的FrameLayout。像这样的东西

// 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?你试图使用菜单资源文件吗?