2014-02-19 1 views
0

В моей деятельности пользователь может сделать снимок, а затем установить захват изображения в gridview.And i gridview у вас есть изображение (захватить изображение) и 2 редактировать текст. Теперь я хочу для сохранения информации в 2 редактировать текст с общим файлом предпочтений в onPause(); и вернуть значение из файла общих предпочтений в edittext в onResume.Невозможно приостановить действие java.lang.NullPointerException

это мой код

public class MainActivity extends Activity { 

private Button btPhoto, btSave; 
private GridView gridview; 
private File imgFile; 
private String path; 
private ArrayList<File> List_File; 
private static final int imageCode = 100; 
private Context context; 
SharedPreferences preference; 
SharedPreferences.Editor editor; 




@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    btPhoto = (Button) findViewById(R.id.btPhoto); 
    btSave = (Button) findViewById(R.id.bt_save); 
    gridview = (GridView) findViewById(R.id.gridview); 

    path = "/TongFolder/"; 
    context = this; 
    List_File = new ArrayList<File>(); 
    File imgDir = new File(Environment.getExternalStorageDirectory()+path); 
    imgDir.mkdirs(); 
    boolean check = imgDir.isDirectory(); 
    if(check == true){ 
    btPhoto.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      capture(); 

     } 
    }); 
    }else{ 
     System.out.println("not create"); 
    } 
} 


public void capture(){ 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    imgFile = new File(Environment.getExternalStorageDirectory()+path, 
      "img_"+System.currentTimeMillis()+".jpg"); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(imgFile)); 
    startActivityForResult(intent, imageCode); 
} 

protected void onActivityResult(int requestCode, int resultCode, Intent data){ 

    if(requestCode == imageCode && resultCode == RESULT_OK){ 

     //add path to arrayList 
     List_File.add(imgFile); 
     for (File file : List_File) { 
      String showPath = file.getPath(); 
      System.out.println(showPath); 
     } 

     gridview.setAdapter(new gridViewAdapter(context, List_File)); 


    } 

} 

public void onPause(){ 

    super.onPause(); 
     //initialize 
    preference = getPreferences(Context.MODE_PRIVATE); 
    EditText edit_num = new EditText(getApplicationContext()); 
    EditText edit_info = new EditText(getApplicationContext()); 

    //count child of gridview 
    int size = gridview.getChildCount(); 
    System.out.println("size_"+size); 
    if(size == 0){ 

    }else{ 
     ViewGroup child_grid = (ViewGroup) gridview.getChildAt(size); 
     //get editText in child_gridview 
     edit_num = (EditText) child_grid.findViewById(R.id.editText_num); 
     edit_info = (EditText) child_grid.findViewById(R.id.editText_info); 

     String num = edit_num.getText().toString(); 
     String info = edit_info.getText().toString(); 

     //save data to sharedpreference file 
     editor = preference.edit(); 
     editor.putString("number_recipe_"+size, num); 
     editor.putString("info_recipe_"+size, info); 
     editor.commit(); 

     System.out.println("data in position "+size+" is "+num+"and"+info); 
    } 
} 

public void onResume(){ 
    super.onResume(); 

    //initialize 
    EditText edit_num = new EditText(getApplicationContext()); 
    EditText edit_info = new EditText(getApplicationContext()); 

    //count child in gridview 
    int size = gridview.getChildCount(); 
    System.out.println("onResume_child in gridview have "+size); 

    //for loop to put data in shared preference to edittext(2) 
    for(int i = 0; i<size; i++){ 
     ViewGroup child_grid = (ViewGroup) gridview.getChildAt(i); 
     //findviewById edittext in childAt (i) 
     edit_num = (EditText) child_grid.findViewById(R.id.editText_num); 
     edit_info = (EditText) child_grid.findViewById(R.id.editText_info); 
     //get value from shared preference file and set text to editText 
     String number = preference.getString("number_recipe_"+i, null); 
     String information = preference.getString("info_recipe_"+i, null); 

     edit_num.setText(number); 
     edit_info.setText(information); 
    } 

} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

}

и это мой LogCat

02-19 21:11:51.136: E/AndroidRuntime(15891): FATAL EXCEPTION: main 
02-19 21:11:51.136: E/AndroidRuntime(15891): java.lang.RuntimeException: Unable to pause activity {com.example.imagecapture/com.example.imagecapture.MainActivity}: java.lang.NullPointerException 
02-19 21:11:51.136: E/AndroidRuntime(15891): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2902) 
02-19 21:11:51.136: E/AndroidRuntime(15891): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2858) 
02-19 21:11:51.136: E/AndroidRuntime(15891): at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2836) 
02-19 21:11:51.136: E/AndroidRuntime(15891): at android.app.ActivityThread.access$900(ActivityThread.java:140) 
02-19 21:11:51.136: E/AndroidRuntime(15891): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1248) 
02-19 21:11:51.136: E/AndroidRuntime(15891): at android.os.Handler.dispatchMessage(Handler.java:99) 
02-19 21:11:51.136: E/AndroidRuntime(15891): at android.os.Looper.loop(Looper.java:137) 
02-19 21:11:51.136: E/AndroidRuntime(15891): at android.app.ActivityThread.main(ActivityThread.java:4921) 
02-19 21:11:51.136: E/AndroidRuntime(15891): at java.lang.reflect.Method.invokeNative(Native Method) 
02-19 21:11:51.136: E/AndroidRuntime(15891): at java.lang.reflect.Method.invoke(Method.java:511) 
02-19 21:11:51.136: E/AndroidRuntime(15891): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) 
02-19 21:11:51.136: E/AndroidRuntime(15891): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 
02-19 21:11:51.136: E/AndroidRuntime(15891): at dalvik.system.NativeStart.main(Native Method) 
02-19 21:11:51.136: E/AndroidRuntime(15891): Caused by: java.lang.NullPointerException 
02-19 21:11:51.136: E/AndroidRuntime(15891): at com.example.imagecapture.MainActivity.onPause(MainActivity.java:123) 
02-19 21:11:51.136: E/AndroidRuntime(15891): at android.app.Activity.performPause(Activity.java:5304) 
02-19 21:11:51.136: E/AndroidRuntime(15891): at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1240) 
02-19 21:11:51.136: E/AndroidRuntime(15891): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2889) 
02-19 21:11:51.136: E/AndroidRuntime(15891): ... 12 more 

Спасибо

+1

можете ли вы указать, какая строка 123 в вашей основной деятельности? –

ответ

2

Я вижу одну возможную ошибку в коде, которые могут привести Исключение нулевого указателя.

В приведенном ниже коде getChildCount возвращает количество дочерних элементов в группе ViewGroup, но не самый высокий показатель . Вы должны использовать размер - 1, чтобы получить последнего ребенка!

Неправильный

int size = gridview.getChildCount(); 
ViewGroup child_grid = (ViewGroup) gridview.getChildAt(size); 

Правильная

int size = gridview.getChildCount(); 
ViewGroup child_grid = (ViewGroup) gridview.getChildAt(size - 1); 
+0

Спасибо. хорошо объясните. – user3001046

+0

Но у меня есть вопрос. Почему int size = gridview.getChildCount(); == 0 In onResume – user3001046

+0

Это зависит от того, что вы добавили в GridView. –

0

Хотя это не будет, как я решил эту ошибку. Да я столкнулся эту ошибку несколько раз, и в конце концов узнал, что

«его основной причиной является то, что некоторые компоненты конкретной деятельности имеет нулевое значение»

не обязательно, что компилятор указывает на. Итак, просто проверьте значения нулевого указателя