【问题标题】:Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference [duplicate]空对象引用上的 Button.setOnClickListener(android.view.View$OnClickListener)' [重复]
【发布时间】:2016-04-25 11:40:24
【问题描述】:

我遇到了这个错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
                                                                                           at mt.edu.mcast.navigationfragmentsexample.BlankFragment2.onCreateView(BlankFragment2.java:92)

这是 java BlankFragment2 中的代码:

 public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_blank_fragment2,container,false);
    final EditText etName = (EditText) this.getActivity().findViewById(R.id.etName);
    final EditText etSurname = (EditText) this.getActivity().findViewById(R.id.etSurname);
    final EditText etUsername = (EditText) this.getActivity().findViewById(R.id.etUsername);
    final EditText etPassword = (EditText) this.getActivity().findViewById(R.id.etPassword);
    final EditText etEmail = (EditText) this.getActivity().findViewById(R.id.etEmail);
    final EditText etPhone = (EditText) this.getActivity().findViewById(R.id.etPhone);
    final EditText etAge = (EditText) this.getActivity().findViewById(R.id.etAge);
    final Button bRegister = (Button) this.getActivity().findViewById(R.id.bRegister);

此时错误v

   bRegister.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            final String name = etName.getText().toString();
            final String surname = etSurname.getText().toString();
            final String username = etUsername.getText().toString();
            final String password = etPassword.getText().toString();
            final String email = etEmail.getText().toString();
            final int phone = Integer.parseInt(etPhone.getText().toString());
            final int age = Integer.parseInt(etAge.getText().toString());

            Response.Listener<String> responseListener = new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    try {
                        JSONObject jsonResponse = new JSONObject(response);
                        boolean success = jsonResponse.getBoolean("success");
                        if(success){
                            Intent intent = new Intent(getActivity(), BlankFragment1.class);
                            BlankFragment2.this.startActivity(intent);
                        }
                        else {
                            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); //create an error message
                            builder.setMessage("Register Failed")
                                    .setNegativeButton("Retry",null) //click retry to retry registration
                                    .create()
                                    .show();
                        }

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }


                }
            };
            RegisterRequest registerRequest = new RegisterRequest(name, surname,age,username,password,email,phone,responseListener);
            RequestQueue queue = Volley.newRequestQueue(getActivity());
            queue.add(registerRequest);
        }
    });
    return view;
}

有什么帮助吗?

【问题讨论】:

  • 第二段代码在哪里??我的意思是片段生命周期的哪个功能??
  • 可能是你的bRegister不属于fragment_blank_fragment2布局
  • 使用 view.findViewById
  • 您在活动中引用了view (bRegister)。在特定的 view 而不是 activity 上创建对象。您在活动上调用final Button bRegister = (Button) this.getActivity().findViewById(R.id.bRegister);,尝试在片段view 上调用它。 final Button bRegister = (Button) view.findViewById(R.id.bRegister);
  • 是的,谢谢你成功了! :)

标签: java android object


【解决方案1】:

您正在 Activity 中查找视图,但您需要在刚刚为片段充气的视图中查找。对于您的所有findViewById 调用,将this.getActivity() 更改为view,因此它将是view.findViewById

【讨论】:

  • 是的,谢谢你成功了! :)
【解决方案2】:

您应该从 rootView/Inflated 视图而不是从 getActivity() 中找到视图。所以把 this.getActivity() 改成 view。

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                     Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.fragment_blank_fragment2,container,false);
final EditText etName = (EditText) view.findViewById(R.id.etName);
final EditText etSurname = (EditText) view.findViewById(R.id.etSurname);
final EditText etUsername = (EditText) view.findViewById(R.id.etUsername);
final EditText etPassword = (EditText) view.findViewById(R.id.etPassword);
final EditText etEmail = (EditText) view.findViewById(R.id.etEmail);
final EditText etPhone = (EditText) view.findViewById(R.id.etPhone);
final EditText etAge = (EditText) view.findViewById(R.id.etAge);
final Button bRegister = (Button) view.findViewById(R.id.bRegister);
}

【讨论】:

  • 是的,谢谢你成功了! :)
【解决方案3】:

试试这个 -

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_blank_fragment2,container,false);
    final EditText etName = (EditText) view.findViewById(R.id.etName);
    final EditText etSurname = (EditText) view.findViewById(R.id.etSurname);
    final EditText etUsername = (EditText) view.findViewById(R.id.etUsername);
    final EditText etPassword = (EditText) view.findViewById(R.id.etPassword);
    final EditText etEmail = (EditText) view.findViewById(R.id.etEmail);
    final EditText etPhone = (EditText) view.findViewById(R.id.etPhone);
    final EditText etAge = (EditText) view.findViewById(R.id.etAge);
    final Button bRegister = (Button) view.findViewById(R.id.bRegister);

【讨论】:

  • 是的,谢谢你成功了! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-19
  • 2019-11-28
  • 1970-01-01
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多