简体   繁体   English

NullPointerException onCreate-Android微调器

[英]NullPointerException onCreate - android spinner

I'm having trouble with a spinner on my application. 我在应用程序中遇到微调器。

The spinner is supposed to pass the selected Item to an SQlite DB and save data. 旋转器应该将选定的项目传递到SQlite DB并保存数据。

But so far everytime I press my register button it throws the javaNullPointerException error. 但是到目前为止,每次我按下注册按钮时,它都会引发javaNullPointerException错误。

This is my class: 这是我的课:

public class RegisterMember extends Activity implements OnItemSelectedListener{
DbAdapter dbAdapter;
EditText txtName;
EditText txtPassword;
EditText txtPasswordConf;
EditText txtEmail;
EditText txtEmailConf;
EditText txtSchool;
Button btnJoin;
//Button btnRegister;

private String[] state= {"USB","Stanford","Harvard","UCV","USM","Tor vergata", "La Sapienza"};
Spinner spinner_school;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_members_register);
    System.out.println(state.length);
    spinner_school = (Spinner) findViewById(R.id.spinner_school);
    ArrayAdapter<String> adapter_state = new ArrayAdapter<String>(this,
    android.R.layout.simple_spinner_item, state);
    adapter_state
    .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner_school.setAdapter(adapter_state);
    spinner_school.setOnItemSelectedListener(this);
    //btnRegister = (Button) findViewById(R.id.btn_reg);

    dbAdapter = new DbAdapter(this);
    dbAdapter.open();

    btnJoin.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(txtName.getWindowToken(), 0);
            imm.hideSoftInputFromWindow(txtPassword.getWindowToken(), 0);
            imm.hideSoftInputFromWindow(txtPasswordConf.getWindowToken(), 0);
            imm.hideSoftInputFromWindow(txtEmail.getWindowToken(), 0);
            imm.hideSoftInputFromWindow(txtEmailConf.getWindowToken(), 0);
            //imm.hideSoftInputFromWindow(txtSchool.getWindowToken(), 0);
            //imm.hideSoftInputFromWindow(spinner_school.getWindowToken(), 0);
            try {

                String name = txtName.getText().toString();
                String password = txtPassword.getText().toString();
                String passwordconf = txtPasswordConf.getText().toString();
                String email = txtEmail.getText().toString();
                String emailconf = txtEmailConf.getText().toString();
                //String school = txtSchool.getText().toString();
                String school = spinner_school.getSelectedItem().toString();
                long i = dbAdapter.register(name, password, email, school);
                if(i != -1)
                    Toast.makeText(RegisterMember.this, "You have successfully registered",Toast.LENGTH_LONG).show();
                else {
                    if(!passwordconf.equals(password))
                    {
                        Toast.makeText(getApplicationContext(), "Password Does Not Matches", Toast.LENGTH_LONG).show();
                    }
                    if(!emailconf.equals(email))
                    {
                        Toast.makeText(getApplicationContext(), "Email Does Not Matches", Toast.LENGTH_LONG).show();
                    }

                }

            } catch (SQLException e) {
                Toast.makeText(RegisterMember.this, "Some problem occurred",
                        Toast.LENGTH_LONG).show();

            }

        }
    });
}
public void onItemSelected(AdapterView<?> parent, View view, int position,
                           long id) {
    spinner_school.setSelection(position);
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
    // TODO Auto-generated method stub

    }
}

The spinner on my layout: 我版式上的微调器:

<TableRow
        android:id="@+id/tableRow10"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <Spinner
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/spinner_school"
            android:spinnerMode="dropdown" />

    </TableRow>

And the stack trace, it starts on method btnJoin.setOnClickListener(new OnClickListener() 然后是堆栈跟踪,它从btnJoin.setOnClickListener(new OnClickListener()

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.shairlook/com.kkoci.shairlook.RegisterMember}: java.lang.NullPointerException
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2245)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2295)
        at android.app.ActivityThread.access$700(ActivityThread.java:150)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1280)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:175)
        at android.app.ActivityThread.main(ActivityThread.java:5279)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.NullPointerException
        at com.kkoci.shairlook.RegisterMember.onCreate(RegisterMember.java:57)

Any ideas? 有任何想法吗? I've looked through examples but I still can't figure out this 我浏览了一些示例,但仍然无法弄清楚

Thanks in advance! 提前致谢!

EDIT on duplicate 编辑重复

No, duplicate does not solve my question because SQLite is involved here, that a is a simple method issue, thanks. 不,重复并不能解决我的问题,因为此处涉及SQLite,这是一个简单的方法问题,谢谢。

SECOND EDIT 第二编辑

This is how btnJoin.setOnClickListener(new OnClickListener() { method looks like right now, same error: 这是btnJoin.setOnClickListener(new OnClickListener() {方法的样子,现在是同样的错误:

btnJoin.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(txtName.getWindowToken(), 0);
            imm.hideSoftInputFromWindow(txtPassword.getWindowToken(), 0);
            imm.hideSoftInputFromWindow(txtPasswordConf.getWindowToken(), 0);
            imm.hideSoftInputFromWindow(txtEmail.getWindowToken(), 0);
            imm.hideSoftInputFromWindow(txtEmailConf.getWindowToken(), 0);
            //imm.hideSoftInputFromWindow(txtSchool.getWindowToken(), 0);
            //imm.hideSoftInputFromWindow(spinner_school.getWindowToken(), 0);
            try {

                txtName = (EditText) findViewById(R.id.et_user);
                String name = txtName.getText().toString();
                txtPassword = (EditText) findViewById(R.id.et_pw_reg);
                String password = txtPassword.getText().toString();
                txtPasswordConf = (EditText) findViewById(R.id.et_pw_conf);
                String passwordconf = txtPasswordConf.getText().toString();
                txtEmail = (EditText) findViewById(R.id.et_email_reg);
                String email = txtEmail.getText().toString();
                txtEmailConf = (EditText) findViewById(R.id.et_email_conf);
                String emailconf = txtEmailConf.getText().toString();
                //String school = txtSchool.getText().toString();
                spinner_school = (Spinner) findViewById(R.id.spinner_school);
                String school = spinner_school.getSelectedItem().toString();
                long i = dbAdapter.register(name, password, email, school);
                if(i != -1)
                    Toast.makeText(RegisterMember.this, "You have successfully registered",Toast.LENGTH_LONG).show();
                else {
                    if(!passwordconf.equals(password))
                    {
                        Toast.makeText(getApplicationContext(), "Password Does Not Matches", Toast.LENGTH_LONG).show();
                    }
                    if(!emailconf.equals(email))
                    {
                        Toast.makeText(getApplicationContext(), "Email Does Not Matches", Toast.LENGTH_LONG).show();
                    }

                }

            } catch (SQLException e) {
                Toast.makeText(RegisterMember.this, "Some problem occurred",
                        Toast.LENGTH_LONG).show();

            }

        }
    });

I think you are forgetting to "find" and inflate the widgets from your view. 我认为您忘记了从视图中“查找”和膨胀小部件。 Because of that, when you call txtName.getText().toString(); 因此,当您调用txtName.getText()。toString();时, it throws nullPointerException because your txtName is still null. 因为您的txtName仍然为null,所以它将引发nullPointerException。

To solve this, you need to inflate all your widgets in you code before trying to access them. 为了解决这个问题,您需要先在代码中将所有小部件膨胀,然后再尝试访问它们。 So right after you call setContentView(), you do: 因此,在调用setContentView()之后,您将执行以下操作:

txtName = (EditText) findViewById(R.id.the_id_of_the_widget)

for all of your widgets. 用于所有小部件。

EDIT: You are still getting the same error because you still haven't inflated the Button. 编辑:您仍然收到相同的错误,因为您还没有膨胀按钮。

add : 添加:

 btnJoin = (Button) findViewById(...)

before you call the setOnClickListener. 在调用setOnClickListener之前。

You haven't assigned any value to btnJoin . 您尚未为btnJoin分配任何值。 This is causing the exception. 这导致了异常。


Edit 1 - How to fix the problem 编辑1-如何解决问题

To fix this problem, and also other problems that would happen if you click the button, add the following lines to your onCreate() method after setContentView(R.layout.activity_members_register) : 要解决此问题以及单击按钮时可能发生的其他问题,请在setContentView(R.layout.activity_members_register)之后setContentView(R.layout.activity_members_register)添加到onCreate()方法中:

txtName = (EditText)findViewById(R.id.register_member_name);
txtPassword = (EditText)findViewById(R.id.register_member_password);
txtPasswordConf = (EditText)findViewById(R.id.register_member_password_confirm);
txtEmail = (EditText)findViewById(R.id.register_member_email);
txtEmailConf = (EditText)findViewById(R.id.register_member_email_confirm);
txtSchool = (EditText)findViewById(R.id.register_member_school);
btnJoin = (Button)findViewById(R.id.register_member_button_join);

As long as you have something like this on your layout file: 只要您的布局文件中有以下内容:

...
<EditText android:id="@+id/register_member_name" ... />
...
<EditText android:id="@+id/register_member_password" ... />
...
<EditText android:id="@+id/register_member_password_confirm" ... />
...
<EditText android:id="@+id/register_member_email" ... />
...
<EditText android:id="@+id/register_member_email_confirm" ... />
...
<EditText android:id="@+id/register_member_school" ... />
...
<Button android:id="@+id/register_member_button_join" ... />
...

Where register_member_name , register_member_password , register_member_password_confirm , register_member_email , register_member_email_confirm , register_member_school and register_member_button_join are the widgets ids. 其中register_member_nameregister_member_passwordregister_member_password_confirmregister_member_emailregister_member_email_confirmregister_member_schoolregister_member_button_join是小部件ID。 You don't have to use exactly these names. 您不必完全使用这些名称。 As long as you are using the same values in both the layout file and java implementation, everything is going to be fine. 只要您在布局文件和Java实现中使用相同的值,一切都会很好。

you should try this inside your onClick method 您应该在onClick方法中尝试

 spinner_school = (Spinner) findViewById(R.id.spinner_school);
  String school = spinner_school.getSelectedItem().toString();

and Please put findviewByid in all the widget 并请在所有小部件中放入findviewByid

your problem is right there: 您的问题就在那里:

 Caused by: java.lang.NullPointerException
        at com.kkoci.shairlook.RegisterMember.onCreate(RegisterMember.java:57)

Look at line 57 of your RegisterMember.java, you are trying to access some variable thats not being initialized. 查看RegisterMember.java的第57行,您正在尝试访问一些尚未初始化的变量。 Can't see line numbers so I can't help you any further...which is your line 57? 看不到行号,所以我无法进一步帮助您...这是您的第57行?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM