getView方法的null对象引用

时间:2017-11-25 18:07:30

标签: java android nullpointerexception

我知道这类错误已经得到解答。但我无法弄清楚错误的原因。我想要完成的是通过主要活动中的按钮单击动态地将按钮添加到片段中。请帮我。我是Android开发的新手,

public class MainActivity extends AppCompatActivity {

Button add;
Fragment f;
LinearLayout ll;
View v;

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    add = (Button) findViewById(R.id.addButton);

    add.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            f = (ButtonFragment) getFragmentManager().findFragmentById(R.id.buttonLayout);
            //if (f != null) {
                v = f.getView();
                ll = (LinearLayout) v.findViewById(R.id.buttonLayout);
                Button dummy = new Button(v.getContext());
                LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(70, 70);
                dummy.setLayoutParams(layoutParams);
                ll.addView(dummy);
            //} else {
              //  System.out.println("View is null");
            //}

        }
    });
}


}

这是片段类

public class ButtonFragment extends Fragment {


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_button, container, false);
    return rootView;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
   System.out.println("View created");
}
}

这是错误代码

  

11-25 23:15:15.442 987-987 / com.example.nekib.dynamiclayoutdemo   E / AndroidRuntime:致命异常:主要                                                                                    处理:com.example.nekib.dynamiclayoutdemo,PID:987                                                                                    java.lang.NullPointerException:尝试调用虚方法   ' android.view.View android.app.Fragment.getView()'在null对象上   参考                                                                                        在   com.example.nekib.dynamiclayoutdemo.MainActivity $ 1.onClick(MainActivity.java:33)                                                                                        在android.view.View.performClick(View.java:4780)                                                                                        在android.view.View $ PerformClick.run(View.java:19866)                                                                                        在android.os.Handler.handleCallback(Handler.java:739)                                                                                        在android.os.Handler.dispatchMessage(Handler.java:95)                                                                                        在android.os.Looper.loop(Looper.java:135)                                                                                        在android.app.ActivityThread.main(ActivityThread.java:5254)                                                                                        at java.lang.reflect.Method.invoke(Native Method)                                                                                        在java.lang.reflect.Method.invoke(Method.java:372)                                                                                        在   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:903)                                                                                        在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

2 个答案:

答案 0 :(得分:1)

您正在查找从未启动过的片段。你只是找到它并获得它的观点。从未创建片段,因此它具有空视图。

顺便说一句,更换片段的方法如下:

FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
Fragment fragment = new FragmentProfile();
ft.replace(R.id.main_frame_container, fragment, fragmentName.toString());
ft.commit();

此处main_frame_container在“活动”的布局中为FrameLayout

使用此方法替换或添加视图上的片段。

答案 1 :(得分:-2)

第一个R.id.buttonLayout不能同时是片段中的片段ID和LinearLayout

更重要的是,如果您正在使用支持片段类,则需要使用getSupportFragmentManager()。看看你的import android.support.v4.app.Fragment

除此之外,您可能不应该在活动中使用按钮来控制片段布局