Domanda

I am currently trying to add items from a SQLite Database and put them into a spinner. The following shows code for database and main activity, if there is anything else that needs added, please say so. I also showed the error occurring.

Error:

02-24 14:01:59.222  23660-23660/com.example.bank_app E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.NullPointerException
        at com.example.bank_app.main_menu_activity.onOptionsItemSelected(main_menu_activity.java:149)
        at android.app.Activity.onMenuItemSelected(Activity.java:2640)
        at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:1171)
        at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735)
        at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
        at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874)
        at com.android.internal.view.menu.ActionMenuView.invokeItem(ActionMenuView.java:630)
        at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:200)
        at android.view.View.performClick(View.java:4489)
        at android.view.View$PerformClick.run(View.java:18803)
        at android.os.Handler.handleCallback(Handler.java:730)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5455)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:525)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
        at dalvik.system.NativeStart.main(Native Method)

Main Activity Code:

List<String> SpinnerArray = db.getAccountsNames();

// Outputs items in SpinnerArray to logcat
/*for (int j = 0; j < SpinnerArray.size(); j++)
{
    Log.d("Output", j + ": " + SpinnerArray.get(j).toString());
}*/

ArrayAdapter spinnerAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, SpinnerArray);  
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
Spinner accountSpinner = (Spinner)findViewById(R.id.spinner1);
accountSpinner.setAdapter(spinnerAdapter);

Database Handler:

// Getting All Account Names return ArrayList<Account)
public ArrayList<String> getAccountsNames()
{
    ArrayList<String> accountNameList = new ArrayList<String>();

    String selectQry = "SELECT * FROM " + Table_Account;
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(selectQry, null);

    // looping through all rows and adding to list
    if (cursor.moveToFirst())
    {
        do
        {
            //Account account = new Account();
            //account.setAccountName(cursor.getString(cursor.getColumnIndex(KEY_NAME)));

            // Add to account list
            accountNameList.add(cursor.getString(cursor.getColumnIndex(KEY_NAME)));
        }while(cursor.moveToNext());
    }
    db.close();
    return accountNameList;
}

I know the SpinnerArray has information in it, because the items get printed to logcat, however my error occurs somewhere in following code:

ArrayAdapter spinnerAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, SpinnerArray);  
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
Spinner accountSpinner = (Spinner)findViewById(R.id.spinner1);
accountSpinner.setAdapter(spinnerAdapter);

Thanks for your help!

XML - (This is xml for a custom alert dialog)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout_root"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:padding="10dp" >

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >


    <TextView
        android:id="@+id/titleTextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="Select account to delete: "
        android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >

    <Spinner
        android:id="@+id/spinner1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:layout_weight="1" />

</LinearLayout>

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="10dp" >

    <Button
        android:id="@+id/btnDelete"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Delete" />

    <Button
        android:id="@+id/btnCancel"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Cancel" />

</LinearLayout>

</LinearLayout>
È stato utile?

Soluzione

The spinner with id spinner1 as you say is in a custom alert dialog. But findViewById() in an activity tries to find it from the activity view hierarchy. Your dialogs are not part of the activity hierarchy. You must search the dialog hierarchy for that.

For example, change

Spinner accountSpinner = (Spinner)findViewById(R.id.spinner1);

to

Spinner accountSpinner = (Spinner)dialog.findViewById(R.id.spinner1);

where dialog is your dialog that is showing.

(You don't really show how you're inflating the dialog so there's possibly a better way for that.)

Altri suggerimenti

Try this

ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, SpinnerArray);                    
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

Spinner accountSpinner = (Spinner) findViewById(R.id.spinner1);
accountSpinner.setAdapter(dataAdapter);       

Answer to problem is as shown thanks to help of laalto!

        case R.id.action_delete_account:
        {
            final Dialog dialog = new Dialog(this);
            dialog.setContentView(R.layout.delete_account);
            dialog.setTitle("Delete Account");
            dialog.setCancelable(true);

            spn = (Spinner)dialog.findViewById(R.id.spinner1);
            List<String> SpinnerArray = db.getAccountsNames();
            /*for (int j = 0; j < SpinnerArray.size(); j++)
            {
                Log.d("Output", j + ": " + SpinnerArray.get(j).toString());
            }*/

            ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,  android.R.layout.simple_spinner_item, SpinnerArray);
            dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            //Log.d("Output", Integer.toString(dataAdapter.getCount()));
            spn.setAdapter(dataAdapter);

            //TextView title = (TextView) dialog.findViewById(R.id.titleTextView);
            btnDelete = (Button) dialog.findViewById(R.id.btnDelete);
            btnCancel = (Button) dialog.findViewById(R.id.btnCancel);

            btnDelete.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View view)
                {
                    displayListView();
                }
            });
            btnCancel.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View view)
                {
                    dialog.cancel();
                }
            });

            dialog.show();
        }
        default:
        {
            return super.onOptionsItemSelected(item);
        }
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top