8

Ich erstelle eine Anwendung mit Vorzugsaktivität, wo die Listpreference Einträge problematisch zugeordnet sind. Diese Anwendung funktioniert auf meinem Emulator in Ordnung, aber während ich in der mobilen meine Anwendung zu testen zeigt es Fehler wie dieseNullPointerException bei android.widget.ArrayAdapter.createViewFromResource

FATAL EXCEPTION: main 
java.lang.NullPointerException 
at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:394) 
at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362) 
at android.widget.AbsListView.obtainView(AbsListView.java:2033) 

Dieses Problem entsteht, wenn ich das listpreference in meinem Handy klicken. hier ist mein Code

prference.xml

<PreferenceScreen 
     xmlns:android="http://schemas.android.com/apk/res/android"> 
    <PreferenceCategory 
      android:title="@string/settings">    
     <ListPreference 
       android:key="@string/resolution" 
       android:title="@string/imageres" 
       android:summary="@string/summaryres" 
       android:dialogTitle="@string/resFormat" 
       /> 
    </PreferenceCategory> 
</PreferenceScreen> 

settings.java

package com.example; 

import android.database.Cursor; 
import android.os.Bundle; 
import android.preference.ListPreference; 
import android.preference.PreferenceActivity; 

public class Settings extends PreferenceActivity { 
    private SQLiteoperations SQLiteAdapter; 
    DTO get; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     get = (DTO) getIntent().getExtras().get("obj"); 
     SQLiteAdapter = new SQLiteoperations(this); 
     SQLiteAdapter.openToWrite(); 
     addPreferencesFromResource(R.xml.preferences); 
     ListPreference pref = (ListPreference) findPreference("resolution"); 
     pref.setEntries(getEntries()); 
     pref.setEntryValues(getEntries()); 
     System.out.println("after set entries"); 
     System.out.println(get.getDefaultvalues()); 
     pref.setDefaultValue(get.getDefaultvalues()); 

    } 
    private CharSequence[] getEntries() { 
     Cursor cursor = SQLiteAdapter.queueAll(); 
     int num = cursor.getCount(); 
     String[] size = new String[num]; 
     System.out.println(cursor.getCount()); 
     if (cursor.moveToFirst()){ 
      int i=0; 
       do{ 
        size[i]=new String(cursor.getString(1)+"X"+cursor.getString(2)); 
        System.out.println(cursor.getString(1)+"X"+cursor.getString(2)); 
       }while(cursor.moveToNext()); 
      } 
      cursor.close(); 

     return size; 
    } 

} 

camerademo.java

package com.example; 

import java.io.ByteArrayInputStream; 
import java.io.InputStream; 
import java.sql.Connection; 
import java.sql.ResultSet; 
import java.sql.Statement; 
import java.util.Iterator; 
import java.util.List; 

import oracle.jdbc.OracleResultSet; 
import oracle.sql.BLOB; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.Dialog; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.hardware.Camera; 
import android.hardware.Camera.Parameters; 
import android.hardware.Camera.PictureCallback; 
import android.hardware.Camera.ShutterCallback; 
import android.hardware.Camera.Size; 
import android.os.Bundle; 
import android.preference.PreferenceManager; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.FrameLayout; 
import android.widget.LinearLayout; 
import android.widget.TableRow.LayoutParams; 
import android.widget.TextView; 

public class CameraDemo extends Activity { 
    private final int DIALOG_LICENSE=5; 
    private final int MENU_SETTINGS=2; 
    private SharedPreferences settings; 
    private static final String TAG = "CameraDemo"; 
    Camera camera; 
    Preview preview; 
    Button buttonClick,buttonSave,buttonBack; 
    byte[] image; 
    private static SQLiteoperations placeData; 
    final DTO set = new DTO(); 
    String defsize; 
    // Called when the activity is first created. 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     placeData = new SQLiteoperations(this); 
     placeData.openToWrite(); 

     preview = new Preview(this); 
     ((FrameLayout) findViewById(R.id.preview)).addView(preview); 
     buttonSave = (Button) findViewById(R.id.Save); 
     buttonBack = (Button) findViewById(R.id.back); 
     buttonBack.setVisibility(View.INVISIBLE); 
     buttonSave.setVisibility(View.INVISIBLE); 
     buttonClick = (Button) findViewById(R.id.buttonClick); 
     settings = PreferenceManager.getDefaultSharedPreferences(this); 
     SharedPreferences licensPref = getSharedPreferences("PREFS", 0); 
     boolean licenseShown = licensPref.getBoolean("LicenseShown", false); 
     if(!licenseShown) 
      showDialog(DIALOG_LICENSE); 

     buttonClick.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       preview.camera.takePicture(shutterCallback, rawCallback, 
         jpegCallback); 
       buttonClick.setVisibility(View.INVISIBLE); 
       buttonSave.setVisibility(View.VISIBLE); 
       buttonBack.setVisibility(View.VISIBLE); 
      } 
     }); 
     buttonBack.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       back(); 
      } 
     }); 
     buttonSave.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       save(); 
       } 
     }); 

     Log.d(TAG, "onCreate'd"); 
    } 

    ShutterCallback shutterCallback = new ShutterCallback() { 
     public void onShutter() { 
      Log.d(TAG, "onShutter'd"); 
     } 
    }; 

    // Handles data for raw picture 
    PictureCallback rawCallback = new PictureCallback() { 
     public void onPictureTaken(byte[] data, Camera camera) { 
      Log.d(TAG, "onPictureTaken - raw"); 
     } 
    }; 

    // Handles data for jpeg picture 
    PictureCallback jpegCallback = new PictureCallback() { 
     public void onPictureTaken(byte[] data, Camera camera) { 
      image = data; 
     } 
    }; 

    @Override 
    protected void onPrepareDialog(int id, Dialog dialog) {  
     super.onPrepareDialog(id, dialog); 
     } 
    @Override 
    protected Dialog onCreateDialog(int id) { 
     switch(id){ 
     case DIALOG_LICENSE: 
      return new AlertDialog.Builder(this) 
      .setTitle(R.string.welcome) 
      .setMessage(R.string.welcome_text) 
      .setPositiveButton(R.string.accept, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int whichButton) { 
        settings = getSharedPreferences("PREFS", 0); 
        Parameters parameters = preview.camera.getParameters(); 
        Size defaultsize = parameters.getPictureSize(); 
        defsize = (new String(defaultsize.width+"X"+defaultsize.height)); 
        List<Camera.Size> size = parameters.getSupportedPictureSizes(); 
        int num = size.size(); 
        String[] sizeArray = new String[num]; 
        int i=0; 
        Iterator<Size> si = size.iterator(); 
        while (si.hasNext()) { 
         Camera.Size sizeObj = (Size) si.next(); 
         sizeArray[i]=new String(sizeObj.width+ "X" +sizeObj.height); 
         Log.e("size in licence dialog", sizeObj.height+"x"+sizeObj.width); 
         i++; 
         placeData.insert(String.valueOf(sizeObj.width),String.valueOf(sizeObj.height)); 
        } 
        SharedPreferences.Editor editor = settings.edit(); 
        editor.putBoolean("LicenseShown", true); 
        editor.commit(); 
       } 
      }) 
      .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int whichButton) { 
        finish(); 
       }    
      }) 
      .setCancelable(false) 
      .create(); 
     } 
     return null; 
    } 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuItem mi; 
     mi = menu.add(0, MENU_SETTINGS, 0, R.string.settings); 
     mi.setIcon(android.R.drawable.ic_menu_preferences); 
     return super.onCreateOptionsMenu(menu); 
    } 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case MENU_SETTINGS: 
      set.setDefaultvalues(defsize); 
      Intent intent = new Intent(getApplicationContext(), Settings.class); 
      intent.putExtra("obj", set); 
      startActivity(intent); 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
public void back(){ 
    preview.camera.startPreview(); 
    buttonBack.setVisibility(View.INVISIBLE); 
    buttonSave.setVisibility(View.INVISIBLE); 
    buttonClick.setVisibility(View.VISIBLE); 
} 
@Override 
public void onDestroy(){ 
    super.onDestroy(); 
    if(preview.camera != null){ 
     preview.camera.stopPreview(); 
     preview.camera = null; 
    } 
} 
public void save(){ 
      back(); 
      } 
} 

jemand bitte sagen, wo ich falsch bin?

+0

Sie bitte mehr stacktrace hinzufügen ..... meine ich die Linie, wo Sie Nullpointer bekommen Fehler –

+0

Dieses Protokoll habe ich in Mobile mit Catlog App. Ich kann nicht mehr Informationen bekommen. – ponraj

+0

@ponraj, verbinden Sie Ihr Gerät mit dem System und Sie können Protokolle in Logcat von Eclipse anzeigen, mehr Stack-Trace wird helfen, Problem zu erkennen –

Antwort

11

Bitte sagen Sie mir, wo ich falsch liege?

Das, was Sie in Ihrem Code falsch gemacht haben ist die Art und Weise Sie die CharSequence Array in der getEntries Methode initialisieren. Ihr Code:

if (cursor.moveToFirst()){ 
    int i=0; 
    do{ 
     size[i]=new String(cursor.getString(1)+"X"+cursor.getString(2)); 
     System.out.println(cursor.getString(1)+"X"+cursor.getString(2)); 
    }while(cursor.moveToNext()); 
} 

Sie initialisieren die size Array mit der Größe des Cursor und Sie dann oben auf der while-Schleife gehen. Das Problem ist, dass Ihre while-Schleife nur den Wert für setzt, da Sie den Wert i in dieser Schleife nicht erhöhen. Aus diesem Grund hat Ihr size Array an allen anderen Positionen nur einen Wert für die Position 0 und null. Dies wird die ArrayAdapter werfen, dass NullPointerException.

Das wäre richtig Schleife:

if (cursor.moveToFirst()){ 
    int i=0; 
    do{ 
     size[i]=new String(cursor.getString(1)+"X"+cursor.getString(2)); 
     System.out.println(cursor.getString(1)+"X"+cursor.getString(2)); 
     i++; 
    }while(cursor.moveToNext()); 
} 

Die vollständige getEntries Methode wäre:

private CharSequence[] getEntries() { 
    Cursor cursor = SQLiteAdapter.queueAll(); 
    int num = cursor.getCount();   
    String[] size = new String[num]; 
    System.out.println(cursor.getCount()); 
    if (cursor.moveToFirst()) {   
     int i = 0; 
     do { 
      size[i] = new String(cursor.getString(1) + "X" 
        + cursor.getString(2));    
      i++; 
     } while (cursor.moveToNext()); 
    } 
    cursor.close(); 
    return size; 
} 
+0

Vielen Dank, ich werde es versuchen. – ponraj

+0

danke es funktioniert gut – ponraj

+2

Warum erstellen Sie String-Array zweimal? Sie können einfach 'size = new String [cursor.getCount()] verwenden;' – Jin35

Verwandte Themen