8

listpreference 항목이 문제가있는 환경 설정 활동으로 응용 프로그램을 만들고 있습니다. 이 응용 프로그램은 내 에뮬레이터에서 잘 작동하지만 난 모바일에서 내 응용 프로그램을 테스트하는 동안 내가 내 모바일에이 listpreference을 클릭하면이 문제가 발생이android.widget.ArrayAdapter.createViewFromResource의 NullPointerException

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) 

같은 오류를 보여줍니다. 여기이

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

누구나 알려주세요 내 코드?

+0

이 더 많은 스택 트레이스를 추가하십시오 수 있습니다 ..... 난 당신이 nullpointer을 받고 선을 의미 오류 –

+0

이 로그는 catlog 앱을 사용하여 모바일에 있습니다. 나는 그로부터 더 많은 정보를 얻을 수 없다. – ponraj

+0

@ponraj, 장치에 시스템을 연결하면 uclipse의 logcat에서 로그를 볼 수 있습니다. 더 많은 스택 추적이 문제가있는 부분을 감지하는 데 도움이됩니다 –

답변

11

누구나 내가 옳지 않은 사람이 누구인지 알려주십시오.

코드에서 잘못 수행 한 것은 getEntries 방법으로 CharSequence 배열을 초기화하는 방법입니다. 코드 :

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의 크기로 size 배열을 초기화 한 다음 위의 while 루프에 이동합니다. 문제는 while 루프가 i = 0의 값만 설정한다는 것입니다. 해당 루프에서 i의 값을 증가시키지 마십시오. 이러한 이유로 귀하의 size 배열은 다른 모든 위치에서 0null 위치에 대한 값만 갖게됩니다. 이것은 ArrayAdapterNullPointerException으로 던질 것입니다.

올바른 루프는 다음과 같습니다

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

전체 getEntries 방법은 다음과 같습니다

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

감사합니다. – ponraj

+0

잘 작동 해 주셔서 감사합니다. – ponraj

+2

왜 문자열 배열을 두 번 만드 시나요? 'size = new String [cursor.getCount()];' – Jin35