膨胀布局时的NPE

时间:2013-10-31 14:47:44

标签: android android-layout inflate

我必须在其他布局的子项(linearlayout)中设置布局。为此,我将此代码编写在我想要设置为根布局的布局活动中:

   protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    **setContentView(R.layout.main);**

    /**Define root layout's child where I want to set the layout*/
    LinearLayout inside_menu_view = (LinearLayout)findViewById(R.id.activitycontent);

    /**Inflate this layout and add it to the root layout*/
    LayoutInflater inflater = (LayoutInflater) getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View this_layout = inflater.inflate(R.layout.main, null);
    inside_menu_view.addView(this_layout);

但我在最后一行inside_menu_view.addView(this_layout);

获得了一个NULLPOINTEREXCEPTION

更新 - 在super.onCreate

之后添加了setContentView()

2 个答案:

答案 0 :(得分:0)

此行将返回null,因为您尚未调用setContentView()

 LinearLayout inside_menu_view = (LinearLayout)findViewById(R.id.activitycontent);

您需要先致电setContentView(R.layout.layout_with_activitycontent);

From the Docs

  

查找由onCreate(Bundle)中处理的XML中的id属性标识的视图。

     

返回视图(如果找到)或否则为null。

您尚未使用layout或使用setContentView()处理xml LayoutInflater文件,因此当您尝试return nullNPE会导致addView()findViewById()一样调用方法。

修改

我不确定你为什么这样做,但你做不到。与上面的链接一样,您只能使用View在充气layout内找到View。您无法使用它在其他未充气的其他layout内找到layout

setContentView()文件放在Fragments中,如果那是您要使用的文件。

不同方法 您可能希望使用<include>来实现此目的。

See the docs on how to use these

或者您可以使用layout添加要包含在所有Activities中的“菜单”Activities,然后在需要时可以切换layout显示<include>的内部部分。

See here about re-using layouts

layout的示例。您有一些main.xml要重复使用,比如Activity,然后在<RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="30dp" android:background="@drawable/blue"> <include layout="@layout/main" android:id="@+id/main_layout" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <!-- other layouts --> /<RelativeLayout> 中您要重复使用它,您只需执行类似

的操作
{{1}}
你的人显然会有所不同,但这是我所拥有的一个例子。希望这会有所帮助。

答案 1 :(得分:0)

假设你的R.layout.main是一个LinearLayout:

<LinearLayout 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:id="@+id/main_layout" >
</LinearLayout>

现在在onCreate():

LinearLayout layout = (LinearLayout) findViewById(R.id.main_layout);

LayoutInflater inflater = (LayoutInflater) getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View this_layout = inflater.inflate(R.layout.main_layout, layout, true);

并且this_layout会自动添加到活动的布局中。