2012-11-30 31 views
2

我正在構建一個具有微調控件的應用程序。微調器從ArrayAdapter中填充,該ArrayAdapter存儲來自設備上數據庫的數據。問題是,每當我啓動應用程序,它立即崩潰,沒有顯示任何東西。我完全相信這是Spinner的問題,因爲在我使用之前,一切都很好。來自NullPointerException的Android微調控件崩潰

的logcat:

11-30 12:56:23.660: E/AndroidRuntime(3945): FATAL EXCEPTION: main 
11-30 12:56:23.660: E/AndroidRuntime(3945): java.lang.NullPointerException 
11-30 12:56:23.660: E/AndroidRuntime(3945):  at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:355) 
11-30 12:56:23.660: E/AndroidRuntime(3945):  at android.widget.ArrayAdapter.getView(ArrayAdapter.java:323) 
11-30 12:56:23.660: E/AndroidRuntime(3945):  at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:192) 
11-30 12:56:23.660: E/AndroidRuntime(3945):  at android.view.View.measure(View.java:8313) 
11-30 12:56:23.660: E/AndroidRuntime(3945):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
11-30 12:56:23.660: E/AndroidRuntime(3945):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017) 
11-30 12:56:23.660: E/AndroidRuntime(3945):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:386) 
11-30 12:56:23.660: E/AndroidRuntime(3945):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:309) 
11-30 12:56:23.660: E/AndroidRuntime(3945):  at android.view.View.measure(View.java:8313) 
11-30 12:56:23.660: E/AndroidRuntime(3945):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
11-30 12:56:23.660: E/AndroidRuntime(3945):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
11-30 12:56:23.660: E/AndroidRuntime(3945):  at android.view.View.measure(View.java:8313) 
11-30 12:56:23.660: E/AndroidRuntime(3945):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
11-30 12:56:23.660: E/AndroidRuntime(3945):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
11-30 12:56:23.660: E/AndroidRuntime(3945):  at android.view.View.measure(View.java:8313) 
11-30 12:56:23.660: E/AndroidRuntime(3945):  at android.view.ViewRoot.performTraversals(ViewRoot.java:839) 
11-30 12:56:23.660: E/AndroidRuntime(3945):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1859) 
11-30 12:56:23.660: E/AndroidRuntime(3945):  at android.os.Handler.dispatchMessage(Handler.java:99) 
11-30 12:56:23.660: E/AndroidRuntime(3945):  at android.os.Looper.loop(Looper.java:130) 
11-30 12:56:23.660: E/AndroidRuntime(3945):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
11-30 12:56:23.660: E/AndroidRuntime(3945):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-30 12:56:23.660: E/AndroidRuntime(3945):  at java.lang.reflect.Method.invoke(Method.java:507) 
11-30 12:56:23.660: E/AndroidRuntime(3945):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
11-30 12:56:23.660: E/AndroidRuntime(3945):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
11-30 12:56:23.660: E/AndroidRuntime(3945):  at dalvik.system.NativeStart.main(Native Method) 

我的代碼(活動持有微調):

public class UserActivity extends Activity{ 

    private Spinner profiles; 

    private String[] arrayspinner = new String[100]; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 

     this.setContentView(R.layout.profiles); 

     Button Submit = (Button) findViewById(R.id.SubmitProfile); 

     final EditText profileName = (EditText) findViewById(R.id.ProfileName); 

     profileName.setText(""); 

     this.profiles = (Spinner) findViewById(R.id.spinner1); 


     SetSql sqler = new SetSql(UserActivity.this); 
     sqler.open(); 
     arrayspinner = sqler.getProfiles(); 
     sqler.close(); 

     if(arrayspinner==null){ 
      arrayspinner[0] = "No Profiles, Please Create One"; 
     } 

     @SuppressWarnings({ "rawtypes", "unchecked" }) 
     ArrayAdapter array = new ArrayAdapter(this, android.R.layout.simple_spinner_item, arrayspinner); 
     profiles.setAdapter(array); 

     //I am using the post method to make sure that this spinner wont run when the activity is started 
     profiles.post(new Runnable(){ 
      public void run(){ 
       profiles.setOnItemSelectedListener(new OnItemSelectedListener() { 

        @Override 
        public void onItemSelected(AdapterView<?> arg0, View arg1, 
          int arg2, long arg3) { 
         // TODO Auto-generated method stub 
          if(!arrayspinner[arg2].equals("No Profiles, Please Create One")){ 
           String selected = arrayspinner[arg2]; 
           Intent intent = new Intent(UserActivity.this, DPAActivity.class); 
           intent.putExtra("username", selected); 
           startActivity(intent); 
          } 
        } 

        @Override 
        public void onNothingSelected(AdapterView<?> arg0) { 
         // TODO Auto-generated method stub 

        } 
       }); 
      } 

     }); 

     //the button listener 
     Submit.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       String name = profileName.getText().toString(); 
       if(name.equals("")){ 
        profileName.setHint("Please Enter Some Data Here"); 
       }else{ 
        SetSql sqlobj = new SetSql(UserActivity.this); 
        //open a DB connection 
        sqlobj.open(); 
        String[] profiledata2 = new String[100]; 
        profiledata2 = sqlobj.getProfiles(); 
        //setup a boolean to check if the profile name matches with one from the database 
        boolean isSame = false; 
        //run the check 
        if(profiledata2!=null){ 
         for(int x=0; x<profiledata2.length; x++){ 
          if(profiledata2[x].equals(name)){ 
           isSame=true; 
          } 
         } 
        } 
        //use the isSame variable! 
        if(isSame){ 
         profileName.setHint("This profile name is already in use!"); 
         //close connection 
         sqlobj.close(); 
        }else{ 
         //insert profile into DB 
         sqlobj.createProfile(name); 
         //close connection 
         sqlobj.close(); 

         //setup intent and move to the next activity 
         Intent intent = new Intent(UserActivity.this, DPAActivity.class); 
         intent.putExtra("username", name); 
         startActivity(intent); 
        } 
       } 
      } 
     }); 
    } 
} 

正如你看到的,我的代碼也有一個選項可以將數據在陣列中的情況下,是空的,所以沒有null(我希望)。

我的XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" > 

<TextView 
    android:id="@+id/textView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Select your profile, Or create a new one!" 
    android:textSize="25dp" /> 

<Spinner 
    android:id="@+id/spinner1" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" /> 

<TextView 
    android:id="@+id/textView2" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="30dp" 
    android:text="New profile:" 
    android:textSize="20dp" /> 

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

    <EditText 
     android:id="@+id/ProfileName" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:ems="10" 
     android:hint="Profile name..." > 

     <requestFocus /> 
    </EditText> 

    <Button 
     android:id="@+id/SubmitProfile" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:text="Create!" /> 

</LinearLayout> 

</LinearLayout> 

編輯

所以我確信,我的數組不爲空像你們建議,仍以同樣的錯誤而崩潰。任何幫助?

+0

我想你可能會遺漏堆棧跟蹤中的一個部分。有更多的紅色文字嗎? – PearsonArtPhoto

+0

嘗試使用此 ArrayAdapter array = new ArrayAdapter(this,android.R.layout.simple_list_item_1,arrayspinner); 而不是此ArrayAdapter array = new ArrayAdapter(this,android.R.layout.simple_spinner_item,arrayspinner);並檢查 –

+0

@ arielschon12請檢查數據庫值。在這行之前arrayspinner = sqler.getProfiles();在你的代碼中,你只需調用sqler.getProfiles()方法並檢查數據庫數據。 – Hemant

回答

0

我敢肯定這是崩潰行:

if(arrayspinner==null){ 
     arrayspinner[0] = "No Profiles, Please Create One"; 
    } 

從本質上講,你這是它爲null,或者沒有指向任何東西。只需在此處設置,然後刪除之前的聲明。

if(arrayspinner==null){ 
     arrayspinner = new String[100]; 
     arrayspinner[0] = "No Profiles, Please Create One"; 
    } 
+0

這是,它仍然崩潰與此錯誤: 11-30 18:41:10.661:E/AndroidRuntime(5279):致命異常:主 11-30 18:41:10.661:E/AndroidRuntime(5279):java .lang.NullPointerException 11-30 18:41:10.661:E/AndroidRuntime(5279):\t at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:355) – arielschon12

+0

這是和以前一樣的錯誤 – arielschon12

+0

我認爲這應該工作。再次檢查它 –

0

android.R.layout.simple_spinner_item在下面的代碼是佈局ID。

ArrayAdapter array = new ArrayAdapter(this, android.R.layout.simple_spinner_item, arrayspinner); 
    profiles.setAdapter(array); 

這裏的構造函數是公開的ArrayAdapter (Context context, int textViewResourceId, T[] objects)。使用正確的構造函數。請參閱this

private String[] arrayspinner = new String[100]; 

它只是空的,所以它仍然是:

+0

不知道我得到了它... – arielschon12

0

什麼是SetSql()?

你應該調試,並找出哪些是行空:

ArrayAdapter陣列=新ArrayAdapter(這一點,android.R.layout.simple_spinner_item,arrayspinner);

可能是「arrayspinner」

如果你想從數據庫中查詢,您必須提供選項填充微調槽一個CursorAdapter,而不是一個ArrayAdapter。

+0

SetSql是我用來與我的數據庫進行通信的類。我看不出如何arraypinner爲空,因爲我確信它不是,所以這是非常奇怪的。 – arielschon12

+0

你在sqler.getProfiles()中使用不同的線程。方法?? – gaugeinvariante

+0

如果是這樣的話,可能在getProfiles方法返回數據之前調用close()。 – gaugeinvariante

0

您的arraySpinner包含null-Data,因爲只有arrayspinner [0]包含數據,但arraypinner [1]到arrayspinner [99]包含null數據。您必須創建一個所有數據長度的數組,然後將該數組傳遞給arrayadapter。是這樣的:

int count = 0; 
for(int i = 0; i < arrayspinner.length; i++) 
{ 
    if(arrayspinner[i] != null) 
    { 
     count++; 
    } 
} 
String[] replaceArray = new String[count]; 
int counter = 0; 
for(int k = 0; k < arrayspinner.length; k++) 
{ 
    if(arrayspinner[k] != null) 
    { 
     replaceArray[counter++] = arrayspinner[k]; 
    } 
} 
ArrayAdapter<String> array = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, replaceArray); 

,或者你可以設置arrayspinner [1]到arrayspinner [99]爲空字符串 「」;這將給你在微調器99空行;

相關問題