【问题标题】:Error while trying to put items into a spinner - Android尝试将项目放入微调器时出错 - Android
【发布时间】:2014-03-26 15:28:15
【问题描述】:

我目前正在尝试从 SQLite 数据库添加项目并将它们放入微调器中。下面是数据库和主要活动的代码,如果还有什么需要补充的,请说出来。我还显示了发生的错误。

错误:

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)

主要活动代码:

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);

数据库处理程序:

// 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;
}

我知道 SpinnerArray 中有信息,因为这些项目会打印到 logcat,但是我的错误发生在以下代码中的某处:

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);

感谢您的帮助!

XML -(这是自定义警报对话框的 xml)

<?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>

【问题讨论】:

  • 你的错误在main_menu_activity.java:149一行
  • 你能分享你在onOptionsItemSelected()回调你的活动中的代码吗?代码在第 149 行崩溃。检查它与您的微调器无关,而是与选项菜单相关。
  • 第 149 行是 accountSpinner.setAdapter(spinnerAdapter);

标签: android sqlite error-handling spinner android-spinner


【解决方案1】:

如您所说,ID 为 spinner1 的微调器位于自定义警报对话框中。但是活动中的findViewById() 试图从活动视图层次结构中找到它。您的对话框不是活动层次结构的一部分。您必须搜索对话框层次结构。

例如,改变

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

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

dialog 是您正在显示的对话框。

(你并没有真正展示你是如何膨胀对话框的,所以可能有更好的方法。)

【讨论】:

  • 谢谢!解决了我的问题!
【解决方案2】:

试试这个

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);       

【讨论】:

  • 仍然无法正常工作,我在 accountSpinner.setAdapter(dataAdapter); 处出现错误部分代码。
  • 您确定微调器的 id 为 'spinner1' 吗?我问是因为我犯了这个错误,导致 NullPointer
  • 是的,当我将代码更改为您的代码时,上面的错误与我收到的错误相同。
  • 02-24 14:38:39.610 24953-24953/com.example.bank_app E/AndroidRuntime: 致命异常:com.example.bank_app.main_menu_activity.onOptionsItemSelected(main_menu_activity) 处的 main java.lang.NullPointerException .java:155) 在 com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:1171) 的 android.app.Activity.onMenuItemSelected(Activity.java:2640)
【解决方案3】:

感谢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);
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    相关资源
    最近更新 更多