尝试动态添加组件时的NullPointErexception(android)

时间:2014-04-22 18:25:43

标签: android android-layout dynamic android-fragments android-view

有很多教程和答案,但没有一个对我有用,最近在android sdk中做了一些改变,使这些样本不正确或者我犯了一个愚蠢的错误......?

我正在尝试动态添加ViewText组件,具体取决于是否启用了蓝牙。

这里是MainActivityClass的on create方法:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment())
                    .commit();
        }

        TextView BAMessage = new TextView(this);
        BAMessage.setText("Bluetooth is disabled.");
        LinearLayout ll = (LinearLayout)findViewById(R.id.activity_main);
        LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        ll.addView(BAMessage, lp);
    }

如果我评论最后3行应用程序没有崩溃,所以我很确定问题是这3行。我不太了解findViewById是如何工作的,因为我看到的至少20个代码示例中只有一个实际显示了" activity_main"来自,并且它无论如何都不起作用。是" activity_main"应该是fragment_main.xml根元素中的id?如果我想动态创建所有元素怎么办?

这是我的fragment_main.xml文件内容:

<?xml version="1.0" encoding="utf-8"?>
<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:orientation="horizontal"
    android:id="@+id/activity_main">

    <TextView android:id="@+id/app_info_message"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="@string/app_info_message" />

    <EditText android:id="@+id/edit_message"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:hint="@string/edit_message" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/button_send"
        android:onClick="sendMessage" />
</LinearLayout>

堆栈追踪:

  04-22 20:06:20.127: D/AndroidRuntime(5306): Shutting down VM
    04-22 20:06:20.127: W/dalvikvm(5306): threadid=1: thread exiting with uncaught exception (group=0x41ce6d88)
    04-22 20:06:20.127: E/AndroidRuntime(5306): FATAL EXCEPTION: main
    04-22 20:06:20.127: E/AndroidRuntime(5306): Process: com.dominicm.multilight, PID: 5306
    04-22 20:06:20.127: E/AndroidRuntime(5306): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.dominicm.multilight/com.dominicm.multilight.MainActivity}: java.lang.NullPointerException
    04-22 20:06:20.127: E/AndroidRuntime(5306):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2248)
    04-22 20:06:20.127: E/AndroidRuntime(5306):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2298)
    04-22 20:06:20.127: E/AndroidRuntime(5306):     at android.app.ActivityThread.access$800(ActivityThread.java:144)
    04-22 20:06:20.127: E/AndroidRuntime(5306):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1246)
    04-22 20:06:20.127: E/AndroidRuntime(5306):     at android.os.Handler.dispatchMessage(Handler.java:102)
    04-22 20:06:20.127: E/AndroidRuntime(5306):     at android.os.Looper.loop(Looper.java:212)
    04-22 20:06:20.127: E/AndroidRuntime(5306):     at android.app.ActivityThread.main(ActivityThread.java:5151)
    04-22 20:06:20.127: E/AndroidRuntime(5306):     at java.lang.reflect.Method.invokeNative(Native Method)
    04-22 20:06:20.127: E/AndroidRuntime(5306):     at java.lang.reflect.Method.invoke(Method.java:515)
    04-22 20:06:20.127: E/AndroidRuntime(5306):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:877)
    04-22 20:06:20.127: E/AndroidRuntime(5306):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)
    04-22 20:06:20.127: E/AndroidRuntime(5306):     at dalvik.system.NativeStart.main(Native Method)
    04-22 20:06:20.127: E/AndroidRuntime(5306): Caused by: java.lang.NullPointerException
    04-22 20:06:20.127: E/AndroidRuntime(5306):     at com.dominicm.multilight.MainActivity.onCreate(MainActivity.java:39)
    04-22 20:06:20.127: E/AndroidRuntime(5306):     at android.app.Activity.performCreate(Activity.java:5231)
    04-22 20:06:20.127: E/AndroidRuntime(5306):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
    04-22 20:06:20.127: E/AndroidRuntime(5306):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2212)
    04-22 20:06:20.127: E/AndroidRuntime(5306):     ... 11 more

1 个答案:

答案 0 :(得分:1)

您正在活动布局中查找片段的视图。尝试将添加视图的代码移动到PlaceHolderFragment&#39; onCreateView()方法:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container, false);

        TextView BAMessage = new TextView(getActivity());
        BAMessage.setText("Bluetooth is disabled.");
        LinearLayout ll = (LinearLayout)rootView.findViewById(R.id.activity_main);
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);
        ll.addView(BAMessage, lp);
        return rootView;
    }